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个字符!
小菜鸟 一脸懵逼 这里“将00401595处跳到失败的命令nop掉”可不可以把此处的jnz指令改成jz指令? 我想问问,这些crakeme在哪里找的? 虽然一点也看不懂 还是支持了! crakeme不懂
小菜鸟 一脸懵逼 懵逼中,感谢大佬分享学习 学习了学习了 学习了学习了{:1_911:}
页:
[1]
2