c&c++反汇编与逆向分析学习笔记(6)--减法表达式

时间:2021-04-09 23:55:03
减法运算对应于汇编指令SUB,虽然计算机只会做加法,但是可以通过补码转换将减法转换为加法形式来完成。
    //C++源码
    int nVarOne = argc;//变量定义
    int nVarTwo = 0;
    scanf("%d",&nVarTwo);//获取变量nVarTwo的数据,使用scanf防止变量被常量化
    nVarOne = nVarOne - 100;//变量减常量的减法运算
    nVarOne = nVarOne + 5 - nVarTwo;//减法与加法混合运算
    printf("nVarOne = %d\n",nVarOne);

    //C++源码与反汇编代码讲解
    //C++
    nVarOne = nVarOne -100;
    //反汇编
    mov eax,dword ptr [ebp-4]//取变量nVarOne的数据到eax中
    sub eax,64h//使用sub指令,对eax执行减100操作
    mov dword ptr [ebp-4],eax//将结果赋值回nVarOne中
    
    //C++
    nVarOne = nVarOne + 5 - nVarTwo;
    //反汇编
    //按照自左向右顺序依次执行
    mov ecx,dword ptr [ebp-4]
    add ecx,5
    sub ecx,dword ptr [ebp-8]
    mov dword ptr [ebp-4],ecx
    减法运算没有使用加负数的表现形式。在实际的分析中,根据加法操作数的情况,当加数为负数时,执行的并非加法而是减法操作。
    另外,编译器优化策略与加法相同。