这个题的加密算法第一眼看上去很复杂,试试从字符串找特征
猜测:更换后的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
啊
是
啊
啊
啊
啊