海天一色001 发表于 2019-4-7 15:18

160个CrakeMe程序之018练习

本帖最后由 海天一色001 于 2019-4-7 15:35 编辑

打开018程序,在注册码文本框中随意输入字符,点击“Check it”按钮,程序弹出错误对话框:

先查壳,C++ 6.0编写,无壳:

第一步、爆破程序:
用OD加载程序:

用“中文搜索引擎”的智能搜索功能,一下子找到了这些字符串:

0040159E处是注册成功的提示,那么双击0040159E地址,回到CPU窗口:随意向上向下翻看了一下代码,很容易就找到了关键跳等信息:
00401585|> \8D4D E4       lea ecx,
00401588|.51            push ecx                                          ; /String2 = "很抾4`亅???       "
00401589|.8D55 F4       lea edx,                                 ; |
0040158C|.52            push edx                                          ; |String1 = "脥?"
0040158D|.FF15 00204000 call dword ptr ds:[<&KERNEL32.lstrcmpA>]          ; \lstrcmpA
00401593|.85C0          test eax,eax                                    ;比较String1和String2
00401595|.75 16         jnz short Brad_Sob.004015AD                     ;不等则跳到失败处
00401597|.6A 40         push 0x40
00401599|.68 50304000   push Brad_Sob.00403050                            ;CrackMe
0040159E|.68 58304000   push Brad_Sob.00403058                            ;Correct way to go!!
004015A3|.8B4D E0       mov ecx,
004015A6|.E8 53050000   call <jmp.&MFC42.#CWnd::MessageBoxA_4224>
004015AB|.EB 14         jmp short Brad_Sob.004015C1                     ;跳过失败
004015AD|>6A 40         push 0x40
004015AF|.68 6C304000   push Brad_Sob.0040306C                            ;CrackMe
004015B4|.68 74304000   push Brad_Sob.00403074                            ;Incorrect try again!!
004015B9|.8B4D E0       mov ecx,
004015BC|.E8 3D050000   call <jmp.&MFC42.#CWnd::MessageBoxA_4224>
将00401595处跳到失败的命令nop掉:

再将修改后的代码存储为可执行文件Brad Soblesky.1.nop.exe,运行这个新生成的nop程序,随意输入字符,点击“Check”按钮,注册成功。

第二步、追注册码:
返回CPU窗口,在刚刚nop的代码处右键选择“撤消选择处修改”菜单命令,

再向上到代码段的开头00401512处设下断点:

F9键运行,在文本框中输入“12345”,点击“Check”按钮,程序中断于00401512处:
F8单步向下,
0040155C|.8D45 F4       lea eax,                                 ;加载假码到eax中
0040155F|.50            push eax                                          ; /String = 00000005 ???
00401560|.FF15 04204000 call dword ptr ds:[<&KERNEL32.lstrlenA>]          ; \lstrlenA
00401566|.8945 F0       mov ,eax                                 ;取假码长度
00401569|.837D F0 01    cmp ,0x1                                 ;与1比较
0040156D|.73 16         jnb short Brad_Sob.00401585                     ;如果少于1位,那么弹出输入注册码的提示框
0040156F|.6A 40         push 0x40
00401571|.68 2C304000   push Brad_Sob.0040302C                            ;CrackMe
00401576|.68 34304000   push Brad_Sob.00403034                            ;Enter Registration Number
0040157B|.8B4D E0       mov ecx,
0040157E|.E8 7B050000   call <jmp.&MFC42.#CWnd::MessageBoxA_4224>
00401583|.EB 3C         jmp short Brad_Sob.004015C1
00401585|>8D4D E4       lea ecx,                                 ;调用明文字符
00401588|.51            push ecx                                          ; /String2 = "<BrD-SoB>"
00401589|.8D55 F4       lea edx,                                 ; |
0040158C|.52            push edx                                          ; |String1 = "12345"
0040158D|.FF15 00204000 call dword ptr ds:[<&KERNEL32.lstrcmpA>]          ; \lstrcmpA
00401593|.85C0          test eax,eax                                    ;比较String1和String2
这个程序非常简单,先判断输入的字符是否小于1位,然后再向下调入明码<BrD-SoB>和输入的字符进行比较,其实就是说,注册码就是“<BrD-SoB>”这9个字符!

UC大法好 发表于 2019-4-7 15:54

小菜鸟 一脸懵逼

kisy 发表于 2019-4-7 17:27

这里“将00401595处跳到失败的命令nop掉”可不可以把此处的jnz指令改成jz指令?

WNs_ACE 发表于 2019-4-7 17:59

我想问问,这些crakeme在哪里找的?

无敌狮子头 发表于 2019-4-7 18:34

虽然一点也看不懂 还是支持了!

zhaolisheng 发表于 2019-4-7 19:50

crakeme不懂

Jack强 发表于 2019-4-7 20:44


小菜鸟 一脸懵逼

hmeng 发表于 2019-4-7 22:18

懵逼中,感谢大佬分享学习

52lxw 发表于 2019-4-7 22:34

学习了学习了

52lxw 发表于 2019-4-7 22:35

学习了学习了{:1_911:}
页: [1] 2
查看完整版本: 160个CrakeMe程序之018练习