Я и мой друг создавали Advanced C ++ TCPClient, он создал клиента, а я создал сервер. Клиент имеет статический IP-адрес внутри кода, и мы потеряли код для клиента. Мне сейчас интересно, можно ли декомпилировать в IDA и сменить IP. я сканировал через IDA и нигде не нашел IP. Кто-нибудь знает возможно ли это?
Это не так просто, как просто воссоздать клиента, это немного сложнее, чем просто разместить слушателя и клиента
Если адрес фактически хранится в массиве из 4 байтов (независимо от того, как он объявлен), то вполне возможно изменить его в исполняемом образе.
Найти его, с уверенностью, это другая история. В зависимости от того, как был написан код, байты могут быть в порядке возрастания или убывания приоритета. Допустим, адрес 12.34.56.78
— если вы выполняете двоичный поиск по исполняемому файлу для этих четырех байтов в любом порядке и находите ровно один экземпляр, вполне вероятно, что это они, и в зависимости от того, насколько вы храбры, вы можете просто изменить их и посмотреть, работает ли он.
Если вы найдете более одного экземпляра (в любом порядке), все становится значительно сложнее.
Если у вас есть воспоминания о том, как выглядел код, где хранился и использовался адрес, его будет намного легче найти. В частности, если адрес действительно был сохранен в сегменте данных, особенно если на него ссылается другой модуль, это сужает область поиска.
Поскольку адреса IPv4 удобно вписываются в 32-разрядные целые числа, их вполне можно использовать таким образом, чтобы они появлялись только в реальных машинных инструкциях, что переносит вас в сегмент кода, куда более опасное место для игры.
Я бы сделал это только для одноразовой проверки — без исходного кода программное обеспечение не подлежит обслуживанию, поэтому для чего-либо, кроме минимального использования, я бы сказал, что вам действительно нужно переписать его … и сохранить источник!
Да, это возможно, и, возможно, нет тоже жесткий.
Предположим, что IP-адрес 10.11.12.13. Поиск через двоичный файл для 0D 0C 0B 0A
а также 0A 0B 0C 0D
… IP-адрес может храниться в порядке байтов сети (с прямым порядком байтов) или в порядке байтов хоста (с прямым порядком байтов), в зависимости от того, как он был записан и как он был оптимизирован. Обратите внимание, что это может быть сложнее, если вы используете другую архитектуру. На некоторых архитектурах (не x86), если вы хотите загрузить 32-битную константу, такую как IP-адрес, вы сделаете это, загрузив две 16-битные константы.
Декомпиляция может даже не понадобиться. Вам просто нужно убедиться, что новый IP-адрес добавлен с использованием того же порядка байтов.
Я предполагаю, что ваш IP-адрес не хранится в виде строки, что также возможно, и в этом случае новый адрес должен быть короче.
(Конечно, урок здесь заключается в том, что вы всегда должны использовать имена хостов вместо жесткого кодирования IP-адресов в вашем коде, но в следующий раз у вас все получится, верно? Если вы используете имя хоста, вы всегда можете просто изменить DNS записи, когда ваш сервер движется, или изменить /etc/hosts
(C:\Windows\System32\Drivers\etc\hosts
на винде).)