带壳破解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带壳破解成功


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值