在程序在生成另一个程序
这是个很古老的话题了,相信大家都有所了解.本来我也不想多说. 但近日在论坛上,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,在搜索,写入数据(或读取)的时候要稍做转换
但愿我的表达能力能让大家看得明白..阿门

|