Вызвать функцию по адресу
|
|
Slash | Дата: Суббота, 25.10.2014, 18:13 | Сообщение # 1 |
Постоянный
Зарегистрирован: 20.12.2012
Группа: Пользователи
Сообщений: 161
Статус: Offline
| Вообщем, есть процесс GothicMod.exe, он запускается, потом в него инжектится dll, а dll вызывает определенную функцию по адресу. Я пробовал сделать это двумя способами, при каждом из них игра(процесс) виснет. У кого рабочий способ есть?
Способ 1: Код procedure XCALL(uAddr : Pointer); begin asm mov esp, ebp pop ebp mov eax, uAddr jmp eax end; end;
XCALL(ptr($00401260));
Способ 2: Код type TConstructorZString = procedure();
constructor TzSTRING.Create; var ConstructorZString: TConstructorZString; begin inherited; ConstructorZString:= TConstructorZString(ptr($00401260)); ConstructorZString(); end;
Сообщение отредактировал Slash - Суббота, 25.10.2014, 18:14 |
|
| |
Волк-1024 | Дата: Воскресенье, 26.10.2014, 16:02 | Сообщение # 2 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Непонятно зачем это, т.к Delphi сама генерирует пролог и эпилог функции. Цитата mov esp, ebp pop ebp И зачем все эти нагромождения, когда можно так: Код procedure XCall(uAddr: DWORD); assembler; asm jmp eax end;
Pascal, C\C++, Assembler, Python
|
|
| |
Slash | Дата: Воскресенье, 26.10.2014, 21:46 | Сообщение # 3 |
Постоянный
Зарегистрирован: 20.12.2012
Группа: Пользователи
Сообщений: 161
Статус: Offline
| Цитата Волк-1024 ( ) И зачем все эти нагромождения, когда можно так: Я нуль в ассемблере, а почему в теле функции нету работы с uAddr? Просто jmp eaxДобавлено (26.10.2014, 21:45) --------------------------------------------- Эх... Программа все так же виснет. Не пойму в чем ошибка. Добавлено (26.10.2014, 21:46) --------------------------------------------- Код dll'ки: Код library Caller;
uses SysUtils, Windows, Forms, zSTRING, oCWorld, Classes;
{$R *.res}
type TRemoteFunction = procedure();
var RemoteFunction: TRemoteFunction; result: string; f: TextFile; Gzstring : TzSTRING; World : ToCWorld; CharValue : Char;
procedure XCall(uAddr: DWORD); assembler; asm jmp eax end;
begin XCALL(00401260); MessageBox(0,'Injected And Work','Ext',0); end.
|
|
| |
Slash | Дата: Воскресенье, 26.10.2014, 21:48 | Сообщение # 4 |
Постоянный
Зарегистрирован: 20.12.2012
Группа: Пользователи
Сообщений: 161
Статус: Offline
| Адреса функций, пробовал почти все, результат один и тот же - зависание. Может инжектю не правильно? Хотя без XCALL'a MessageBox показывается и все такое.Добавлено (26.10.2014, 21:48) --------------------------------------------- dll'ку на C++ переписывал - то-же самое.
|
|
| |
Волк-1024 | Дата: Воскресенье, 26.10.2014, 22:03 | Сообщение # 5 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Цитата Slash ( ) а почему в теле функции нету работы с uAddr? Просто jmp eax Просто компилятор Делфи кладёт первый параметр в регистр eax.(если, конечно, не стоит stdcall)
Цитата Slash ( ) $00401260 А вы уверены, что по этому адресу в АП процесса вообще что-то есть? Есть вероятность того, что управление передаётся в никуда.
"00401260 .text Debug data ??1zSTRING@@UAE@XZ"
Pascal, C\C++, Assembler, Python
|
|
| |
Волк-1024 | Дата: Воскресенье, 26.10.2014, 22:10 | Сообщение # 6 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Цитата Slash ( ) Адреса функций, пробовал почти все, результат один и тот же - зависание.
У функций есть обычно ещё и параметры... И если их например не будет лежать на стеке, то это может вызвать исключение и программа тупо зависнет
Pascal, C\C++, Assembler, Python
|
|
| |
Slash | Дата: Понедельник, 27.10.2014, 00:01 | Сообщение # 7 |
Постоянный
Зарегистрирован: 20.12.2012
Группа: Пользователи
Сообщений: 161
Статус: Offline
| Цитата Волк-1024 ( ) У функций есть обычно ещё и параметры... И если их например не будет лежать на стеке, то это может вызвать исключение и программа тупо зависнет Это была не функция - это конструктор класса.
На С++ для второй Готики(игра) в пакете G2Ext это делается так: Код zSTRING() { XCALL(0x00402AF0); };
Там же и взял этот XCALL
Добавлено (26.10.2014, 22:27) --------------------------------------------- Пробовал и функции которые пустые(void)- виснет.
Добавлено (26.10.2014, 22:39) --------------------------------------------- Цитата Волк-1024 ( ) А вы уверены, что по этому адресу в АП процесса вообще что-то есть? Есть вероятность того, что управление передаётся в никуда. Пробовал тоже самое с адресами для Г2 из G2Ext где все проверено - тоже самое.Добавлено (27.10.2014, 00:01) --------------------------------------------- P.S. А можно это сделать на шарпе без dll'ок на WriteProcessMemory?
Сообщение отредактировал Slash - Воскресенье, 26.10.2014, 22:41 |
|
| |
Волк-1024 | Дата: Понедельник, 27.10.2014, 01:08 | Сообщение # 8 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Ну тогда надо с отладчиком там шуровать и смотреть что и где виснет.
Pascal, C\C++, Assembler, Python
|
|
| |
Slash | Дата: Вторник, 28.10.2014, 00:36 | Сообщение # 9 |
Постоянный
Зарегистрирован: 20.12.2012
Группа: Пользователи
Сообщений: 161
Статус: Offline
| Цитата Волк-1024 ( ) Ну тогда надо с отладчиком там шуровать и смотреть что и где виснет. Какой юзать? OllyDbg пойдет? и как?
|
|
| |
Волк-1024 | Дата: Вторник, 28.10.2014, 17:21 | Сообщение # 10 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Цитата Slash ( ) OllyDbg пойдет? Да, подойдёт.
Цитата Slash ( ) и как? Аттачиться к процессу и трассировать код. Только для этого нужно хорошо знать ассемблер.
Pascal, C\C++, Assembler, Python
|
|
| |
Slash | Дата: Вторник, 28.10.2014, 21:50 | Сообщение # 11 |
Постоянный
Зарегистрирован: 20.12.2012
Группа: Пользователи
Сообщений: 161
Статус: Offline
| Цитата Волк-1024 ( ) Аттачиться к процессу и трассировать код. Только для этого нужно хорошо знать ассемблер. Слухай, а через WriteProcessMemory на шарпе, к примеру - это реально сделать? или не в ту степь клонит?
Сообщение отредактировал Slash - Вторник, 28.10.2014, 22:30 |
|
| |
Волк-1024 | Дата: Вторник, 28.10.2014, 23:10 | Сообщение # 12 |
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
| Я вообще нихт ферштейн в какую степь это клонит, ибо не понимаю причем тут WriteProcessMemory...
Pascal, C\C++, Assembler, Python
|
|
| |
Slash | Дата: Четверг, 30.10.2014, 23:12 | Сообщение # 13 |
Постоянный
Зарегистрирован: 20.12.2012
Группа: Пользователи
Сообщений: 161
Статус: Offline
| Цитата Волк-1024 ( ) Я вообще нихт ферштейн в какую степь это клонит, ибо не понимаю причем тут WriteProcessMemory... https://www.youtube.com/watch?v=xrjFDAblfqg Описание к видео: A Testproject written in VB .NET. It uses Read/writeprocessmemory for movement. It does NOT aim to turn G2 into a multiplayer game, it's just for educational purpose.
|
|
| |