我有这段代码可以编辑游戏中的地址以获得无限弹药等等,我发现每台计算机的地址都不同,有时每次重新启动游戏时,我如何才能使这项工作仍然有效,即使他们改变了。
6 回答
堆中记录内容的签名匹配。也许对特定的已知内容使用编辑距离。
我回答没有害处,既然你不得不问,你可能没有能力把它拉下来。
如果你得到你要找的地址,然后在内存中搜索那个地址,找到指向那个数据的指针的地址,然后在内存中搜索那个地址,这样你就可以找到指向它的指针的地址,以此类推,你最终可能会找到一个不会改变的地址。然后,在运行时,您可以使用它作为起点并取消引用它以找到您正在寻找的位置。当然,这一切都取决于数据在内部的布局方式。它会变得非常复杂。
最好的方法是在内存中寻找模式并使用偏移量来解决。这不会简单,因为这是游戏开发者想要阻止的事情。
所以他们不会有一个很好的文本字符串说“Ammo 在这个字符串开始之前存储了 27 个字节”。
如果他们正在做一些棘手的事情,比如每次运行游戏时都移动它(我会这样做,因为我很狡猾),你需要反汇编他们的代码来找出他们是如何定位内存的。
然后你做同样的事情。我知道,听起来很简单,而且确实如此。但是根据您过去的问题,我不确定“H4cKL0rD”是一个合适的绰号:-),至少在这种情况下。
如果您对反汇编程序、十六进制编辑器等感到不自在,几乎可以肯定有一个程序可以为您解决问题。
您要么放弃,要么使用反汇编程序变得非常好。
如果您只想完成工作而不关心自己编写代码,您可以使用专门为此任务设计的程序,例如T-Search。
我会说,预加载一些自定义内存分配器并尝试找到您正在寻找的 malloc() 大小。
由于您尝试破解的数据很可能存储在具有其他参数的结构中,因此了解结构大小将允许您在看到此大小的分配传递时采取特殊措施。
typedef struct {
int ammo;
int damage;
int fire_distance;
} Sniper_AWP_T;
void *my_custom_malloc( int size ){
void *ret = malloc(size);
if( size == sizeof( Sniper_AWP_T ) ){
hack_address = ret;
}
return ret;
}
// later on
hack_address->ammo = 999;