逆向反汇编外挂原理

由于可执行程序都要先变成汇编代码再转换成cpu能识别的二进制机器码,在这个基础上可以根据该cpu对应的指令集反过来将二进制翻译成汇编代码。

  反汇编找基地址过程:因为要修改的变量地址老是会发生变化,这样每次进游戏都要重新找,很费时间,所以干脆找出固定的基地址,通过固定算式表出变量地址。道理如同找一个人,单靠服饰和此时的动作状态筛选比较麻烦,通过身份证、手机号才能每次精准找到。先抓取要改的变量的地址,通过数值不断的改善或者模糊搜索等,找到地址后,对该地址打断点,看看谁改变了它数值,比如定位到这行代码发现add [eax+5560],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();

  }

};

你可能感兴趣的:(c语言,汇编)