这个题的加密算法第一眼看上去很复杂,试试从字符串找特征

猜测:更换后的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