我和我的朋友一直在创建高级C ++ TCPClient,他创建了客户端,我创建了服务器。客户端在代码中有一个静态IP,我们丢失了客户端的代码。我目前想知道是否有可能在IDA中反编译并更改IP。我一直在扫描IDA,我没有在任何地方找到IP。有谁知道这是否可行?
它不像重新创建客户端那么简单,只是放置一个监听器和客户端就比它复杂一点
答案 0 :(得分:2)
是的,这肯定是可能的,而且可能太很难。
假设IP地址是10.11.12.13。在二进制文件中搜索0D 0C 0B 0A
和0A 0B 0C 0D
... IP地址可能以网络字节顺序(大端)或主机字节顺序(小端)存储,具体取决于它是如何写入的以及它是如何优化的。请注意,如果您使用其他架构,这可能会更加困难。在某些体系结构(不是x86)上,如果要加载像IP地址这样的32位常量,可以通过加载两个16位常量来实现。
甚至可能不需要反编译。您只需确保使用相同的字节顺序添加新的IP地址。
我假设您的IP地址未存储为字符串,这也是可能的,在这种情况下,新地址必须更短。
(当然,这里的教训是你应该总是使用主机名而不是硬编码IP地址到你的代码中,但是下次你会做得更好,对吧?如果你使用主机名,你可以随时只需在服务器移动时更改DNS记录,或在Windows上修改/etc/hosts
(C:\Windows\System32\Drivers\etc\hosts
)。)
答案 1 :(得分:1)
如果地址实际上存储在一个4字节的数组中(无论它是如何声明的),那么很可能在可执行映像中更改它。
充满信心地找到它是另一回事。根据代码的编写方式,字节可以按优先级的升序或降序排列。让我们说地址是12.34.56.78
- 如果你对任意顺序的那四个字节执行二进制搜索,并找到一个实例,很可能是他们的,根据你的勇敢程度,你可以改变它们,看它是否有效。
如果您找到多个实例(按任意顺序),事情会变得非常棘手。
如果你回忆一下代码的存储和使用地址,那么它将更容易找到。特别是,如果地址实际存储在数据段中,特别是如果从另一个模块引用,则会缩小您需要搜索的位置。
由于IPv4地址非常适合32位整数,因此完全可以以它们只出现在实际机器指令中的方式使用它们,这会将您带入代码段,更危险的地方可以玩。
我只做一次性检查 - 没有源代码,软件是不可维护的,所以对于超出最小用量的任何东西,我说你真的需要重写它......并保持源头!