今天又考完了一门课程,大三也即将结束了。大三的结束基本上也就意味着大学学习的结束,所以要抓紧留在学校的时间多学点东西。今天看了SMC补丁技术,很简单的那种。复杂的还有好几层的SMC技术,那个应用在壳上加壳的破解。
SMC补丁技术可以实现带壳破解。主要原理就是在外壳解密/压缩完成即将跳转到OEP之际,让其跳转到另一个地方。在那个地方我们将完成程序的补丁工作,然后再跳转到OEP处执行。至于SMC的英文全称,我也不知道是什么。
首先是一个简单的CrackMe,通过判断输入的字符串是否与程序中预置的字符串相等,相等则成功,否则失败。
接下来,我们用UPX压缩壳来对这个CrackMe进行加壳压缩。对CrackMe进行压缩处理之后就可以进行我们的SMC Patch技术测试了。
好了,现在把压缩后的程序载入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成功!