="1">pushad ; sub_restore_replace_code 0057d02f 33c0 xor eax,eax 0057d031 bf 610d5800 mov edi,00580d61 0057d036 833c07 00 cmp dword ptr ds:[edi+eax],0 0057d03a 74 07 je short 0057d043 0057d03c 803407 d7 xor byte ptr ds:[edi+eax],0d7 0057d040 40 inc eax 0057d041 ^ eb f3 jmp short 0057d036 0057d043 33c9 xor ecx,ecx 0057d045 8b348d 81de5700 mov esi,dword ptr ds:[ecx*4+57de81] 0057d04c 83fe 00 cmp esi,0 0057d04f 75 06 jnz short 0057d057 0057d051 61 popad 0057d052 832c24 05 sub dword ptr ss:[esp],5 ; f4直接执行到这里 0057d056 c3 retn 执行完毕后把eip改回原处修复好replace code和embedd protect code之后,修复一下iat和oep信息就可以运行了。 总结一下,为了方便自己操作,我写了一段脚本。 /* acprotct 1.4 unpack script v0.1 */ var addr var mbase //module base var rmaddr var rmsize var iatva var tmpval start: gmi eip,modulebase mov mbase,$result gpa "getmodulehandlea","kernel32.dll" mov addr,$result bprm addr,0a esto lbl1: bpmc findop eip,#f3aa# //find command 'rep stosb' cmp $result,0 je lblabort go $result mov addr,$result add addr,2 mov eip,addr mov rmaddr,4b7000 //rdata段的开始地址 mov rmsize,a000 //rdata段的大小 bpwm rmaddr,rmsize esto lbl2: bpmc mov iatva,esi mov tmpval,esi sub iatva,mbase //计算iat的地始地址va findop eip,#83660c00# //find command 'and dword ptr ds:[esi+c],0' cmp $result,0 je lblabort fill $result,4,90 repl eip,#602bc0880343380375f961#,#9090909090909090909090#,500 //把清除名字的代码给nop掉 find $result,#618907# cmp $result,0 je lblabort go $result mov addr,$result inc addr fill addr,2,90 findop addr,#33c0# cmp $result,0 je lblabort mov addr,$result go addr log iatva fill 6909c7,1,eb ret lblabort: msg "error!" ret 用od载入目标程序,运行该脚本,然后把前面dump下来修复好的embedd protect代码段替换这个现在正在操作的这个目标,然后用修复replace code 的代码修复replace code,修复完,被上程序的oep被抽的代码,然后dump下目标程序的整个内存,修改oep,修改正确的iat信息,iat信息由分析篇 得之:oep rva=000b2d84 iat rva=000beb88 size=00002398,修复好后程序就可以运行了。这样就算是比较完整的脱壳了,最后我自己还有一个问题 哪位会的朋友指点下,谢谢,问题:壳把部分资源放到最后一个节去了,如何修复资源呢?, 对这个我一点都不会:-(。如果资源修复好了,最后一个节 应该可以去掉吧。 在脱其它的acprotect的程序时发现有时还会有调用壳的api的代码,我这里附上修复调用壳api的代码: .386 .model flat,stdcall .code fillcode proc cmpaddr:dword,waddr:dword ;---------------- ;cmpaddr 表示比较地址 ;waddr 要写入地址 pushad mov edi,401000h mov ecx,0baf00h @loop1: cmp word ptr [edi],25ffh jnz jmpn mov ebx,[edi+2] cmp ebx,401000h jb jmpn cmp ebx,521000h ja jmpn mov ebx,[ebx] cmp cmpaddr,ebx jnz @f mov ebx,edi mov eax,waddr sub ebx,eax sub ebx,5 mov dword ptr [eax+1],ebx jmp @end @@: