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

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

本文关键字:字节数 字节 数组 应用程序 编译 是否      更新时间:2023-10-16

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

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

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

假设IP地址为10.11.12.13。在二进制文件中搜索0D 0C 0B 0A0A 0B 0C 0D。。。IP地址可能按网络字节顺序(big-endian(或主机字节顺序(little-endian(存储,这取决于它的编写方式和优化方式。请注意,如果您使用另一个体系结构,这可能会更加困难。在某些体系结构(不是x86(上,如果您想加载一个32位常量(如IP地址(,您可以通过加载两个16位常量来完成。

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

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

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

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

满怀信心地找到它是另一回事。根据代码的编写方式,字节的优先级可能是升序或降序。假设地址是12.34.56.78——如果你在可执行文件上按任意顺序搜索这四个字节,并找到一个实例,很可能就是它们,根据你的勇敢程度,你可以更改它们,看看它是否有效。

如果您发现多个实例(按任意顺序(,事情就会变得更加棘手。

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

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

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