在我看来,您的问题是 VS 中的代码,而不是您通过逆向发现的问题。根据您要执行的操作,该函数的开头似乎无关紧要。如果我错了,请纠正我,但在我看来,您认为您必须找到到达函数开头的方法,这样您才能弄清楚需要在函数中进行多远才能更改您的内容想改变。
鉴于您的经验水平,这是可以理解的思路。(如果这就是您的想法,那就是;我正在假设要基于此做出答复。)
首先,幸运的是,您想要做的很容易(相对而言),因为您要做的就是直接更改字节。鉴于此,您通常需要做的是找到对存储感兴趣的字节/指令的内存地址的直接引用。让我们分解一下这对您意味着什么。
查看您在屏幕截图中突出显示的行:
00463716 75 09 JNZ SHORT ac_clien.00463721
00463716:这是一个内存地址。这是存储您感兴趣的字节的地方。这是您希望在您的程序中找到自己的方式的地方。
75 09 JNZ SHORT ac_clien.00463721 :75 09
和JNZ SHORT ac_clien.00463721
是一回事。字节75 09
, 是十六进制的。它们是 CPU 理解的二进制序列的简明表示。为什么不直接显示二进制数而不是十六进制数?好吧,让我们来看看什么75 09的二进制为:111010100001001
。
现在想象在 OllyDbg 中看到该列中的所有二进制,而不是十六进制。它不仅笨拙,而且通过一些说明,这些数字会在行中占用大量的空间。此外,作为人类读者,您更容易了解byte 75 的含义,而不是 bits 1110101
,后者是 CPU 最终理解的内容。
您看到的英文组装说明 ( JNZ SHORT ac_clien.00463721
) 是为了让我们能够轻松阅读说明的进一步提炼。你看到了,你知道它说“如果没有设置零标志,则跳转到内存地址 ac_clien.00463721 的一小段距离”。
因此,就我们在这里使用的指令而言,位1110101
与十六进制相同的值75
与JNZ
. 它们只是表示同一事物的不同方式,主要是为了我们,所以我们不必尝试读取一堆 1 和 0。
牢记这一点,您知道更改JNZ
为JMP
会为您提供自动武器开火。因此,您的程序需要找到存储该字节的内存地址(根据屏幕截图,该地址为463716
,但可能会在重新启动时更改)。然后你的程序需要写一个你想要的新字节。JMP
在这种情况下,您想要的字节是EB
.
现在您拥有编写应用程序所需的一切。这是我的帮助停止和您的外部研究开始的地方,因为现在您处于正向工程的领域(逆向工程过程已完成)。您是否正在尝试使用 C、C++、Visual C++、C# 或其他语言编写您的 hack 代码?您选择的语言将直接告知您以编程方式查找游戏进程、打开它、查找其基地址,然后将您的字节写入正确的偏移量所采用的方法。
其中“X”是您选择的编程语言,诸如“我如何在 X 中找到游戏或程序的基地址”之类的问题;《如何在X中找到游戏或程序的进程ID》;“我如何将字节写入 X 中的内存地址”等应该引导您走上正确的道路。
最后,由于您正在攻击 Assault Cube,我建议您在 Guided Hacking 论坛上注册并在那里进行查询。多年来,他们专门使用该游戏作为他们无数教程的目标,并且有很多非常有经验的程序员可以帮助您完成基础知识,包括了解您甚至不知道要问的所有事情关于现在。
希望有帮助!