能力值:
( LV2,RANK:10 )
|
-
-
2 楼
高人出现啊,请教请教
万分感谢!!!
|
能力值:
(RANK:260 )
|
-
-
3 楼
没明白你的意思。问题描述得不够清楚是没有人回答的很重要的原因。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
不好意思,我再重新说一下:
就是说在vc建一个控制台工程,代码如下:
#include <iostream>
using namespace std;
void main()
{
int i=1;
cout < <"i在内存中的地址是:\"" < <&i < <"\"" < <"\n";
system("pause");
}
将这个代码编译exe,比如是1.exe,重新建立一个控制台工程,代码如下:
#include <iostream>
using namespace std;
void main()
{
int i=1;
int j=2;
cout < <"i在内存中的地址是:\"" < <&i < <"\"" < <"\n";
cout < <"j在内存中的地址是:\"" < <&j < <"\"" < <"\n";
system("pause");
}
将这个代码编译exe,比如是2.exe
我的问题:就是在只有1.exe的情况下,如何修改、使用什么工具修改,才能改成和2.exe一样的功能?
请教请教,谢谢先!
|
能力值:
(RANK:260 )
|
-
-
5 楼
在只有二进制文件没有源码的情况下,给程序增加功能,必然要给程序打补丁。
方法也有很多种。一种方法是将所要增加的功能写成一个函数,放到一个dll中,然后在程序中patch代码来调用dll中的函数。
另一种方法,适用于只要增加简单的功能的情况,就是直接用patch代码来实现所需要的功能。
总之,不管什么方法,对原来的程序进行修改,都必须掌握一定的汇编语言的基本功。
比如你的例子,相当于要在1.exe中自己手写汇编代码来实现编译器由
cout < <"j在内存中的地址是:\"" < <&j < <"\"" < <"\n";
生成的同等功能的代码。
首先要定位到要插入功能代码的位置,本例中是以下这行代码之前
cout < <"i在内存中的地址是:\"" < <&i < <"\"" < <"\n";
要在反汇编代码中准确地认识哪条指令是属于源代码中哪个功能语句的。
找到合适的patch点,记住原来的指令是什么,因为patch要破坏掉一部分指令,为保证程序不出错,最后还必须恢复之。
常规的patch方法就是把要增加的代码写到.text节尾部那些0000的地方,然后在patch点插入一条jmp指令跳转到增加的代码当中执行,代码最后将被jmp指令破坏的指令还原后再jmp回patch点之后那里即可。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
版主真是厉害啊!!!
原理说的真是透彻!!!
万分感谢!!!
我学过汇编,就是不精,不知“常规的patch方法就是把要增加的代码写到.text节尾部那些0000的地方,然后在patch点插入一条jmp指令跳转到增加的代码当中执行,代码最后将被jmp指令破坏的指令还原后再jmp回patch点之后那里即可”这样的技术哪里有教程?最好是对入门要求不高的教程
再一次致谢!!!
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
第二种似乎比较容易出错。不过第一种不知道怎么弄,想学习
|
|
|