找到常量call之后要先找个代码注入工具测试一下是不是想要找的call,一般用CodeinEX这个工具。说下写测试call的时候要注意到的细节,当然在写代码的时候也需要同样的注意。
1. push数据的时候必须是常量,不能是类似push eax等类似代码
2. 注意堆栈平衡,加入call之前有4个push,call里面结尾如果有retn 0x10,call下边一般没有add esp,0x10这样的call测试的时候直接调用call就可以了;相反如果call里面结尾如果没有retn 0x10,call下边一般有add esp,0x10这样的call测试的时候要加上add esp,0x10
3. 注意call的里面有没有来自call外边的寄存器的值,例如常见的ecx,eax。一般在C++程序里面会把类对象指针放在ecx里面,call的时候call里面的ecx值取自call外面的ecx值,一般的call的返回值会放在eax里面,如果call里面有取eax的值,在call外面寻找eax的值得时候要注意外面的call有无将返回值放在eax里面
4. push数据有时也有基地址的查找,例如push eax,这个时候要寻找eax的来源,例如eax来自[ebx+0x10],这是要接着寻找ebx的来源,ebx来自[edi+0x20],要一层以上找到最初始的常量,例如 push [[[[00401000+0x40]+0x30]+0x20]+0x10]