基本思路
打开该程序之后,输错会出现异常的字符串,依据这些字符串追踪到sub_402120函数,大致理一下该题的思路,该函数是一个接收消息的回调函数,当接受到消息时,将进入该函数。
1 | (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) |
包含四个参数,核心的是当wParam=1035时Crack成功,所以需要找到发送消息并且wParam=1035的位置,使得该语句能够被执行。
1 | if ( (unsigned __int16)wParam == 1035 ) |
步骤
一开始以为是SendMessageW函数进行消息的发送,但是查了所有对该函数的引用的位置,并没有发送wParam=1035的消息,发现最开始sub_402120函数会新开辟一个线程,执行的是StartAddress函数,因此一步一步跟进去查看发现在sub_401870函数中使用了PostMessageW发送了1035的消息。
1 | if ( v26 == 2 ) // v3 0042 0050 0035 0031 |
其中v3便是输入的字符串,其实前面经过两次相同的亦或,并将小写变为了大写。一个字符这里是两个字节,while判断的是第三到第六四个字符,因此依次为 15pb。由前面函数可知一共包含7位,现在差前两位和最后一位 XX15pbX。
这里sub_401740函数有一次判断,分析后这里是求出另外三位。判断核心在
1 | v14 = &v20; |
v2是传入的字符串,v20是1-9 9个数字,因此即可得到第一位第二位依次是 12
核心在于 v18是尝试的次数,v8是将v20和v2从第v3个开始两个串拼接复制过去,因此当v3=1时,v8存放的是v20+”215pbX”
1 | v8 = sub_4028D0((int)&v20, v2 + 2 * *(_DWORD *)v3); //v3和v18一样,存放的是次数 |
这里v17是最后一位,前面有赋值,因此需要保证(_WORD )v2 + *((_WORD *)v8 + 9) == 99,即49+50,即v8+9 为2,表示v3=1,因此对应后面v17=1+7=8
所以Flag为 *1215pb8***