这是一篇很早以前的文章了,因为最近一直没有整理新学习的内容,所以找来很早以前的内容发一下吧。当时对软件破解有一点兴趣,水平还在入门当中的阶段,因此随便找点软件来练习的。
随着法律越来越明确,并且自己也是做软件开发的,其实软件的破解是一件触犯法律、且不道德的行为。即使学习软件的安全技术,也可以通过很多诸如 CrackME 和 ReverseME 来进行学习,没有必要找各种软件进行练手。
这个文章想必也已经过时,但是还是去掉其实际的名字比较好一些。因此针对原来写的内容有所改动。
该解压缩软件(这里不给出具体的名字)是一款非常大众化的工具,很多人都在用它(可能现在用的人少了)。
我使用的这款解压缩工具在今天突然出现提示框“请注册”,并且标题栏写着“XX版”(这里不给出具体提示)字样。
用 PEiD 查壳,是“Borland C++ 1999”开发的(看开发工具就知道应该是很久以前的东西了吧)。那么就开始使用 OD 进行破解吧。
用 OD 载入该解压缩软件然后,SHIFT + F9 运行让它运行起来,直到出现“请注册”提示框。
按下 F12 让其暂停,然后 ALT + K 查看调用栈窗口,调用栈显示的调用关系如下:
在 0012D5E8 地址单击右键,在弹出的对话框中选择 “显示调用”,则在反汇编窗口中看到了调用 DialogBoxParamA 的代码:
00440DEE . /E9 C6110000 jmp 00441FB9
00440DF3 > |8B55 10 mov edx, dword ptr [ebp+10] ; Case 7B (WM_CONTEXTMENU) of switch 004407E4
00440DF6 . |3B15 EC134B00 cmp edx, dword ptr [4B13EC]
00440DFC . |0F85 B7110000 jnz 00441FB9
00440E02 . |B8 EC134B00 mov eax, 004B13EC
00440E07 . |E8 DCE70100 call 0045F5E8
00440E0C . |E9 A8110000 jmp 00441FB9
00440E11 > |833D 4C384B00 00 cmp dword ptr [4B384C], 0 ; Case 113 (WM_TIMER) of switch 004407E4
00440E18 . |75 4D jnz short 00440E67
00440E1A . |803D FC584900 00 cmp byte ptr [4958FC], 0
00440E21 . |75 44 jnz short 00440E67
00440E23 . |803D BC7B4B00 00 cmp byte ptr [4B7BBC], 0
00440E2A . |75 3B jnz short 00440E67
00440E2C . |803D 78F74900 00 cmp byte ptr [49F778], 0
00440E33 . |75 32 jnz short 00440E67
00440E35 . |A1 84414B00 mov eax, dword ptr [4B4184]
00440E3A . |83F8 28 cmp eax, 28
00440E3D . |7F 04 jg short 00440E43
00440E3F . |85C0 test eax, eax
00440E41 . |7D 24 jge short 00440E67
00440E43 > |C605 FC584900 01 mov byte ptr [4958FC], 1
00440E4A . |6A 00 push 0 ; /lParam = NULL
00440E4C . |68 E84E4400 push 00444EE8 ; |DlgProc = xxx.00444EE8
00440E51 . |FF35 D8134B00 push dword ptr [4B13D8] ; |hOwner = 00200460 ('xxx (xxx版本)',class='xxxWindow')
00440E57 . |68 7D5E4900 push 00495E7D ; |pTemplate = "REMINDER"
00440E5C . |FF35 9CF74900 push dword ptr [49F79C] ; |hInst = 00400000
00440E62 . |E8 1BF20400 call <jmp.&USER32.DialogBoxParamA> ; \DialogBoxParamA
00440E67 > |833D 4C384B00 00 cmp dword ptr [4B384C], 0
00440E6E . |75 2D jnz short 00440E9D
可以看到在 00440E62 处调用了 DialogBoxParamA 函数,往上看代码。在 00440E0C 处是一个 JMP 指令。
在 00440E11 处是一句 cmp 指令,观察 OD 为我们添加的注释,可以看出是一个 case 分支。
那么从 00440E11 处便是调用 DialogBoxParamA 函数的分支,在 00440E18 处是一条 JNZ 指令,如下:
00440E11 > |833D 4C384B00 00 cmp dword ptr [4B384C], 0 ; Case 113 (WM_TIMER) of switch 004407E4
00440E18 . |75 4D jnz short 00440E67
将 00440E18 的 JNZ 指令跳过了调用 DialogBoxParamA 修改为 jmp 指令即可达到移除“请注册”窗口的作用。
对于要移除标题栏的“xx版”则需要在启动该解压缩时对 SetWindowTextA 函数下断点,当断下后,返回掉调用处,查看代码,代码如下:
0044B23C /$ 81C4 00FCFFFF add esp, -400
0044B242 |. 50 push eax
0044B243 |. 68 A7694900 push 004969A7 ; ASCII "%s - xxx"
0044B248 |. 8D4424 08 lea eax, dword ptr [esp+8]
0044B24C |. 50 push eax
0044B24D |. E8 BADE0300 call 0048910C
0044B252 |. 83C4 0C add esp, 0C
0044B255 |. 803D 78F74900 00 cmp byte ptr [49F778], 0
0044B25C |. 75 7A jnz short 0044B2D8
0044B25E |. A1 84414B00 mov eax, dword ptr [4B4184]
0044B263 |. 83F8 14 cmp eax, 14
0044B266 |. 7C 05 jl short 0044B26D
0044B268 |. 83F8 28 cmp eax, 28
0044B26B |. 7C 1D jl short 0044B28A
0044B26D |> B8 69030000 mov eax, 369
0044B272 |. E8 3D61FCFF call 004113B4
0044B277 |. 50 push eax
0044B278 |. 8D9424 04020000 lea edx, dword ptr [esp+204]
0044B27F |. 52 push edx
0044B280 |. E8 AFAF0300 call 00486234
0044B285 |. 83C4 08 add esp, 8
0044B288 |. EB 27 jmp short 0044B2B1
0044B28A |> B9 28000000 mov ecx, 28
0044B28F |. B8 6A030000 mov eax, 36A
0044B294 |. 2B0D 84414B00 sub ecx, dword ptr [4B4184]
0044B29A |. 51 push ecx
0044B29B |. E8 1461FCFF call 004113B4
0044B2A0 |. 50 push eax
0044B2A1 |. 8D9424 08020000 lea edx, dword ptr [esp+208]
0044B2A8 |. 52 push edx
0044B2A9 |. E8 5EDE0300 call 0048910C
0044B2AE |. 83C4 0C add esp, 0C
0044B2B1 |> 8D8C24 00020000 lea ecx, dword ptr [esp+200]
0044B2B8 |. 51 push ecx
0044B2B9 |. 68 B3694900 push 004969B3 ; ASCII " (%s)"
0044B2BE |. 8D4424 08 lea eax, dword ptr [esp+8]
0044B2C2 |. 50 push eax
0044B2C3 |. E8 9CAF0300 call 00486264
0044B2C8 |. 59 pop ecx
0044B2C9 |. 8D5424 08 lea edx, dword ptr [esp+8]
0044B2CD |. 03C2 add eax, edx
0044B2CF |. 50 push eax
0044B2D0 |. E8 37DE0300 call 0048910C
0044B2D5 |. 83C4 0C add esp, 0C
0044B2D8 |> 54 push esp ; /Text
0044B2D9 |. FF35 D8134B00 push dword ptr [4B13D8] ; |hWnd = 007D04AA ('xxx',class='xxxWindow')
0044B2DF |. E8 32500400 call <jmp.&USER32.SetWindowTextA> ; \SetWindowTextA
0044B2E4 |. 81C4 00040000 add esp, 400
0044B2EA \. C3 retn
以上是调用 SetWindowTextA 函数的反汇编代码,在函数的第一句下断点,重新运行该解压缩程序,断下后 F8 单步跟踪。
执行到 0044B25C 地址处有一条 JNZ 指令,同理将其改为 JMP 指令。这样就可以达到将“xx版"字样移除的效果了。
所谓的暴力破解,就是修改相应的条件,比如我们写个 if 判断某个条件为真时,就说明软件过期,那么就会提示注册等信息。那么只要修改这个 if 的条件永远不能为真,那么就永远不会过期了。暴力破解是技术含量较低的破解技术,比起分析注册算法、写注册机而言,不值一提!当娱乐吧!
评论