RE
unravelmfc
题目提示:烦人的windows底层api
解题思路:
- 打开程序,发现确定按钮不能点击
用Resources Hacker改变空间属性以后重新打开,发现确定按钮仍然无法打开
查找关键api,EnableWindow
发现程序中多处调用EnableWindow,且有多处禁止了这个按钮,对程序进行patch// hWnd:被允许/禁止的窗口句柄 // bEnable:1 允许,0 禁止 BOOL EnableWindow(HWND hWnd,BOOL bEnable)
再次,打开程序,发现按钮可以点击了,但是点击之后无法查看对应的消息处理函数 - 乱找了一通api,找到了比较关键的API:GetDlgItem,才定位到消息处理函数
后来发现自己蠢了,这里至少还有两种更方便的方法去找消息处理函数//返回窗口中,指定参数ID的子元素的句柄 //需要明确的概念,标识符!=句柄,该函数的返回值是子元素的句柄 HWND GetDlgItem( HWNDhDlg, // handle to dialog box intnIDDlgItem// control identifier );
1. IDA找不到汉字的提示消息,但是OD查找字符串可以找到"恭喜"两个字。
2. 寻找对应的消息处理函数 - 后面逐步分析,发现这个程序还是加了壳并且做了控制流混淆的。
如何对抗花指令?
1. 笨方法:动态调试观察程序大体意思
2. 清洗指令(未尝试)
找到对应的消息处理函数就容易了,加密的步骤共有三步:-
输入长度应该是66位,分两步处理输入
-
前半段输入,先按如下步骤处理:
``` v6 = 0; for ( i = 0; i < halflen; ++i ) { v7 = (v7 + 1) % 256; v6 = (v6 + (unsigned __int8)byte_875088[v7]) % 256; v3 = byte_875088[v7]; byte_875088[v7] = byte_875088[v6]; byte_875088[v6] = v3; v2 = i + input_flag; *(_BYTE *)(i + input_flag) ^= byte_875088[((unsigned __int8)byte_875088[v6] + (unsigned __int8)byte_875088[v7]) % 256]; } ```
需要注意的是,数组byte_875088的数据会在程序运行过程中改变,需要从内存中dump。
-
对上一步的结果,作类似于base64的变换,每3个字符替换成4个字符,替换规则如下:
111111 112222 222233 333333
每一块再加上23,最后与字符串"$HM%/NEX,79PBN\C/BQLVSW,*/'8T#UMC4%EG@@@,.%5"
比较。(需要注意的是ida的静态分析结果中也有类似的字符串,我们仍然需要从内存中dump该字符串) -
后半段输入,先是改变了默认delta的TEA加密,共分4段,key在数组dword_875048中,直接用静态分析的就可以。(因为delta改变了,findcyrpt插件居然没有查出来,不过没关系,可以看出来)
v7 = 32; v18 = v14; v4 = v15; v15 = 0; v20 = v4; v9 = 0; do { v9
-