从一个最简单的例子入手,假设正确的程序如下,
#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
到这里,程序算是改正确了
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)