![]() |
Unpack Acprotect 1.21 (三)程序修复 |
呵呵,又回家了。各位兄弟好! 该说说这第三个问题了。前有shinegood的脱壳版,后有tDasm的修复文章,我这个不会又...?管他的,一则说过的话总要兑现,二则各有各的方法,更何况他们的不是都还有点问题吗。(二者使用了相同的方法来修复) 修复中主要要解决的是Replace Code的地址,一般情况下,程序把Replace Code放到堆中执行,堆的结构由壳代码初 始化时建立,这样,去了壳的程序就会出错。这里采用的方法就是修改放置Replace Code的地址。 od载入已修复iat的程序,隐藏od、忽略所有异常、eip定位到修复的oep、在6d540c处设断,执行程序。断下光标移到6b55b7,按F4,看到: 006D55B7 CALL Acprotect.006E1460 006D55BC MOV EAX,DWORD PTR SS:[ESP+20] ;获得返回地址 006D55C0 XOR ECX,ECX 006D55C2 MOV EBX,DWORD PTR SS:[EBP+ECX*4+4026E2] ;取表中元素 006D55C9 ADD EBX,DWORD PTR SS:[EBP+40D2AA] ;加Image Base 006D55CF CMP EAX,EBX ; 006D55D1 JE SHORT Acprotect.006D55DA ;查表 006D55D3 NOP 006D55D4 NOP 006D55D5 NOP 006D55D6 NOP 006D55D7 INC ECX 006D55D8 JMP SHORT Acprotect.006D55C2 ;再找 006D55DA MOV DWORD PTR SS:[EBP+ECX*4+4026E2],0 ;找到后把这个元素从表中删除 006D55E5 LEA ESI,DWORD PTR SS:[EBP+4055C2] ;取(变形)Replace Code表基地址 006D55EB MOV EAX,0A 006D55F0 MUL ECX 006D55F2 ADD ESI,EAX ;得到本次应取(变形)Replace Code地址 006D55F4 PUSH ESI 006D55F5 PUSH ECX 006D55F6 MOV AL,BYTE PTR SS:[EBP+4023FC] ;取还原Replace Code的操作数 006D55FC OR AL,AL 006D55FE JNZ SHORT Acprotect.006D5628 ;跳,则操作数已经存在 006D5600 NOP 006D5601 NOP 006D5602 NOP 006D5603 NOP 006D5604 MOV EAX,DWORD PTR SS:[EBP+40D2AA] ; 006D560A MOV ESI,DWORD PTR DS:[EAX+3C] ; 006D560D ADD ESI,DWORD PTR SS:[EBP+40D2AA] ; 006D5613 ADD ESI,28 ; 006D5616 LODS DWORD PTR DS:[ESI] ;得到Entry Point值 |