本帖最后由 海天一色001 于 2019-4-7 15:35 编辑
打开018程序,在注册码文本框中随意输入字符,点击“Check it”按钮,程序弹出错误对话框:
先查壳,C++ 6.0编写,无壳:
第一步、爆破程序:
用OD加载程序:
用“中文搜索引擎”的智能搜索功能,一下子找到了这些字符串:
0040159E处是注册成功的提示,那么双击0040159E地址,回到CPU窗口:随意向上向下翻看了一下代码,很容易就找到了关键跳等信息:
[Asm] 纯文本查看 复制代码 00401585 |> \8D4D E4 lea ecx,[local.7]
00401588 |. 51 push ecx ; /String2 = "很抾4`亅??? "
00401589 |. 8D55 F4 lea edx,[local.3] ; |
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,[local.8]
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,[local.8]
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单步向下,
[Asm] 纯文本查看 复制代码 0040155C |. 8D45 F4 lea eax,[local.3] ; 加载假码到eax中
0040155F |. 50 push eax ; /String = 00000005 ???
00401560 |. FF15 04204000 call dword ptr ds:[<&KERNEL32.lstrlenA>] ; \lstrlenA
00401566 |. 8945 F0 mov [local.4],eax ; 取假码长度
00401569 |. 837D F0 01 cmp [local.4],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,[local.8]
0040157E |. E8 7B050000 call <jmp.&MFC42.#CWnd::MessageBoxA_4224>
00401583 |. EB 3C jmp short Brad_Sob.004015C1
00401585 |> 8D4D E4 lea ecx,[local.7] ; 调用明文字符
00401588 |. 51 push ecx ; /String2 = "<BrD-SoB>"
00401589 |. 8D55 F4 lea edx,[local.3] ; |
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个字符!
|