Замена не экспортируемой функции C++

221
29 сентября 2017, 18:54

Дано: Главный main.exe файл, вызывающий библиотеку libs.dll. В этой библиотеке есть не экспортируемая функция, которую я хочу заменить на свою. Как заменить я знаю, но мне нужен адрес входа в функцию. Вопрос: Как можно получить этот самый адрес(например, для экспортируемой функции можно пользоваться функцией GetProcAddress, в моем случае это не сработает).

P.S. Два дня пытался ковырять адреса в ollydbg, но все без толку ...

Answer 1

Можно попробовать такую схему:

  1. Вызываем GetProcAddress для экспортируемой функции (какой - неважно. Какая-нибудь в dll всяко есть. Главное - попасть в диапазон адресов dll), получаем указатель на экспортируемую функцию.
  2. Прибавляем к этому указателю некое смещение, которое есть разница адресов между искомой функцией и экспортируемой в адресном пространстве dll.

Понятно, что для выполнения пункта 2 нужно знать это самое смещение. Как я понимаю, dll-ка собрана без отладочной информации. Следовательно, название искомой функции в dll нигде не фигурирует. Тогда есть такие идеи:

  • Может быть (и скорее всего), эта функция в конце концов вызывается через какую-нибудь из экспортируемых функций. И вы знаете в какой примерно момент это делается. Тогда можно в основной программе вызвать такую экспортируемую функцию, и ходить отладчиком в окне CPU (где ассемблерный код показывается) и входить во все call'ы, пока не попадете в нужную функцию. Тогда смотрим адрес первой команды, и смещение считается тривиально. Даже если нужную функцию таким образом обнаружить сложно, число возможных кандидатов снижается.
  • Может быть, вам известен точный фрагмент кода этой функции. Тогда можно поискать соответствующую последовательность байт в диапазоне адресов dll-ки.
  • Последний вариант - вам известно лишь примерно, что эта функция делает. Тогда остается искать все команды ret в окне дизассемблера в диапазоне адресов dll, вверх от них пытаться найти начало функции (что может быть затруднительно из-за всяких переходов), затем отбросить те, которые экспортированы (и, следовательно, известно, что это не то), затем отбросить те, которые не похожи по выполняемым действиям. А для оставшихся кандидатов - пробовать перебором вставлять ваш код и смотреть, работает или нет.
READ ALSO
Выравнивание структур вручную

Выравнивание структур вручную

Допустим вам требуется вручную выровнять все поля структуры по 4 байтаВыглядит это примерно так:

282
Выборка jq и Angular

Выборка jq и Angular

У меня есть таблица, данные там формируются с помощью ng-repeat

282
Выпадает символ при чтении параметра JSON

Выпадает символ при чтении параметра JSON

Есть такой вот участок кода, который читае полученные AJAX данный в JSON формате(лишний код убран):

289