Показать сообщение отдельно
  #11  
Старый 06.04.2014, 01:05
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
подмена процедуры QueryPerformanceCounter
Ну в таком случае я бы сделал как.
1) Скомпилировал бы в DLL проект с формой для редактирования данных;
2) Сделал бы в этой DLL функцию, заменяющую QueryPerformanceCounter, берущую значение из введенных данных;
3) Сделал бы, чотбы DLL заменила в импорте QueryPerformanceCounter на адрес подменной функции;
4) Пропатчил бы точку входа игры, чтобы она загрузила DLL. Ну или на крайняк написал бы мелкий сторонний инжектор.
Если же обязательно надо, чтобы программа ввода была отдельно - то проще всего, на мой взгляд, как я сказал в начале. Стандартная технология инжекта - VirtualAlloc в чужом процессе, создание там побайтово кода загрузки ДЛЛ
и запуск этого кода через CreateRemoteThread. Можно запросто выделить побольше места и передать в ДЛЛ после загрузки через какой-нибудь самописный Initialize адрес. Затем брать параметры всегда по какому-то смещению от этого адреса.
То есть инжектируемый код будет примерно таким (FASM-синтаксис! не пытайся это скомпилировать во встроенном асм в делфи):
Код:
push libName
call LoadLibrary
push aStart
push eax
call GetProcAddress
call $+5  ; push eip - текущий адрес
call eax  ; call Start; _stdcall функция с одним параметром; никогда не возвращается
ret       ; не обязательно, чисто ради приличия
param1: .dw 0
param2: .dw 0
libName: .db 'HelloWorld.dll',0
aStart: .db 'Start',0
Вся работа в DLL в функции Start. Параметры будут лежать по адресу, пришедшему в функцию, + длина "call eax" + длина "ret"
Остается только менять эти параметры через WriteProcessMemory - в сторонней проге адрес тоже известен, она ведь его и выделила через VirtualAlloc.
ЗЫЖ разумеется, при таком подходе DllMain должен сразу завершиться, и вернуть не ноль. Иначе либа автоматом выгрузиться и будешь долго кусать локти и искать ошибку.

[EDIT]
Код, который ты привел, не очень хорош тем, что вся работа обязательно должна происходить в DLLMain, и никогда нельзя из него выходить. А в DllMain сторонние параметры передать трудновато.

Цитата:
а вот внутри dll уж и отслеживать процедурино выполнение, а это забота "библиотекаря"
что-то не очень уловил смысл этой части...
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием