Четверг, 19.10.2017, 08:33 Приветствую вас Гость | Группа "Гости" 


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: Волк-1024 
delfcode » Delphi » Windows API в Delphi » Вызвать функцию по адресу
Вызвать функцию по адресу
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
Группа: Модераторы
Сообщений: 467
Статус: 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++ переписывал - то-же самое.

Прикрепления: GothicMod.txt(1331Kb)
 
Волк-1024Дата: Воскресенье, 26.10.2014, 22:03 | Сообщение # 5
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 467
Статус: 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
Группа: Модераторы
Сообщений: 467
Статус: 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
Группа: Модераторы
Сообщений: 467
Статус: 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
Группа: Модераторы
Сообщений: 467
Статус: 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
Группа: Модераторы
Сообщений: 467
Статус: 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.
 
delfcode » Delphi » Windows API в Delphi » Вызвать функцию по адресу
Страница 1 из 11
Поиск:

delfcode.ru © 2008 - 2017 Хостинг от uCoz