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文件就完成了最终结果。 好东西,学习一下 支持原创,谢谢热情无私分享。 谢谢分享 我服了,原来license是唬人的,我把所有解密dll和函数的代码都翻遍了,都没找到判断的关键跳。
页:
[1]