本帖最后由 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 的地址参数,一路可找到其消息循环处理过程,可看到如下代码: [Asm] 纯文本查看 复制代码 004010EF > 817D 0C 11010>cmp dword ptr ss:[ebp+0xC],0x111 ; 0x111 代表 WM_COMMAND 消息
004010F6 . 74 52 je short unpacked.0040114A
004010F8 . 817D 0C 10010>cmp dword ptr ss:[ebp+0xC],0x110 ; 0x110 表示 WM_INITDIALOG 消息
004010FF . 74 2F je short unpacked.00401130
00401101 . 837D 0C 10 cmp dword ptr ss:[ebp+0xC],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 [url=mailto:duelist@beer.com]duelist@beer.com[/url]! 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:[ebp+0x8] ; |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文件就完成了最终结果。 |