这是一个SMC补丁的里面的实例,他的方法有一步我完成不了,就自己分析了。大家感兴趣的可以看下。
以下完全自己的看法,如果和大家的看法不同,帮忙指出来一下,谢谢。
SMC补丁:在外壳中就是动态修改代码,由我们把我们的SMC代码写进磁盘文件,然后我们动态引导外壳处理。
先说下第一步:ASProtect外壳有4个解密代码的地址.我们要引导这4个地址,这几个地址都是JMP的形式存在。
jnz Decode
jmp xxxxxx2 修改为我们的地址。因为是动态解码,我们修改下面的地址,就会解码错误
jnz Decode1
jmp xxxxxx3这样依次修改到最后一个解码的地址,就是静态代码了
00468037 50 PUSH EAX
00468038 53 PUSH EBX
00468039 FFB5 ED090000 PUSH DWORD PTR SS:[EBP+9ED]
0046803F 8D45 35 LEA EAX,DWORD PTR SS:[EBP+35]
00468042 50 PUSH EAX
00468043 E9 82000000 JMP InlineMe.004680CA ; 跳到解码地址一
0046816F 81E8 01000000 SUB EAX,1
00468175 0F85 19000000 JNZ InlineMe.00468194 ; 判断解码代码的大小,是否继续解码
0046817B E9 2E000000 JMP InlineMe.004681AE ; 跳到解码地址二
00468246 4B DEC EBX
00468247 81FB 34F9FFFF CMP EBX,-6CC ; 以负数形式比较大小
0046824D 0F85 0C000000 JNZ InlineMe.0046825F ; 判断是否继续解码
00468253 8BD1 MOV EDX,ECX
00468255 E9 27000000 JMP InlineMe.00468281 ; 跳向解码地址三
00468354 81EE 01000000 SUB ESI,1 ; 解码大小
0046835A 0F85 0B000000 JNZ InlineMe.0046836B ; 判断解码大小
00468360 E9 23000000 JMP InlineMe.00468388 ; 跳向解码地址4
00468419 83EE 01 SUB ESI,1 ; 解码大小
0046841C ^ 0F85 9DFFFFFF JNZ InlineMe.004683BF ; 判断解码大小
00468422 B4 02 MOV AH,2 ; 断点
004684CB 6A 40 PUSH 40
004684CD 68 00100000 PUSH 1000
004684D2 FFB5 08040000 PUSH DWORD PTR SS:[EBP+408] ; 大小
004684D8 6A 00 PUSH 0
004684DA FF95 F0030000 CALL DWORD PTR SS:[EBP+3F0] ; VirtualAlloc分配内存
004684E0 8985 CC010000 MOV DWORD PTR SS:[EBP+1CC],EAX ; EAX=00970000
004684E6 8B9D 00040000 MOV EBX,DWORD PTR SS:[EBP+400]
004684EC 039D 0D040000 ADD EBX,DWORD PTR SS:[EBP+40D]
004684F2 50 PUSH EAX
004684F3 53 PUSH EBX
004684F4 E8 04010000 CALL InlineMe.004685FD ; 解码函数
004684F9 6A 40 PUSH 40
004684FB 68 00100000 PUSH 1000
00468500 FFB5 08040000 PUSH DWORD PTR SS:[EBP+408] ; 大小
00468506 6A 00 PUSH 0
00468508 FF95 F0030000 CALL DWORD PTR SS:[EBP+3F0] ; VirtualAlloc分配内存
0046850E 8985 31040000 MOV DWORD PTR SS:[EBP+431],EAX ; EAX=009C0000
00468562 8B7C1A 0C MOV EDI,DWORD PTR DS:[EDX+EBX+C]
00468566 0BFF OR EDI,EDI
00468568 74 1E JE SHORT InlineMe.00468588
0046856A 8B4C1A 10 MOV ECX,DWORD PTR DS:[EDX+EBX+10]
0046856E 0BC9 OR ECX,ECX
00468570 74 11 JE SHORT InlineMe.00468583
00468572 03BD D0010000 ADD EDI,DWORD PTR SS:[EBP+1D0]
00468578 8B741A 14 MOV ESI,DWORD PTR DS:[EDX+EBX+14]
0046857C 03F2 ADD ESI,EDX
0046857E C1F9 02 SAR ECX,2
00468581 F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>
00468583 83C3 28 ADD EBX,28
00468586 ^ EB DA JMP SHORT InlineMe.00468562
004685E0 53 PUSH EBX
004685E1 68 00800000 PUSH 8000
004685E6 6A 00 PUSH 0
004685E8 56 PUSH ESI ; 第一次的VirtualAlloc的地址
004685E9 FF95 F4030000 CALL DWORD PTR SS:[EBP+3F4] ; VirtualFree
004685EF 68 0010A000 PUSH 0A01000 ;返回到这个虚拟空间地址
004685F4 C3 RETN
00A010B6 6A 04 PUSH 4
00A010B8 68 00100000 PUSH 1000
00A010BD 68 46050000 PUSH 546 ; 大小
00A010C2 6A 00 PUSH 0
00A010C4 FF95 79294400 CALL DWORD PTR SS:[EBP+442979] ; VirtualAlloc
00A010CA 8985 75294400 MOV DWORD PTR SS:[EBP+442975],EAX ; EAX=00970000
00A010D0 8D9D 452A4400 LEA EBX,DWORD PTR SS:[EBP+442A45]
00A010D6 50 PUSH EAX
00A010D7 53 PUSH EBX
00A010D8 E8 74050000 CALL 00A01651 ; 再次解码,第2次中的压缩代码到第3次的VirtualAlloc
00A010DD 8BC8 MOV ECX,EAX
00A010DF 8DBD 452A4400 LEA EDI,DWORD PTR SS:[EBP+442A45]
00A010E5 8BB5 75294400 MOV ESI,DWORD PTR SS:[EBP+442975]
00A010EB F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] ; 解压出来的代码重新复制到第2次VirtualAlloc的空间
00A010ED 8B85 75294400 MOV EAX,DWORD PTR SS:[EBP+442975]
00A010F3 68 00800000 PUSH 8000
00A010F8 6A 00 PUSH 0
00A010FA 50 PUSH EAX ; 第3次的地址
00A010FB FF95 7D294400 CALL DWORD PTR SS:[EBP+44297D] ; VirtualFree
00A01101 8D85 512C4400 LEA EAX,DWORD PTR SS:[EBP+442C51]
00A01107 50 PUSH EAX ; jmp 0xA0130D
00A01108 C3 RETN
00A01339 6A 04 PUSH 4
00A0133B 68 00100000 PUSH 1000
00A01340 50 PUSH EAX
00A01341 6A 00 PUSH 0
00A01343 FF95 79294400 CALL DWORD PTR SS:[EBP+442979] ; VirtualAlloc
00A01349 8985 75294400 MOV DWORD PTR SS:[EBP+442975],EAX ; EAX=00970000
00A0134F 56 PUSH ESI
00A01350 8B1E MOV EBX,DWORD PTR DS:[ESI]
00A01352 039D D8304400 ADD EBX,DWORD PTR SS:[EBP+4430D8]
00A01358 50 PUSH EAX
00A01359 53 PUSH EBX
00A0135A E8 F2020000 CALL 00A01651 ; 再次解码
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)