本文主要是介绍使用反汇编强力破解单机游戏外挂,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
逆向反汇编外挂:由于可执行程序都要先变成汇编代码再转换成cpu能识别的二进制机器码,在这个基础上可以根据该cpu对应的指令集反过来将二进制翻译成汇编代码。
反汇编找基地址过程:因为要修改的变量地址老是会发生变化,这样每次进游戏都要重新找,很费时间,所以干脆找出固定的基地址,通过固定算式表出变量地址。道理如同找一个人,单靠服饰和此时的动作状态筛选比较麻烦,通过身份证、手机号才能每次精准找到。先抓取要改的变量的地址,通过数值不断的改善或者模糊搜索等,找到地址后,对该地址打断点,看看哪行汇编代码改变了它的数值就会停下来,拿植物大战僵尸举例,比如定位到这行代码发现add [eax+5560],ecx 对阳光加了ecx,这里eax+5560可以表示阳光地址,接着找倒数第二级偏移,查找看看内存里谁存放着eax的数值,搜索一下,然后挑一个地址 ,打断点看看谁对该地址读写 ,mov eax,[ecx+768]那么上一行的eax可以由ecx+768表示,接着再找谁对ecx赋值(可以在OD上高亮ecx寄存器,看看前面的代代码ecx是怎么来的,也可以在CE中搜索内存)……一直回溯。
如果后面找的代码和前面一样,回到原点,证明是个循环指针,函数连锁调用的原因,这时放弃这条路,后退几步找别的路。直到找出可以被立即数表示为止,而不是可以改变的寄存器值,或者找到绿色的地址,即基地址,基地址是一些全局变量、字符串常量等每次运行都不会改变位置的数据。
要修改的变量一般是类中有内部类,一层层嵌套,所以才有那么多偏移,而最终数据是在堆区动态开辟的,所以才每次运行地址都不同。
eax+5560是类内阳光地址,eax是类的首地址,而保存eax数值的00FE82E8就是sun类的指针变量p,查找看看谁访问了p。而且要筛选出给eax赋值的汇编代码。
选出了这行代码:mov eax,[ecx+768]这里是对指针p里的数值进行读取赋给eax。
代码猜想:
class sun{
public:int suntime;
int value;
…
};
class A
{
public: int stage;
sun*p;
init_sun()
{
p=new sun();
}
…
};
这篇关于使用反汇编强力破解单机游戏外挂的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!