Вызвать функцию по адресу
|
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.
|
|
|
|
|