处理ASProtect的Advanced Import Protect的一些想法和过程(2)
从1中知道,ASProtect把CALL [***]和JMP [***]变成CALL &&&&&,在内存中调用API后加到CODE段中CALL &&&&的下一句还是其他地方呢?
在call入12000000内后会两次调用VirtualAlloc得到两个内存,第一个记为00dd0000,第二个为00cc0000;大小都为1000.
考虑以下情况:
00401000 call 402008
.........
00402008 call 01200000这是进入到内存中了,在内存中会把这句修改为call 00cc0004,再回到本句执行call 00cc0004,再从00cc0004进入到00DD0000,也就是从00dd0000中进入系统API,那从系统API加到后是到0040200d呢还是401005呢?一定是401005啊!!!那系统怎么会知道回到401005而不是40200d呢?其实系统只知道根据堆栈顶的那个值返回,堆栈顶指向哪,它就回到哪。。。
在进入00cc0000时栈顶有两个值,[esp]=40200d [esp+4]=401005,正如我所想,在00cc0000中有一个进入系统前的预处理,有这一句 LEA ESP,[ESP+4] ,机器码是
8D 64 24 04 ,当然也有可能在其它程序中是add esp,4 (机器码是83 C4 04) 还有可能是其它形式,总之效果是一样的,在进入系统时[esp]=401005就行了。
再看一种情况:
原来的call [***]直接变成 call 01200000
call [***]占据6个字节,但是call 01200000只占据5个字节,从系统返回到CODE段时要返回到没有加壳前返回的地方,也要有个预处理,执行行这样一句:INC [esp]
或者等效的表达,机器吗是FF 04 24
为什么会在00cc0000中写入这个指令呢?现在就是找某个判定,判定成立,就写,不成立就不写;或者本来壳程序已经记录好了,call 12000000在CODE中的位置越靠后,在内存中填充第二个内存的数据越在后,或者是其他位置关系。。。。
下面是我找的思路:
1、从call 01200000进入1200000中,找到API地址后会两次调用VirtualAlloc,第 一次得到00DD0000,在里面写入抽取的系统API部分代码;第二次调用VirtualAlloc得到00CC0000,在里面写入预处理代码;
2、对VirtualAlloc下断点 bp,得到内存后00DD0000和00CC0000,在内存下写入断点,就会找到在
00AC2685 F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]这句向00CC0000中写入了8D 64 24 04 ,根据ESI的值找到机器码在内存中B425F6处,