这款软件的破解相对比较简单,但内容比较齐全,首先打开软件,发现有一个弹窗如下:
这个弹窗可以使用爆破。
进入后,软件的主界面如下:
需要破解的地方有两个,一个是用户名/密码,一个是单独的序列号。
我们首先破解序列号,首先用OD加载软件,F9运行软件,打开序列号的窗口如下:
点击后发现弹出了一个弹窗,我们用OD进行智能搜索字符串Try,进到这里:
0042F48A |. 8D45 FC lea eax,[local.1]
0042F48D |. BA 40F54200 mov edx,Acid_bur.0042F540 ; Hello
0042F492 |. E8 7142FDFF call Acid_bur.00403708
0042F497 |. 8D45 F8 lea eax,[local.2]
0042F49A |. BA 50F54200 mov edx,Acid_bur.0042F550 ; Dude!
0042F49F |. E8 6442FDFF call Acid_bur.00403708
0042F4A4 |. FF75 FC push [local.1]
0042F4A7 |. 68 60F54200 push Acid_bur.0042F560
0042F4AC |. FF75 F8 push [local.2]
0042F4AF |. 8D45 F4 lea eax,[local.3]
0042F4B2 |. BA 03000000 mov edx,0x3
0042F4B7 |. E8 F044FDFF call Acid_bur.004039AC
0042F4BC |. 8D55 F0 lea edx,[local.4]
0042F4BF |. 8B83 E0010000 mov eax,dword ptr ds:[ebx+0x1E0]
0042F4C5 |. E8 8EB5FEFF call Acid_bur.0041AA58
0042F4CA |. 8B45 F0 mov eax,[local.4]
0042F4CD |. 8B55 F4 mov edx,[local.3]
0042F4D0 |. E8 2745FDFF call Acid_bur.004039FC
0042F4D5 75 1A jnz short Acid_bur.0042F4F1 ; 不要跳转
0042F4D7 |. 6A 00 push 0x0
0042F4D9 |. B9 64F54200 mov ecx,Acid_bur.0042F564 ; Congratz!
0042F4DE |. BA 70F54200 mov edx,Acid_bur.0042F570 ; God Job dude !! =)
0042F4E3 |. A1 480A4300 mov eax,dword ptr ds:[0x430A48]
0042F4E8 |. 8B00 mov eax,dword ptr ds:[eax]
0042F4EA |. E8 81ACFFFF call Acid_bur.0042A170
0042F4EF |. EB 18 jmp short Acid_bur.0042F509
0042F4F1 |> 6A 00 push 0x0
0042F4F3 |. B9 84F54200 mov ecx,Acid_bur.0042F584 ; Failed!
0042F4F8 |. BA 8CF54200 mov edx,Acid_bur.0042F58C ; Try Again!!
0042F4FD |. A1 480A4300 mov eax,dword ptr ds:[0x430A48]
0042F502 |. 8B00 mov eax,dword ptr ds:[eax]
0042F504 |. E8 67ACFFFF call Acid_bur.0042A170
很明显,在弹出错误弹窗前有一个jmp可以跳过错误提示,但前面的jnz跳转又跳过了jmp,因此只要jnz不跳转就 可以爆破了,第一个 方法就是直接把jnz进行nop填充。那么很明显,jnz前面的call就是关键call了,作用就是用输入的序列号和真实的序列号进行比较, 通过前面的固定字符串和栈中的数据可以很明显的发现真实的序列号就是 Hello Dude!
再来看用户名/序列号部分,我们首先随便输入一个用户名/序列号,提示如下错误:
同样搜索字符串 sorry,得到地址如下:
0042FA52 |. E8 D96EFDFF call Acid_bur.00406930
0042FA57 |. 83F8 04 cmp eax,0x4 ; 长度是否大于4
0042FA5A |. 7D 1D jge short Acid_bur.0042FA79
0042FA5C |. 6A 00 push 0x0
0042FA5E |. B9 74FB4200 mov ecx,Acid_bur.0042FB74 ; Try Again!
0042FA63 |. BA 80FB4200 mov edx,Acid_bur.0042FB80 ; Sorry , The serial is incorect !
0042FA68 |. A1 480A4300 mov eax,dword ptr ds:[0x430A48]
0042FA6D |. 8B00 mov eax,dword ptr ds:[eax]
0042FA6F |. E8 FCA6FFFF call Acid_bur.0042A170
0042FA74 |. E9 BE000000 jmp Acid_bur.0042FB37
0042FA79 |> 8D55 F0 lea edx,[local.4]
0042FA7C |. 8B83 DC010000 mov eax,dword ptr ds:[ebx+0x1DC]
0042FA82 |. E8 D1AFFEFF call Acid_bur.0041AA58
0042FA87 |. 8B45 F0 mov eax,[local.4]
0042FA8A |. 0FB600 movzx eax,byte ptr ds:[eax] ; eax为输入的用户名,这里取第一个字符
0042FA8D |. F72D 50174300 imul dword ptr ds:[0x431750] ; 与0x29相乘
0042FA93 |. A3 50174300 mov dword ptr ds:[0x431750],eax
0042FA98 |. A1 50174300 mov eax,dword ptr ds:[0x431750] ; 相当于再乘以2
0042FA9D |. 0105 50174300 add dword ptr ds:[0x431750],eax ; 地址0x431750保存了中间数值字符串的数值
0042FAA3 |. 8D45 FC lea eax,[local.1]
0042FAA6 |. BA ACFB4200 mov edx,Acid_bur.0042FBAC ; CW
0042FAAB |. E8 583CFDFF call Acid_bur.00403708
0042FAB0 |. 8D45 F8 lea eax,[local.2]
0042FAB3 |. BA B8FB4200 mov edx,Acid_bur.0042FBB8 ; CRACKED
0042FAB8 |. E8 4B3CFDFF call Acid_bur.00403708
0042FABD |. FF75 FC push [local.1] ; Acid_bur.0042FBAC
0042FAC0 |. 68 C8FB4200 push Acid_bur.0042FBC8 ; -
0042FAC5 |. 8D55 E8 lea edx,[local.6]
0042FAC8 |. A1 50174300 mov eax,dword ptr ds:[0x431750]
0042FACD |. E8 466CFDFF call Acid_bur.00406718 ; 生成中间部分序列
0042FAD2 |. FF75 E8 push [local.6]
0042FAD5 |. 68 C8FB4200 push Acid_bur.0042FBC8 ; -
0042FADA |. FF75 F8 push [local.2]
0042FADD |. 8D45 F4 lea eax,[local.3]
0042FAE0 |. BA 05000000 mov edx,0x5
0042FAE5 |. E8 C23EFDFF call Acid_bur.004039AC ; 字符串拼接生成序列
0042FAEA |. 8D55 F0 lea edx,[local.4]
0042FAED |. 8B83 E0010000 mov eax,dword ptr ds:[ebx+0x1E0]
0042FAF3 |. E8 60AFFEFF call Acid_bur.0041AA58
0042FAF8 |. 8B55 F0 mov edx,[local.4]
0042FAFB |. 8B45 F4 mov eax,[local.3]
0042FAFE |. E8 F93EFDFF call Acid_bur.004039FC ; 关键call,比较
0042FB03 |. 75 1A jnz short Acid_bur.0042FB1F ; 关键跳,不能跳
0042FB05 |. 6A 00 push 0x0
0042FB07 |. B9 CCFB4200 mov ecx,Acid_bur.0042FBCC ; Congratz !!
0042FB0C |. BA D8FB4200 mov edx,Acid_bur.0042FBD8 ; Good job dude =)
0042FB11 |. A1 480A4300 mov eax,dword ptr ds:[0x430A48]
0042FB16 |. 8B00 mov eax,dword ptr ds:[eax]
0042FB18 |. E8 53A6FFFF call Acid_bur.0042A170 ; 弹出成功
0042FB1D |. EB 18 jmp short Acid_bur.0042FB37
0042FB1F |> 6A 00 push 0x0
0042FB21 |. B9 74FB4200 mov ecx,Acid_bur.0042FB74 ; Try Again!
0042FB26 |. BA 80FB4200 mov edx,Acid_bur.0042FB80 ; Sorry , The serial is incorect !
0042FB2B |. A1 480A4300 mov eax,dword ptr ds:[0x430A48]
0042FB30 |. 8B00 mov eax,dword ptr ds:[eax]
0042FB32 |. E8 39A6FFFF call Acid_bur.0042A170
通过汇编代码分析,发现有两处进行了错误弹出,上面错误信息弹出是判断输入的用户名长度是否大于4,小于4则弹出错误信息。第二处,在弹出错误信息上方有个jmp可以跳过错误提示,同样上面的jnz跳过了jmp,因此只要将jnz进行nop就可以进行爆破。
因此,前面的call就是关键call,用于正确的序列号和输入的序列号进行比较,当用户名是123456,真实的序列号是CW-4018-CRACKED,换一次用户名,发现真实的序列号前后部分是固定的,而中间部分,通过上面的汇编代码分析,是取用户名第一个字符的ASCII码,乘以十六进制0x29再乘以2,得到的数值转成字符串。
至于打开前的弹窗,可以用同样的方法进行爆破。