首页
社区
课程
招聘
[原创]新手从开发角度学习调试
发表于: 2009-5-29 03:16 2885

[原创]新手从开发角度学习调试

2009-5-29 03:16
2885
从一个最简单的例子入手,假设正确的程序如下,

#include "stdafx.h"
#include <stdio.h>

int _tmain(int argc, _TCHAR* argv[])
{
    int x = 0;
    if (x == 3)
    {
        printf("True !\n");
    }
    else
    {
        printf("False !\n");
    }
    return 0;
}

在VC里面看汇编代码如下
...
     9:     int x = 0;
00411A4E C7 45 F8 00 00 00 00 mov         dword ptr [x],0
    10:     if (x == 3)
00411A55 83 7D F8 03      cmp         dword ptr [x],3
00411A59 75 0F            jne         main+3Ah (411A6Ah)
    11:     {
    12:         printf("True !\n");
00411A5B 68 28 40 42 00   push        offset string "True !\n" (424028h)
00411A60 E8 32 FA FF FF   call        @ILT+1170(_printf) (411497h)
00411A65 83 C4 04         add         esp,4
    13:     }
    14:     else
00411A68 EB 0D            jmp         main+47h (411A77h)
    15:     {
    16:         printf("False !\n");
00411A6A 68 1C 40 42 00   push        offset string "Error!\n" (42401Ch)
00411A6F E8 23 FA FF FF   call        @ILT+1170(_printf) (411497h)
00411A74 83 C4 04         add         esp,4

...
------------------------------------------------------------------
假设不小心把上面 if 条件中的 == 写成了 赋值 =,就变成
     9:     int x = 0;
00411A4E C7 45 F8 00 00 00 00 mov         dword ptr [x],0
    10:     if (x = 3)
00411A55 C7 45 F8 03 00 00 00 mov         dword ptr [x],3
00411A5C 83 7D F8 00      cmp         dword ptr [x],0
00411A60 74 0F            je          main+41h (411A71h)
    11:     {
    12:         printf("True !\n");
00411A62 68 28 40 42 00   push        offset string "True !\n" (424028h)
00411A67 E8 2B FA FF FF   call        @ILT+1170(_printf) (411497h)
00411A6C 83 C4 04         add         esp,4
    13:     }
    14:     else
00411A6F EB 0D            jmp         main+4Eh (411A7Eh)
    15:     {
    16:         printf("False !\n");
00411A71 68 1C 40 42 00   push        offset string "Error!\n" (42401Ch)
00411A76 E8 1C FA FF FF   call        @ILT+1170(_printf) (411497h)
00411A7B 83 C4 04         add         esp,4
    17:     }
----------------------------------------------------------------------
比原来多了一句
mov         dword ptr [x],3; C7 45 F8 03 00 00 00
判断条件由
cmp         dword ptr [x],3; 83 7D F8 03
变成了与0比较了
cmp         dword ptr [x],0;  83 7D F8 00
跳转指令由
jne         main+3Ah (411A6Ah) ;如果不相等就跳到else分支;机器码 75 0F
变成了
je          main+41h (411A71h) ;如果等于0就到else分支;机器码
74 0F

我现在想把这个改为正确的程序
首先可以看到在程序中if 的 地址 00411A55  
文件地址 = 00411A55  - 00410000 = 1a55H
//基地址为0x400000
// 0x010000的那个有点不明白,那位大大讲解一下

这样,我只需要修改
1. 判断条件,改为与3比较
2. 跳转指令,改为不相等时跳转
3. 多出的一句将3的值赋给x,由于汲及到跳转的地址,删除的话,我也不太会计算新的地址,
所以就直接给他赋值0好了,不影响原来的值

用UtralEdit 打开exe文件,找到1a55H
先修改赋值
由C7 45 F8 03 00 00 00 改为
C7 45 F8 00 00 00 00
再改判断条件
由83 7D F8 00改为
83 7D F8 03
最后改跳转指令
74 0F
75 0F

到这里,程序算是改正确了

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
2
现代的编译器,对if语句中的赋值语句是可以发警告的。老式的编译器不行。
2009-5-29 17:22
0
游客
登录 | 注册 方可回帖
返回
//