在程序在生成另一个程序
这是个很古老的话题了,相信大家都有所了解.本来我也不想多说.
但近日在论坛上,QQ上被网友问到,要生成一个程序,并且要在该程序中指定一些资料,如Email和QQ,又要如何做呢?
这个问题让我想起了"金山游侠".以前玩游戏的时候,很喜欢用它来修改游戏,除了强大的功能后,还提供了一个专用修改器制作工具.制作出来的专用修改器只是一个单独的EXE文件,对每一个地址都有一定的说明,(如说明这个地址是金钱还是体力等),还有一些制作者的资料等等.它是如何做出来的呢?这个问题还真是难答---因为方法有很多,而目的只有一个:只要能把那些资料保存在EXE文件里面就可以了
现在的问题是:那些资料要保存在哪里?如何访问那些资料?我们来看个简单的代码:
int i,j;//全局变量
void main()
{
printf("i=%d j=%d/n",i,j);
}
i和j的值是多少?鬼知道是多少
这样知道了吧?
int i=0,j=1;
靠,当然知道了!!!那么请回答我一个问题:
int i=0 与int i 有什么区别?
一个已经初始化另一个未初始化?仅仅如此??
非也非也!它们两个的区别大得很呀,比如说
(略过PE知识一万二千三百四十五点六个字)
对于本文来讲,最大的区别就是:
int i 未分配到文件空间
int i=0 已分配到文件空间
换句话来讲就是 int i=0 后面的那个 0 是存在于EXE文件的内部的!
什么意思??
什么意思!!就是说,我们只要找那 0 保存在文件的哪个位置就可以了随心改变它的值了!
那怎么找呢?
(为了方便查找,我们给 i 取另个一个初始值,比如int i=0x12345678;)
由于编译后的文件是一个二进制文件,我们当然要用二进制编辑工具来查找了,可是,由于我不知道有那些二进制编辑工具
只好用十六进制编辑工具来完成了,WinHex,UltraEdit等都可以
(广告时间:小弟也写过一个十六进制编辑工具,名为xHex,它只出现在www.aogosoft.com供学习之用,大家也可一试)
用WinHex打开EXE文件,按Ctrl+Alt+F,输入78563412(注意顺序),按回车键.如果没找到,表示你的操作有误,请重来
找到后再按一次F3,如果这时显示没找到,恭喜你,刚才找到的地址就是i的藏身之地,试试把它改为其它值,再运行程序,是不是变了?
没变??请回到WinHex,按Ctrl+S
如果按F3后还有找到的话,请改变i的初始值,或者也给j初始值,如int i=0x1235678,j=0xABCDEF 然后查找78563412EFCDAB,直到只能找到一次为止
其实,还有一个更简单的方法:
就是先看一下i的地址,一般来讲,它的地址是40xxxx,那么它在文件中的地址就是xxxx
(不同的编译器可能有不同的结果,我用的是VC6.0)
来到这里,你应该知道如何指定程序里的EMail或QQ了吧??
请把下面的程序生成EXE后再用WinHex改变EMail和QQ值
char sEMail[255]={0};
char sQQ[255]={0};
void main()
{
printf("your email was:%s /nand your qq was:%s/n",sEMail,sQQ);
}
其实,除了用全局变量外,还可以用资源文件,将数据追加到EXE文件的尾部等方法来实现
对于VB程序员来讲,原理与做法也是一样的,只要定义好一个字符串变量,那么这个字符串就会存在于EXE文件内
但由于VB用的是UNICODE,在搜索,写入数据(或读取)的时候要稍做转换
但愿我的表达能力能让大家看得明白..阿门