solly 发表于 2019-4-12 00:35

160 crackme 之 050---DueList.5.exe 的分析和patch

本帖最后由 solly 于 2019-4-29 23:39 编辑

160合集中这个Crackme也还没有説明,这个CM主要是去NAG 和 PATCH,没有算法,
并且使用汇编语言写的,代码非常精简,虽然有一些乱七八糟的JMP,
但范围有限,很好分析。
先启动看看有什么:首先来了一个NAG,提示“Unregistered”。再来一个主界面提示“Unregistered”,主要就是这两个东西,需要通过patch来处理掉。看看有没有壳,要patch的一般会有壳,增加点难度。果然提示有壳,并有建议一些脱壳工具,我用RL!dePacker v1.5 试了一下,没有成功。于是用OD载入看看:看到前排一排整齐划一的push,那只要去找对应的pop了,往下翻吧。。。。。一堆pop加上一个 jmp eax,就是这里啦;定位到 JMP EAX 这一行,F4执行到此。然后一个F8,跳转。。。来到这里,代码没有显示出来,应该是OD在前面读了节属性没有刷新,还是当作数据节在显示。不管了,先脱壳吧: 选中“重建输入表”,并且要使用“方式2”,"方式1"不行。我试过了的。保存脱壳后的CM后,再查壳看看:
没有壳了,显示是用汇编方式写的CM,用OD加载脱壳后的CM:前面7行给变量初始化,没看出什么作用来。一路F8到 0040105C   jmp 004010C1,一个跳转,跟随转过去看看:直接来到了显示NAG的代码,因此只要修改前面那个跳转,就可以跳过NAG了。NAG后就是显示主界面的对话框窗口了,因此跳转到 004010D7就可完美跳过NAG屏了。直接在OD中修改,看看效果:跳转已经指向NAG后面了,避开了NAG的显示,下面再看看如何去掉主界面的文本显示“Unregistered”。根据对话框的 DlgProc 的地址参数,一路可找到其消息循环处理过程,可看到如下代码:004010EF   >817D 0C 11010>cmp dword ptr ss:,0x111   ;0x111 代表 WM_COMMAND 消息
004010F6   .74 52         je short unpacked.0040114A
004010F8   .817D 0C 10010>cmp dword ptr ss:,0x110   ;0x110 表示 WM_INITDIALOG 消息
004010FF   .74 2F         je short unpacked.00401130
00401101   .837D 0C 10    cmp dword ptr ss:,0x10      ;0x10 表示 WM_CLOSE 消息
00401105   .74 4F         je short unpacked.00401156
00401107   .B8 00000000   mov eax,0x0
0040110C   >5F            pop edi                              ;ntdll.777EEEDD
0040110D   .5E            pop esi                              ;ntdll.777EEEDD
0040110E   .5B            pop ebx                              ;ntdll.777EEEDD
0040110F   .C9            leave
00401110   .C2 1000       retn 0x10
00401113   >68 00200000   push 0x2000                        ; /Style = MB_OK|MB_TASKMODAL
00401118   .68 01204000   push unpacked.00402001               ; |Title = "Duelist's Crackme #5"
0040111D   .68 6A204000   push unpacked.0040206A               ; |Text = "Please send your patcher to duelist@beer.com! First 2 people get the crackme's source code..."
00401122   .6A 00         push 0x0                           ; |hOwner = NULL
00401124   .E8 42010000   call <jmp.&USER32.MessageBoxA>       ; \MessageBoxA
00401129   .B8 01000000   mov eax,0x1
0040112E   .^ EB DC         jmp short unpacked.0040110C
00401130      68 50204000   push unpacked.0040205C ;ASCII "Unregistered",Patch 位置2:将 push 0x0040205C 改成 push 0x00402050
00401135   .6A 00         push 0x0                           ; |wParam = 0x0
00401137   .6A 0C         push 0xC                           ; |Message = WM_SETTEXT
00401139   .6A 03         push 0x3                           ; |ControlID = 0x3
0040113B   .FF75 08       push dword ptr ss:          ; |hWnd = 80006010
0040113E   .E8 3A010000   call <jmp.&USER32.SendDlgItemMessage>; \SendDlgItemMessageA
00401143   .B8 01000000   mov eax,0x1
00401148   .^ EB C2         jmp short unpacked.0040110C
可见在处理 WM_INITDIALOG 消息的代码中,将界面和文本框内容改成了“Unregistered”了,
通过 SendDlgItemMessage 的最后一参数 push 0x0040205C 找到数据区:

在 0x00402050处,就有一个 Registered,如上图。只要把这个 push 0x0040205C 改成 push 0x00402050 就可以了。
修改后就是显示“Registered”了。

直接在 OD中修改,OD也提示指向字符串“Registered”了。
F9运行,进入CM,没有了NAG了,界面也显示如下了:

完毕!!!!!!
该CM由汇编代码编写,代码量很少,流程清楚,也没有算法。
完整代码总共也才360字节。就不贴上来了。
最后用16进制编辑器修改exe文件就完成了最终结果。

lxptyc 发表于 2019-4-12 07:09

DEFwa 发表于 2019-4-12 08:21

好东西,学习一下

zhaolisheng 发表于 2019-4-12 09:30

支持原创,谢谢热情无私分享。

guifa2014 发表于 2019-4-12 14:41

谢谢分享

hkyiyu 发表于 2022-3-15 21:52

我服了,原来license是唬人的,我把所有解密dll和函数的代码都翻遍了,都没找到判断的关键跳。
页: [1]
查看完整版本: 160 crackme 之 050---DueList.5.exe 的分析和patch