c/c++逆向
code_greenhand
这个作者很懒,什么都没留下…
展开
-
异常
定位异常处理函数示例代码#include <iostream>#define INTTYPE 0#define FLOATTYPE 1#define DOUBLETYPE 2#define CHARPTRTYPE 3#define CHARTYPE 4#define INTPTRTYPE 5using namespac...原创 2019-12-24 22:25:13 · 236 阅读 · 0 评论 -
多重继承和菱形继承.
多重继承子类同时继承多个父类汇编特征在子类自身构造中会复写两次虚表。在父类2指向子类的时候,会产生三木目运算的表达式代码示例class Father1{ public: Father1(){}//空构造 virtual ~Father1(){} //空析构 virtual void Player(){} //玩耍的函数 ...原创 2019-12-24 22:15:11 · 124 阅读 · 0 评论 -
继承和虚函数
虚函数特征1.构造和析构中会填写虚表指针先调用父类构造,先填写父类虚表指针,再执行父类构造函数体后调用子类构造,填写子类虚表指针,执行子类构造函数体析构与上述相反(先子类,再父类)2.虚表特征虚表存放在只读数据区虚表中每个成员都是成员函数指针3.以填写虚表为界限填写虚表上面是初始化列表填写虚表下面是构造/析构函数体4.当有虚表的时候,默认就会提...原创 2019-12-24 21:58:55 · 550 阅读 · 0 评论 -
不同作用域对象的构造析构调用时机
全局变量和全局静态变量使用vc栈回溯发现这里构造的栈结构因为atexit的参数的c约定回调,而析构是thiscall,调用约定,所以内部必须包含一层E2才可以,在使用E2调用析构,而不是直接注册析构atexit可以注册多个回调,而这些会是一个线性表,里面储存了你注册的函数地址.当main函数结束的时候会调用1.会在ininterm里面进行初始化动作2.会产生代理函数,这个代理函数...原创 2019-12-24 21:38:51 · 408 阅读 · 0 评论 -
类中识别构造和析构和成员函数
识别构造函数构造必要条件1.本作用域第一次调用的成员函数2.调用约定必须是__thiscall第一个参数为this指针(离call最近的一个)默认使用ecx传参3.构造的返回值为this指针代码示例#include <string.h>#include <stdio.h>class CTest{ int m_nID; flo...原创 2019-12-22 23:42:00 · 104 阅读 · 0 评论 -
结构体
内联C库函数部分简单的C库函数在编译时可能会直接内联strlen代码定式lea edi, szAryor ecx, 0FFFFFFFFhxor eax, eaxrepne scasb ;[szAry] ==eax or ecx == 0时退出 这里判断是否到0(数字0==字符\0)为止not ecx ;把...原创 2019-12-22 21:32:03 · 206 阅读 · 0 评论 -
浮点指令
第一代:x87浮点指令集特征使用80位浮点协处理器处理浮点运算浮点协处理器内部为栈结构运算过程指令这里只介绍部分指令,详细的参考Intel / AMD 开发手册;入栈fld st(i) ;将st(i)的值压入栈顶fld mem32/mem64/mem80 ;将浮点数压栈 交给st(0) 同时原st(0)交给st(1);加法fadd...原创 2019-12-22 15:50:49 · 1044 阅读 · 0 评论 -
函数和数组
函数函数调用约定__cdecl:调用方(函数外)平栈int __cdecl FunTest(int n1, int n2, int n3){ return n1 + n2 + n3;}int main(int argc, char* argv[]){ FunTest(1, 2, 3); printf("%d\n",100); return 0;}...原创 2019-12-12 12:41:00 · 176 阅读 · 0 评论 -
循环和变量
循环do…whiledo…while 代码定式,debug和release差不多while_begin:... ... ;中间部分为循环体...JXX while_begin ;注意这里为上跳示例int main(int argc, char* argv[]){ int nSum = 0;...原创 2019-12-11 12:45:26 · 422 阅读 · 0 评论 -
swtich case
1.case情况 <= 3种,语句块较少DEBUG switch (argc) { case 0: printf("case 0\n"); break; case 1: printf("case 1\n"); break; case 2: printf("case 2\n"...原创 2019-12-10 23:12:11 · 266 阅读 · 0 评论 -
三目运算符和条件语句
#跳转指令有符号Great:大于Less :小于Equ : 等于无符号Above:大于Blow :小于Equ : 等于三目运算定式低版本优化优化条件:三目运算操作数均为常量10!=5?5:7;变量 != A ? B : C 且 B < Csub reg,A ;如果A为0 则这一步省略neg reg ;...原创 2019-12-10 00:22:38 · 608 阅读 · 0 评论 -
取模
经典的取绝对值方式cdq xor eax, edx ;edx=0 xor 0值不变 edx=1 xor 1就是取反 sub eax, edx ;edx=0 sub 0值不变 edx=1 sub -1就是加1,如果被除数是负数则是取反加1,那就是取绝对值了取模优化有符号带幂优化优化思路有两种第一种带分支的:就是余数<除数 ...原创 2019-12-09 22:52:00 · 1110 阅读 · 0 评论 -
除法逆向
除法除数为变量的时候是没有优化,只能使用除法指令,我说的变量是和argc这类在编译期间不能计算的变量,如果不是的话则会进行常量传播优化,也就当成常量去优化除法了向下取整:取一个数的小于这个数的最大整数,如3.5 向下则是3向上取整:取一个数的大于这个数的最小整数,如3.5 向上则是4向0取整:坐标轴靠近0的整数,3.5是3,-3.5是-31两个无符号整数相除,结果还是无符号的2两个有符...原创 2019-12-07 14:22:58 · 647 阅读 · 0 评论 -
加减乘符号逆向
编译器优化的几种方式常量折叠: 指的是在编译期间遇到的常量,都可以进行计算的,得出一个新的常量值常量传播:指的是在编译期间可以计算出结果的变量转换为常量值加法Release版1常量加常量 printf("10+5=%d\n", 10 + 5);2变量加常量 int nVal1 = 0x10; printf("%d", nVal1 + 5);3变量加变量...原创 2019-12-04 23:22:58 · 194 阅读 · 0 评论 -
IDA生成sig签名文件
IDA介绍IDA是一款强大的静态分析(程序不需要运行时直接查看汇编)工具,OD相反,OD是强大的动态追踪(程序运行时分析)工具IDA签名的作用因为有些版本的IDE在release版本下IDA识别不了库的函数名,如我在vc6.0下选择MT(多线程静态编译),release版本编译一个pritnf的程序代码如下:int main(int argc, char* argv[]){ p...原创 2019-12-03 22:31:18 · 2164 阅读 · 0 评论