是否可以在已编译的应用程序中更改字节数组 (4)

Is it possible to change a Byte Array (4) in a Compiled Application

我和我的朋友一直在创建一个高级 C++ TCPClient,他创建了客户端,我创建了服务器。客户端在代码中有一个静态 IP,我们丢失了客户端的代码。我目前想知道是否可以在 IDA 中反编译并更改 IP。我一直在通过 IDA 扫描,但我没有在任何地方找到 IP。有谁知道这是否可能?

它不像重新创建客户端那么简单,它比放置侦听器和客户端要复杂一些

是的,这当然是可能的,而且可能难。

假设IP地址是10.11.12.13。在二进制文件中搜索 0D 0C 0B 0A0A 0B 0C 0D...IP 地址可能以网络字节顺序(大端)或主机字节顺序(小端)存储,具体取决于它的写入方式以及它是如何优化的。请注意,如果您使用的是另一种架构,这可能会更加困难。在某些架构(不是 x86)上,如果你想加载一个像 IP 地址这样的 32 位常量,你将通过加载两个 16 位常量来完成。

甚至可能不需要反编译。您只需确保使用相同的字节顺序添加新的 IP 地址。

我在这里假设您的 IP 地址未存储为字符串,这也是可能的,在这种情况下,新地址必须更短。

(当然,这里的教训是您应该始终使用主机名而不是将 IP 地址硬编码到您的代码中,但下次您会做得更好,对吧?如果您使用主机名,您总是可以在服务器移动时更改 DNS 记录,或修改 /etc/hosts(Windows 上的 C:\Windows\System32\Drivers\etc\hosts)。)

如果地址实际上存储在一个 4 字节的数组中(不管它是如何声明的),那么很有可能在可执行映像中更改它。

自信地找到它是另一回事。根据代码的编写方式,字节的优先顺序可能是升序或降序。假设地址是 12.34.56.78 - 如果您以任一顺序对这四个字节的可执行文件执行二进制搜索并恰好找到一个实例,很可能就是它们,并且取决于您有多勇敢,您可以改变它们,看看它是否有效。

如果您找到多个实例(以任一顺序),事情就会变得更加棘手。

如果您记得存储和使用地址的代码是什么样子,就会更容易找到。特别是,如果地址实际存储在数据段中,尤其是从另一个模块引用的地址,则可以缩小您需要搜索的范围。

因为 IPv4 地址适合 32 位整数,所以完全有可能以它们只会出现在实际机器指令中的方式使用它们,这会将您带入代码段,这是一个更危险的地方正在玩耍。

我这样做只是为了一次性检查 - 没有源代码,软件是不可维护的,所以对于超出最低限度使用的任何东西,我会说你真的需要重写它。 ..并保留来源!