摘要:
一. 概念 JDK: Java Development Kit JRE: Java Runtime Environment 开发程序时安装JDK即可,会自动安装JRE,用户的运行环境安装JRE即可。 JDK安装目录种有javac程序,它是java编译器。 安装完毕后配置JAVA_HOME和CLASS 阅读全文
摘要:
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 阅读全文
摘要:
DEP:数据执行保护,不能再没有执行权限的页面上执行代码。链接选项可设置软件层面的DEP,对应PE头中IMAGE_OPTIONAL_HEADER的IMAGE_DLLCHARACTERISTICS_NX_COMPAT ROP突破DEP: 工具介绍: 安装ImmunityDebugger.exe,把mo 阅读全文