Сейчас на форуме: jinoweb (+6 невидимых) |
eXeL@B —› Программирование —› Как вырезать ненужную функцию в EXE |
Посл.ответ | Сообщение |
|
Создано: 06 мая 2018 19:13 · Личное сообщение · #1 Привет всем! Одна из игр не запускается на Windows Xp , потому как требует более новой версии ws2_32.dll . Данная обновленная библиотека идет начиная с Vista. Дословно ошибка выглядит так: Точка входа в процедуру inet_ntop не найдена в библиотеке DLL WS2_32.dll По сути данная функция используется только в мультиплеере, меня же игра интересует только как одиночная игра без использования интернета. Я нашел решение, но не знаю насколько оно корректное. В общем я в Hex редакторе отыскал запись об этой функции и банально исправил ее на другую , которая уже есть в DLL. То есть получился как бы дубль записи импортирования функции inet_addr. Было: htonl.–.htons.—.inet_addr.™.inet_ntop.›.ioctlsocket.њ Стало: htonl.–.htons.—.inet_addr.™.inet_addr.™.ioctlsocket.њ Может есть какой нибудь более разумный вариант? |
|
Создано: 06 мая 2018 19:42 · Личное сообщение · #2 Замени в импорте inet_ntop на inet_ntoa, она точно есть на Windows XP. Для простоты можешь пропатчить в hex-редакторе строку в импорте, благо всего 1 байт заменить ("p" > "a"). Разница между inet_ntoa и inet_ntop в поддержке IPv6 у последней, что в твоём случае не актуально. Опционально можешь пропатчить ещё и сам вызов в коде, чтобы не улетал стек. Подробнее: ----- EnJoy! | Сообщение посчитали полезным: stabud, Gideon Vi |
|
Создано: 06 мая 2018 20:58 · Личное сообщение · #3 |
|
Создано: 06 мая 2018 21:36 · Личное сообщение · #4 |
|
Создано: 07 мая 2018 07:25 · Личное сообщение · #5 Так игра запускается и работает и с моим решением и с твоим. Конечно же , мультиплеер запускать нельзя (он мне и не нужен). Я просто не знаю , как ведет себя загрузчик PE , когда встречает дублирующую запись в импорте, поэтому и задал вопрос. Наверное туда можно записать вообще любую запись, лишь бы такая функция была в DLL-ке , ну и чтобы кол-во байт на запись совпадало. Патчить имена в вызове не вижу смысла, поскольку параметры у функций разные. Тогда придется переписывать и код вызова полностью, хотя конечно в данном случае возможно будет и мультиплеер работать. Ведь обе функции по сути преобразовывают сетевой адрес в строковое представление (скорее всего просто для вывода пользователю). |
|
Создано: 07 мая 2018 14:20 · Личное сообщение · #6 stabud пишет: игра запускается и работает Отлично. Всё же я за однобайтовый патч одной буквы имени импорта. stabud пишет: Патчить имена в вызове не вижу смысла Не имена, а передаваемые параметры и стек. Пропатчить код я рекомендую как раз потому, что ты не уверен, когда идёт вызов сетевого кода. Вполне вероятно, что вызов сетевых функций может идти во время инициализации приложения (игры), а не только после вызова режима сетевой игры. Code:
Проверь, какое значение Family в коде, и если это 2 (AF_INET), то это обычный IPv4 и вызов можно смело патчить. pAddr из inet_ntop - это указатель на ту же Code:
После вызова inet_ntoa нужно будет возвращаемое значение (rax/eax) присвоить переменной pStringBuf. В результате некоторых модификаций ты получишь полностью функциональную версию игры, которая при этом и в сетевом режиме будет работать. Как вариант - написать хукалку функции inet_ntop в виде обёртки над inet_ntoa. ----- EnJoy! |
|
Создано: 07 мая 2018 17:26 · Личное сообщение · #7 Я с ассемблером далеко не на "ты", хотя чуть чуть пендрю. Код процедуры, где идет вызов , выглядит так: Code:
Это единственное место , где вызывается inet_ntop . Запись в импорте уже поправлена , поэтому в приведенном коде анализатор OllyDBG пишет inet_ntoa. Что интересно , я запускал мультиплеер , но переход на кусок кода с адреса 00546A34 , где есть вызов функции inet_ntoa вообще ни разу не отработал. Чуть выше по адресу 00546A29 в EAX всегда пишется двойка , поэтому сразу после сравнения и отрабатывании условного перехода программа всегда обходит этот кусок кода. Меня уже в чате там ребята и читером и нубярой обтявкали , а я просто проверял когда код дойдет до нужного мне места Насколько я понял , тут и патчить то надо только в одном месте , поправь меня если я не прав. Вот код в коротком варианте: Code:
По адресу 00546AD9 пишем вместо [ESP+4] просто ESP и вроде больше ничего не надо. |
|
Создано: 07 мая 2018 19:18 · Личное сообщение · #8 |
|
Создано: 07 мая 2018 19:30 · Личное сообщение · #9 |
|
Создано: 07 мая 2018 19:34 · Личное сообщение · #10 |
|
Создано: 07 мая 2018 19:44 · Личное сообщение · #11 Так это опенсорс проект? Вот это поворот у них в Code:
При этом в оригинальном MiniUPnP огромное количество вызовов inet_ntop: Code:
Что примечательно, они 8 лет назад, ещё в 2010, написали, что отказались от inet_ntop и inet_ntoa в пользу getnameinfo: Code:
Code:
Но что ещё интереснее, уже есть commit #e58323f, который заменяет inet_ntop на snprintf: Если ты посмотришь в код Code:
Ты дал ссылку на старую версию 3.1.5 (warzone2100-3.1.5_portable) от 2016 года, при этом актуальная версия 3.2.3 и в ней поддержка Windows XP присутствует. ВЫВОД: Скачать и использовать Скачать: - ----- EnJoy! |
|
Создано: 07 мая 2018 19:58 · Поправил: siccubus · Личное сообщение · #12 |
|
Создано: 07 мая 2018 20:40 · Личное сообщение · #13 |
|
Создано: 07 мая 2018 20:49 · Личное сообщение · #14 Зачем вырезать, меняешь в импорте имя библиотеки WS2_32.dll на WS2_XX.dll, делаешь библиотеку с заглушками функций которые есть в импорте, профит. | Сообщение посчитали полезным: stabud |
|
Создано: 07 мая 2018 20:56 · Личное сообщение · #15 Jupiter! Я выбрал версию игры далеко не новую 3.1.5 , которую считаю наиболее удавшуюся. Новые версии я пробовал , там конечно много косяков исправлено , но так же появилось много новых проблем. Исходники на гитхабе думаю от "сегодняшнего дня". Даже если я найду те самые исходники от версии 3.1.5 , все равно я затрачу кучу времени на изучение и что более важно на компиляцию. Ведь я basic кодер и все нюансы С++ компилирования далеки для меня. Конечно иногда бывало , я компилировал какую нибудь библиотеку из сишных сорцов на другом компьютере, где у меня установлен MinGW. И как правило без канители почти никогда не обходилось... Вообще я посчитал, что быстрее: пропатчить EXE , тем более что патчить нужно всего один байт чем искать исходники, изучать и править , ставить компилятор (возможно еще с дополнительными библиотеками) , изучать параметры компиляции (makefile , readme и пр.) и компилировать Вся беда оказалась в том, что версия 1.3.2 последняя , которая поддерживает windows XP , а мне нужна именно 1.3.5 В принципе вопрос уже решен. Игра пропатчена , функция inet_ntop хоть и есть изначально в импорте , но похоже никак не влияет на MultiPlayer , и тем более на SinglePlayer. В любом случае Jupiter спасибо , что ты потратил время на мой вопрос! |
|
Создано: 08 мая 2018 08:01 · Личное сообщение · #16 stabud Как выяснилось, в твоём случае достаточно пропатчить только 1 байт в импорте, поскольку если у тебя отключён IPv6 в настройках сети (а это скорее всего именно так), то на входе в addressToText значение поля addr->sa_family всегда будет AF_INET = 2 и ветка с inet_ntop никогда не будет выполняться. Code:
Скрин: d41c_08.05.2018_EXELAB.rU.tgz - hiew_warzone2100_addressToText.png ----- EnJoy! | Сообщение посчитали полезным: stabud |
|
Создано: 08 мая 2018 11:03 · Личное сообщение · #17 Как выяснилось, в твоём случае достаточно пропатчить только 1 байт в импорте, поскольку если у тебя отключён IPv6 в настройках сети (а это скорее всего именно так), то на входе в addressToText значение поля addr->sa_family всегда будет AF_INET = 2 и ветка с inet_ntop никогда не будет выполняться. А ну тогда понятно почему данная ветка кода не работала при разных манипуляциях в игре . Ну что же это к лучшему. Кстати, а как в HIEW писать свои метки? В демо версии это возможно? |
|
Создано: 08 мая 2018 14:18 · Личное сообщение · #18 stabud пишет: Кстати, а как в HIEW писать свои метки? Shift+F12 - Добавить метку F12 - Посмотреть метки ; - Добавить комментарий stabud пишет: В демо версии это возможно? Хз, проверь ) Судя по описанию Code:
----- EnJoy! |
|
Создано: 08 мая 2018 17:48 · Личное сообщение · #19 |
|
Создано: 09 мая 2018 01:04 · Личное сообщение · #20 На всякий случай готовый файл names для Hiew: Code:
Загрузить имена: F12, F10 Версия warzone2100_portable.exe: 3.1.5 de47_09.05.2018_EXELAB.rU.tgz - warzone2100_portable.namet ----- EnJoy! |
eXeL@B —› Программирование —› Как вырезать ненужную функцию в EXE |
Эта тема закрыта. Ответы больше не принимаются. |