原创

爆破某解压缩软件

本文字数:

6783

,大约阅读2分钟

这是一篇很早以前的文章了,因为最近一直没有整理新学习的内容,所以找来很早以前的内容发一下吧。当时对软件破解有一点兴趣,水平还在入门当中的阶段,因此随便找点软件来练习的。

随着法律越来越明确,并且自己也是做软件开发的,其实软件的破解是一件触犯法律、且不道德的行为。即使学习软件的安全技术,也可以通过很多诸如 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版”

对于要移除标题栏的“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 的条件永远不能为真,那么就永远不会过期了。暴力破解是技术含量较低的破解技术,比起分析注册算法、写注册机而言,不值一提!当娱乐吧!

信息安全
Win32/64
安全工具开发
黑客工具开发
逆向分析
软件破解
  • 作者:Netor0x86(联系作者)
  • 发表时间:2020-04-07 00:04
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 公众号转载:请在文末添加作者公众号二维码
  • 评论