Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2012, 09:09   #1
WhiskasTM
Подтвердите свой е-майл
 
Регистрация: 11.04.2012
Сообщений: 85
По умолчанию Загружается DLL в THandle, но процедура из DLL не запускается.

Приложение загружает dll-ку:

Код:
function Sum(a,b:integer):integer;
begin
  Result:=a+b;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
 i:=Sum(33,33);
 showmessage(inttostr(i));
end;

procedure TForm1.FormCreate(Sender: TObject);
var
DLLInstance : THandle;
Proc:TProcedure;
begin
 DLLInstance := LoadLibrary('hook.dll');
 if DLLInstance = 0 then
 begin
   MessageDlg('No dll found!', mtError, [mbOK], 0);
   Exit;
 end;
end;
А вот сама dll:

Код:
library Hook;

uses
  ShareMem,
  SysUtils,windows,vcl.dialogs;

function Sum(a,b:integer):integer;
begin
  Result:=a*+b/b+b;
end;

procedure Run;
begin
  showmessage('123');
end;


procedure DllEntry(dwReason: DWORD);
begin
  case dwReason of
    DLL_PROCESS_ATTACH:
      begin
       Run;          // <---------- Run Procedure
      end;
    DLL_PROCESS_DETACH:
     begin

      end;
    DLL_THREAD_ATTACH:
     begin

      end;
    DLL_THREAD_DETACH:
     begin

      end;
  end;

end;


begin
  @DllProc := @DllEntry;
  DllEntry(DLL_PROCESS_ATTACH);
end.
Конечная цель всего этого, чтобы хук подменял функцию Sum в главном приложении, на тут что в Dll. Если у кого будет под рукой пример буду благодарен.

А пока почему не выполняется процедура Run? Она же в handle торчит, я смотрел в памяти - все нормально - Dll там. Как тогда загружать библиотеку, как это делают игры с поддержкой плагинов? Процедуры там сразу начинают выполнятся.
WhiskasTM вне форума Ответить с цитированием
Старый 01.05.2012, 17:53   #2
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

В указанном коде с запуском Run проблем не вижу. Проверяй, что загружаешь именно актуальный вариант DLL.

Насчёт "хука Sum" - крайне непонятно. Если нужен хук, то почему главное приложение явно грузит DLL? Если оно, наоборот, может грузить DLL, то зачем нужен хук, если Sum можно просто импортировать?

Короче, говори свой Z.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 01.05.2012, 18:32   #3
WhiskasTM
Подтвердите свой е-майл
 
Регистрация: 11.04.2012
Сообщений: 85
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
В указанном коде с запуском Run проблем не вижу. Проверяй, что загружаешь именно актуальный вариант DLL.
Действительно работает, проверил на запись в память. Просто showmessage
не срабатывает.

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Насчёт "хука Sum" - крайне непонятно. Если нужен хук, то почему главное приложение явно грузит DLL? Если оно, наоборот, может грузить DLL, то зачем нужен хук, если Sum можно просто импортировать?
Мне нужна площадка для опытов. Пусть главное приложение есть какое-то приложение, игра калькулятор, да хоть че. Приложение будем считать с поддержкой плагинов и можно подключить левую dll.

При нажатии кнопки прога главная суммирует два числа 33. Дизасм:

Код:
.text:00511447               mov     edx, 21h
.text:0051144C                 mov     eax, 21h
.text:00511451                 call    sub_51140C
ну я и подключаю свой хитрый "плагин" чтобы он перехватил функцию и заменил call sub_51140C(=Call Sum) на Call NewSum, которая нах-ся в dll-ке.
NewSum умножит два числа этих. Вот такой вот хак хочу

Единственное что надыбал вот:
Код:
Function NewSum(a,b:integer):integer;
begin
Result:=a*b;
end;
Function WriteMemory(pAddress: Pointer; Bytes: TypeByteArray): Boolean;
var
  OldProtect, DummyProtect: DWord;
begin
  if VirtualProtect(pAddress, SizeOf(Bytes), PAGE_EXECUTE_READWRITE, @OldProtect) then
   begin
    Move(Bytes, pAddress^, Length(Bytes));
    VirtualProtect(pAddress, SizeOf(Bytes), OldProtect, @DummyProtect);
    Result := True
   end
   else
    Result := False;
end;

procedure Run();
var
  i: Integer;
  bytes: array [0..3] of byte;
begin
  bytes[0]:=$??;
  bytes[1]:=$??;
  bytes[2]:=$??;
  bytes[3]:=$??;
  WriteMemory(ptr($511452),bytes);
end;
Вообщем пытался ещё сделать так, но эти пойнтеры убивают.
Код:
procedure Run;
var
P:pointer;
begin
 p:=@NewSum
 WriteMemory(ptr($511452),sizeof(p));
end;
$511452 - здесь по этому адресу в памяти: E8 B6FFFFFF ( че ещё за B6FFFFFF?) = call Sum. Нужно как-то вычислить адрес местонахождения моей NewSum и расфасовать его в array of byte, потом пропатчить память. Будет Call NewSum. Такие дела
WhiskasTM вне форума Ответить с цитированием
Старый 01.05.2012, 18:38   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Приложение будем считать с поддержкой плагинов и можно подключить левую dll.
Если приложение поддерживает плагины, то тебе надо писать плагин, как это описано в документации по разработке плагинов, не?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 01.05.2012, 18:44   #5
WhiskasTM
Подтвердите свой е-майл
 
Регистрация: 11.04.2012
Сообщений: 85
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Если приложение поддерживает плагины, то тебе надо писать плагин, как это описано в документации по разработке плагинов, не?
Не, это хак или патчинг. К игрушкам нет документации по написанию плагов, а хаки делают, и прописывают свои dll-ки в ini файлы игр, где обычно прописаны d3dx9.dll, user32.dll и т.п. Игра подхватывает их всех автоматом, чтобы не подсунули. На крайняк через лоадером пихают код dll в память.
WhiskasTM вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доступ к переменной, объявленной в одной dll, из другой dll eduard93 Visual C++ 2 25.09.2011 11:10
Пытаюсь понять код user32.dll и gdi32.dll Beermonza Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 43 13.07.2010 15:09
Ошибка при выхове функций Bass.dll из другой DLL SalasAndriy Общие вопросы Delphi 7 21.10.2009 23:36
DLL не загружается!(( Istergul Общие вопросы Delphi 9 29.01.2008 22:59