随笔分类 - 逆向工程
摘要:1. 全局变量通过函数初始化 初始化时机在main函数之前,对于VC6,具体来说是在mainCRTStartup -> _cinit -> 第2个_initterm中。此函数接收2个参数,通过遍历,找到函数指针并调用。逆向时找到push两个参数的地方,以这2个参数作为地址的上下边界,寻找其中非0的值
阅读全文
摘要:1. x87浮点指令: 相当于栈结构,st(0)是栈顶。 __asm { fld flt1 //float load fld flt2 fadd st(0), st(1) //float add faddp st(1), st(0) //float add and pop 结果加到st(1)中,之后
阅读全文
摘要:1. 全局变量 全局变量访问方式是立即数间接访问 普通全局变量和const全局常量分布在不同的内存分页中,satic全局变量和普通全局变量没有区别: const int g_nTest1 = 123; int g_nTest2 = 456; static int g_nTest3 = 789; in
阅读全文
摘要:1. case分支个数小于等于3时,有多个sub,jz引导代码,它们之间没有具体代码,这是和if结构的区别。 release版的defalut紧随其后: debug版是jmp到default: 2. case分支间隔较为均匀时,所有跳转地址组成表,通过下标jmp到对应的地址。 3. case分支间隔
阅读全文
摘要:一. if语句的还原 1. if 1.1 debug版if的还原:以条件跳为上界,跳转到的地址为下界,做还原工作。 1.2 release版类似: 2. if else的还原 2.1 debug版:以条件跳为上界,跳转到的地址为中界,中界前有向下的跳转,说明不是循环,以此跳转到的地址为下界,做还原工
阅读全文
摘要:一. 模运算 1. 无符号 1.1 对2的幂取模 printf("%d", argc % 8); //无符号数argc mov eax,dword ptr [argc] and eax,7 ; argc & (2^n - 1) push eax push offset string "%d" cal
阅读全文
摘要:有符号除法:cdq, and, add, sar,也可能被优化为 lea esi, [eax, edx], sar esi, C 函数调用后不保证eax,ecx,edx的值不变。 代码还原时,可以给变量取名为对应的寄存器名称,找bug时对比自己程序的变量名和原程序的寄存器,看两者值是否相等,不相等说
阅读全文
摘要:右移是向下取整操作,对于除法A/C,当C>0且C不是2的幂时,除法转乘法(magic无进位): if (A > 0) { AM >> n; //正数直接右移 } else { (AM >> n) + 1; //负数右移后要 +1 } 还原: 2^33 / 66666667h 得5 int nVal
阅读全文
摘要:无符号数除以非2的幂: magic number无进位 int main(unsigned int argc, char *argv[]) { printf("%d", argc / 3);//注意被除数是unsigned return 0; } .text:00401043 mov eax, 0A
阅读全文
摘要:常量折叠:表达式参与的计算因子都是常量时,编译时求值,不产生运算指令: 4: int a = 4 * (7 - 8) / 45 * (4 + 34) + 43; 0040D748 C7 45 FC 2B 00 00 00 mov dword ptr [ebp-4],2Bh 常量传播:当一个变量初始化
阅读全文

浙公网安备 33010602011771号