本帖最后由 playboysen 于 2013-12-24 20:52 编辑
本文针对以下CM:
http://www.52pojie.cn/thread-228499-1-1.html
看图标就知道是易语言了(结合字符串查看更加确定,因为模块封装易语言里面字符串比较乱),既然这样也懒得慢慢跟
打开“E逆工程师”找找按钮事件,轻松定位0041A34D,跟进看看
[AppleScript] 纯文本查看 复制代码 0040140A /. 55 push ebp
0040140B |. 8BEC mov ebp,esp
0040140D |. 68 04000080 push 80000004
00401412 |. 6A 00 push 0
00401414 |. 68 98EE4700 push Easy_Cra.0047EE98 ; ASCII ":("
00401419 |. 68 01030080 push 80000301
0040141E |. 6A 00 push 0
00401420 |. 68 10000000 push 10
00401425 |. 68 04000080 push 80000004
0040142A |. 6A 00 push 0
0040142C |. 68 9BEE4700 push Easy_Cra.0047EE9B ; 注册失败!
00401431 |. 68 03000000 push 3
00401436 |. BB D0194000 mov ebx,Easy_Cra.004019D0
0040143B |. E8 46000000 call Easy_Cra.00401486 ; MessageBox
00401440 |. 83C4 28 add esp,28
00401443 |. 8BE5 mov esp,ebp
00401445 |. 5D pop ebp
00401446 \. C3 retn
傻了,颠覆常识?!这个“Register”按钮只要点击就直接提示注册失败
想不通啊,所谓“思路决定出路”可当思路走进死胡同,人生就进入了短暂的悲剧……
压根不存在合法性验证??应该不会,这种耍无赖的做法为人不耻
既然有验证而又不是点击“Register”才开始验证,那是不是在输入时就一直在验证??这样的话程序需处理编辑框相应消息,输入时不断取编辑框文字
尝试下断点GetWindowTextA/W、GetDlgItemTextA/W虽然能够断下,但是F8一路小跑发现满眼尽是Switch,跳的花枝乱颤——受不鸟儿啊
没办法,翻翻题目原帖看看哪路神仙能给个思路先
果然看到了“多线程”几个字,瞬时如注鸡血——因为想起了几天前搞过的那个CM(Crack Me--RedAgl),程序注入其它进程写入关键验证代码
既然是多线程,可用断点有OpenProcess、VirtualAlloc、WriteProcessMemory、CreateThread、CreateRemoteThread等等
不过也不用煞费苦心找断点了(如果作者对INT3作了处理很可能断不下来),因为不涉及其它进程注入就简单直接点
OD加载程序F9运行,然后打开OD线程窗口找到关键线程的入口地址(具体操作见图)
[AppleScript] 纯文本查看 复制代码 100010FE 55 push ebp
100010FF 8BEC mov ebp,esp
10001101 81EC 30000000 sub esp,30
......
1000115D 8945 FC mov dword ptr ss:[ebp-4],eax
10001160 8965 DC mov dword ptr ss:[ebp-24],esp
10001163 68 30B20010 push 1000B230 ; ASCII "Easy CrackMe by:Xjun"
10001168 68 45B20010 push 1000B245 ; ASCII "Window"
1000116D FF15 18A10010 call dword ptr ds:[1000A118] ; USER32.FindWindowA
10001173 90 nop
......
1000118F 68 4CB20010 push 1000B24C
10001194 68 4DB20010 push 1000B24D ; ASCII "Edit"
10001199 68 00000000 push 0
1000119E FF75 F8 push dword ptr ss:[ebp-8]
100011A1 FF15 14A10010 call dword ptr ds:[1000A114] ; USER32.FindWindowExA
100011A7 90 nop
......
1000120E 8965 DC mov dword ptr ss:[ebp-24],esp
10001211 FF15 34A00010 call dword ptr ds:[1000A034] ; kernel32.GetCurrentProcessId
10001217 90 nop
......
10001236 68 00000000 push 0
1000123B 68 FF0F1F00 push 1F0FFF ; ASCII " "
10001240 FF15 2CA00010 call dword ptr ds:[1000A02C] ; kernel32.OpenProcess
10001246 90 nop
......
10001262 FF75 F0 push dword ptr ss:[ebp-10]
10001265 68 20000000 push 20
1000126A 68 0D000000 push 0D ; WM_GETTEXT
1000126F FF75 F4 push dword ptr ss:[ebp-C]
10001272 FF15 10A10010 call dword ptr ds:[1000A110] ; USER32.SendMessageA
......
100012A4 E8 C7050000 call 10001870 ; EAX = "www.52pojie.cn"
100012A9 83C4 10 add esp,10
100012AC 8945 DC mov dword ptr ss:[ebp-24],eax
100012AF 8B45 DC mov eax,dword ptr ss:[ebp-24]
100012B2 50 push eax ; "www.52pojie.cn"
100012B3 FF75 F0 push dword ptr ss:[ebp-10] ; 假码"playboysen"
100012B6 E8 A6FDFFFF call 10001061 ; 这个Call,你懂的
100012BB 83C4 08 add esp,8
100012BE 83F8 00 cmp eax,0
100012C1 B8 00000000 mov eax,0
100012C6 0F94C0 sete al
100012C9 8945 D8 mov dword ptr ss:[ebp-28],eax
100012CC 8B5D DC mov ebx,dword ptr ss:[ebp-24]
100012CF 85DB test ebx,ebx
100012D1 74 09 je short 100012DC
100012D3 53 push ebx
100012D4 E8 3E010000 call 10001417
100012D9 83C4 04 add esp,4
100012DC 837D D8 00 cmp dword ptr ss:[ebp-28],0
100012E0 0F84 B4000000 je 1000139A ; 这里直接跳到了CloseHandle
100012E6 8965 DC mov dword ptr ss:[ebp-24],esp
......
10001377 50 push eax
10001378 FF75 E4 push dword ptr ss:[ebp-1C]
1000137B FF75 E0 push dword ptr ss:[ebp-20]
1000137E FF15 28A00010 call dword ptr ds:[1000A028] ; kernel32.WriteProcessMemory
10001384 90 nop
10001385 90 nop
10001386 90 nop
10001387 90 nop
10001388 3965 DC cmp dword ptr ss:[ebp-24],esp
1000138B 74 0D je short 1000139A
1000138D 68 06000000 push 6
10001392 E8 86000000 call 1000141D
10001397 83C4 04 add esp,4
1000139A 8965 DC mov dword ptr ss:[ebp-24],esp
1000139D FF75 E0 push dword ptr ss:[ebp-20]
100013A0 FF15 00A00010 call dword ptr ds:[1000A000] ; kernel32.CloseHandle
通过API可知流程,简单来说线程通过不断发送WM_GETTEXT消息获取主程序Edit控件内容,然后与固定注册码"www.52pojie.cn"作比较,正确则作内存写入操作否则循环检查
爆破也容易,上面100012E0跳转直接NOP即可,不过由于是在线程中修改指令无法直接保存,可以打开OD内存映射窗口Ctrl+B搜索“0F 84 B4 00 00 0089 65 DC”来定位关键跳转在主程序中的位置(0x0046AF9E),找到后直接NOP即可保存爆破
|