首页 > 逆向调试 > 带壳破解SMC补丁技术

带壳破解SMC补丁技术

今天又考完了一门课程,大三也即将结束了。大三的结束基本上也就意味着大学学习的结束,所以要抓紧留在学校的时间多学点东西。今天看了SMC补丁技术,很简单的那种。复杂的还有好几层的SMC技术,那个应用在壳上加壳的破解。

SMC补丁技术可以实现带壳破解。主要原理就是在外壳解密/压缩完成即将跳转到OEP之际,让其跳转到另一个地方。在那个地方我们将完成程序的补丁工作,然后再跳转到OEP处执行。至于SMC的英文全称,我也不知道是什么。

首先是一个简单的CrackMe,通过判断输入的字符串是否与程序中预置的字符串相等,相等则成功,否则失败。
CrackMe测试

接下来,我们用UPX压缩壳来对这个CrackMe进行加壳压缩。对CrackMe进行压缩处理之后就可以进行我们的SMC Patch技术测试了。
用UPX对CrackMe进行加壳

好了,现在把压缩后的程序载入OD,然后使用ESP定律进行脱壳,来到POPAD之后快到达OEP处。汇编代码摘要如下:

0040BADD    61              POPAD
0040BADE    8D4424 80       LEA EAX,DWORD PTR SS:[ESP-80]
0040BAE2    6A 00           PUSH 0
0040BAE4    39C4            CMP ESP,EAX
0040BAE6  ^ 75 FA           JNZ SHORT 0040BAE2
0040BAE8    83EC 80         SUB ESP,-80
0040BAEB  - E9 3056FFFF     JMP 00401120                   ; OEP

如果你不知道ESP脱壳定律,建议先看文章《ESP脱壳定律》。接下来还是先跳转到OEP,现在文件加压缩/解密完毕,可以通过字符串找到对比的地方:

0040107F    6A 40           PUSH 40
00401081    52              PUSH EDX
00401082    68 E8030000     PUSH 3E8
00401087    56              PUSH ESI
00401088    FF15 A4504000   CALL DWORD PTR DS:[4050A4]      ; USER32.GetDlgItemTextA
0040108E    8D4424 04       LEA EAX,DWORD PTR SS:[ESP+4]
00401092    8D4C24 10       LEA ECX,DWORD PTR SS:[ESP+10]
00401096    50              PUSH EAX
00401097    51              PUSH ECX
00401098    FF15 00504000   CALL DWORD PTR DS:[405000]      ; KERNEL32.lstrcmpA
0040109E    85C0            TEST EAX,EAX
004010A0    6A 00           PUSH 0
004010A2    75 1D           JNZ SHORT 004010C1              ; 可以改为NOP NOP
004010A4    68 50604000     PUSH 00406050                   ; success
004010A9    68 44604000     PUSH 00406044                   ; good work!
004010AE    56              PUSH ESI
004010AF    FF15 A8504000   CALL DWORD PTR DS:[4050A8]      ; USER32.MessageBoxA
004010B5    B8 01000000     MOV EAX,1
004010BA    5E              POP ESI
004010BB    83C4 4C         ADD ESP,4C
004010BE    C2 1000         RETN 10
004010C1    68 3C604000     PUSH 0040603C                   ; failure
004010C6    68 30604000     PUSH 00406030                   ; try again!
004010CB    56              PUSH ESI
004010CC    FF15 A8504000   CALL DWORD PTR DS:[4050A8]      ; USER32.MessageBoxA
004010D2    B8 01000000     MOV EAX,1
004010D7    5E              POP ESI

我们只要把004010A2处的两个字节NOP掉就完成爆破了。好了,现在回到第一段汇编代码处,也就是即将跳转到OEP的那个地方。我们在下面找一个空地方填上汇编代码来完成Patch工作。然后把跳转到OEP的地方,改为跳转到Patch代码处,Patch完之后在跳回OEP。

0040BADD    61                      POPAD
0040BADE    8D4424 80               LEA EAX,DWORD PTR SS:[ESP-80]
0040BAE2    6A 00                   PUSH 0
0040BAE4    39C4                    CMP ESP,EAX
0040BAE6  ^ 75 FA                   JNZ SHORT 0040BAE2
0040BAE8    83EC 80                 SUB ESP,-80
0040BAEB    EB 07                   JMP SHORT 0040BAF4
0040BAED    90                      NOP
0040BAEE    90                      NOP
0040BAEF    90                      NOP
0040BAF0    0000                    ADD BYTE PTR DS:[EAX],AL
0040BAF2    0000                    ADD BYTE PTR DS:[EAX],AL
0040BAF4    66:C705 A2104000 9090   MOV WORD PTR DS:[4010A2],9090
0040BAFD  - E9 1E56FFFF             JMP 00401120
0040BB02    0000                    ADD BYTE PTR DS:[EAX],AL

然后保存修改后的文件,运行后发现输入任意字符串都OK了,说明SMC带壳破解Patch成功!
SMC带壳破解成功


觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> 带壳破解SMC补丁技术
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



分类: 逆向调试 标签: , , ,
  1. 2011年5月26日15:15 | #1

    没有脱壳吗?还是假脱壳?
    “接下来还是先跳转到OEP,现在文件加压缩/解密完毕,”这句是什么意思?
    破解这些东西忘的差不多了,不过你说的这个我很感兴趣。
    SMC是直接绕过壳完成爆破吗?
    [em009]

    [回复]

  2. 2011年5月26日15:20 | #2

    @the5fire的技术博客
    不用脱壳了。就是执行到下面这句的时候

    0040BAEB  - E9 3056FFFF     JMP 00401120

    就要跳到OEP了,OEP就是程序的真正入口点,也就是没有加壳时的入口点。
    执行到这里的时候意味着外壳的解密或者解压缩工作已经执行完毕。这时候通过查找字符串找爆破点是很方便呀。跟没加壳的时候找爆破点一样的。

    主要思路就是:当外壳解密/解压缩工作执行完毕时要不要跳转到OEP去,而是先做一下爆破工作,然后再跳到OEP去执行程序,就可以随便注册了。

    [回复]

  3. 2011年5月26日15:23 | #3

    @the5fire的技术博客

    0040BAF4    66:C705 A2104000 9090   MOV WORD PTR DS:[4010A2],9090
    0040BAFD  - E9 1E56FFFF             JMP 00401120

    这里可以把爆破工作的代码直接添加在外壳的后面。

    [回复]

  4. 2011年5月27日08:31 | #4

    了解了,呵呵,刚才我自己找了crack me试了一下,就是把壳跳到oep的那部分代码修改一下,让它自动帮咱修改关键跳的代码,呵呵,真是不错的方法。 [em021]

    [回复]

  5. passerby
    2012年3月9日16:29 | #5

    SMC = Self-Modifying Code

    [回复]

    代码疯子 回复:

    @passerby, [em022]

    [回复]