这个题的加密算法第一眼看上去很复杂,试试从字符串找特征
猜测:更换后的BASE64加密,与URL进行交互
main -> 401AC2 -> WSASocket(TCP连接) -> 连接成功调用4015B7,否则return 1(报错)
BOOL CreatePipe(PHANDLE hReadPipe, // 指向读句柄的指针
PHANDLE hWritePipe, // 指向写句柄的指针
LPSECURITY_ATTRIBUTES lpPipeAttributes, // 指向安全属性的指针
DWORD nSize // 管道大小
);
GetCurrentProcess:获取当前进程句柄
BOOL DuplicateHandle(
HANDLE hSourceProcessHandle,
HANDLE hSourceHandle,
HANDLE hTargetProcessHandle,
LPHANDLE lpTargetHandle,
DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwOptions
);
第一个参数是当前的源进程句柄,第二参数是当前的资源句柄,第三个是目标进程的句柄,第四个是你要得到的目的句柄,这里应该是一个变量,使用指针,DuplicateHandle函数会将得到的句柄设置到这个参数上,第五个是访问的方式,第六个参数是得到的句柄能不能被得到的其的进程的子进程继承。如果第七个参数是DUPLICATE_SAME_ACCESS flag标志,那么这个参数将被忽略
分析401256:
GetLastError() + FormatMessage()是很常见的出错处理
HANDLE GetStdHandle(DWORD nStdHandle):返回标准的输入输出或者错误的设备句柄,也就是获得输入、输出或者错误的屏幕缓冲区的句柄
网上搜索这个值,找到了这样一段py代码:
#!/usr/bin/env python
#encoding: utf-8
from ctypes import *
if __name__ == "__main__":
windll.Kernel32.GetStdHandle.restype = c_ulong
h = windll.Kernel32.GetStdHandle(c_ulong(0xfffffff5))
for i in range(0,16):
windll.Kernel32.SetConsoleTextAttribute(h, i)
print "hi,insun"
解释:调用ctype,改变了cmd的text属性,基色变了
WriteConsole:从当前光标位置写入一个字符串到屏幕缓冲区
这个函数块很奇怪,以byte_4120A4的值为终止符判断,其他函数又不知道调用关系
加密算法其实很好破解:
破解方法:
这几个数组读取得太多次了,查询前几个值:0x63,0x7C,0x77,0x7B,0xF2,0x6B,0xC5,0x30~~发现是AES~~
然后5个参数,可以根据出错提示得到~~
AES详解可以看这个:
https://blog.csdn.net/qq_28205153/article/details/55798628
然而对回答问题,并没有什么用……
主要的两种加密方式确实找对了:修改后的 BASE64 以及 标准 AES (密钥也有)
import string
import base64
s = ''
tab = 'CDEFGHIJKLMNOPQRSTUVWXYZABcdefghijklmnopqrstuvwxyzab0123456789+/'
b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
c = 'BInaEi=='
for ch in c:
if ch in tab:
s += b64[string.find(tab,str(ch))]
elif ch == '=':
s += '='
#ans = base64.b64decode(s)
ans = base64.decodestring(s)
print ans
AES解密也可以调用相对应的函数模块来解决,如python的pyCrypto