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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2014, 11:36   #1
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию Перехват LoadLibraryW

Есть некая DirectX игра. Мне нужно сделать своего рода "фильтр" загружаемых dll'ок. Если имя загружаемой dll допустим "testdll.dll", тогда запрещаем ей загружаться, иначе выполняем обычную функцию LoadLibraryW. (Вариант с перебором всех загруженных dll не подходит, т.к. она уже будет загружена, моя задача не дать загрузиться, покачто только через функцию LoadLibraryW). Делаю с помощью apihooktool.

Хук ставится, и все работает:
Код:
function NewSystemFunction(libname:PWideChar):Cardinal;
begin
  UnHookCodeHook(@SystemFunctionBridge);
  Result := LoadLibraryW(libname);
  SetProcedureHook(GetModuleHandle('kernel32.dll'),'LoadLibraryW',@NewSystemFunction,@SystemFunctionBridge);
end;
Но стоит мне, добавить строчку в данный код, например:
Код:
function NewSystemFunction(libname:PWideChar):Cardinal;
begin
  case test = 'testdll.dll' of True: begin Result := 0; exit; end;  end;
  UnHookCodeHook(@SystemFunctionBridge);
  Result := LoadLibraryW(libname);
  SetProcedureHook(GetModuleHandle('kernel32.dll'),'LoadLibraryW',@NewSystemFunction,@SystemFunctionBridge);
end;
или
Код:
function NewSystemFunction(libname:PWideChar):Cardinal;
begin
if String(libname) <> '' then begin WriteLn(filee, String(libname)); end;
  UnHookCodeHook(@SystemFunctionBridge);
  Result := LoadLibraryW(libname);
  SetProcedureHook(GetModuleHandle('kernel32.dll'),'LoadLibraryW',@NewSystemFunction,@SystemFunctionBridge);
end;
Да или что-нибудь другое, то вызывается краш игры в которой установлен хук. Почему? Как быть?
Все, что мне нужно это выдрать имя загружаемой библиотеки, сделать пару своих проверок и выполнить оригинальную функцию.
Можетбыть делать, что-нибудь типо такого:
Код:
function NewSystemFunction(libname:PWideChar):Cardinal;
var
point :Pointer;
begin
if String(libname) <> '' then begin WriteLn(filee, String(libname)); end;
point := Pointer($10027AB0);
   asm
  mov eax, libname;
  //call point;
  jmp point;
  mov @Result, eax;
 end;
Это чтото тип попытка выполнить оригинальную функцию не снимая хук...
jmp point; - Это первые 5 байт в оригинальной функции Kernel32.LoadLibraryW, которые мы подменили на свои.
point := Pointer($10027AB0)
В общем пните меня в нужном направлении пожалусто.
P.S. В ассемблере чайник.
Каждый день узнаю новое...

Последний раз редактировалось Anton911; 18.11.2014 в 16:23.
Anton911 вне форума Ответить с цитированием
Старый 19.11.2014, 15:25   #2
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Почему не работает такая штука? Пытаюсь вызвать функцию зная ее адрес (GetProcAddress).
Код:
type
TNewLoadlib = function(llib:PWideChar):Cardinal;

var
  Loadlib:TNewLoadLib;

procedure test;
var a:PWideChar;
begin
a := PWideChar('C:\testdll.dll');
point := GetProcAddress(GetModuleHandle(kernel32),'LoadLibraryW');
 Loadlib := point;
 i := Loadlib(a);
end;
Происходит Access Violation...
Каждый день узнаю новое...
Anton911 вне форума Ответить с цитированием
Старый 19.11.2014, 17:22   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Если имя загружаемой dll допустим "testdll.dll", тогда запрещаем ей загружаться
А программа не упадет? Может проще эту ДЛЛ стереть чем перехватывать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.11.2014, 17:36   #4
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Немного не понял вопрос. testdll.dll это всего-лишь пример. Что значит стереть? Найти ее на диске? Моя задача не дать ей загрузиться в игру. Она может иметь произвольное имя, путь, я хочу делать пару проверок перед "добро на загрузку" в игру (например самое простое размер, или по "начинке", не суть).
Каждый день узнаю новое...
Anton911 вне форума Ответить с цитированием
Старый 19.11.2014, 17:54   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
point := Pointer($10027AB0);
asm
mov eax, libname;
//call point;
jmp point;
mov @Result, eax;
end;
Это ещё что за статическая адресация?
С верятностью в 100% по тому адресу NULL.
Человек_Борща вне форума Ответить с цитированием
Старый 19.11.2014, 18:12   #6
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Но ведь kernel32.dll грузится в процессы по одним и темже адресам... Получается и адреса его функций тоже не меняются. Это тотже самый адрес, что и вернет
Код:
GetProcAddress(GetModuleHandle(kernel32),'LoadLibraryW');
Или я ошибаюсь? На самом деле я уже по всякому пробовал и так и так. Результат один и тотже.
Каждый день узнаю новое...
Anton911 вне форума Ответить с цитированием
Старый 19.11.2014, 18:15   #7
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,774
По умолчанию

Ошибаешься. Есть ASLR.
Vapaamies вне форума Ответить с цитированием
Старый 23.11.2014, 15:46   #8
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
Ошибаешься. Есть ASLR.
Понял.

Хорошо, а почему не работает такая система:

Код:
type
  TNewLoadlib = function(llib:PWideChar):Cardinal;

var
  Loadlib:TNewLoadLib;

procedure test;
var 
  a:PWideChar;
  point:pointer;
  i:cardinal;
begin
 a := PWideChar('С:\tests\dll.dll');
 point := GetProcAddress(GetModuleHandle('kernel32.dll'),'LoadLibraryW');
 @Loadlib := point;
 i := Loadlib(a);
end;
Вылазиет Access Violation at address ... (в строчке i := Loadlib(a))

Пытаюсь вызвать функцию loadlibraryw, зная ее адрес.
Каждый день узнаю новое...

Последний раз редактировалось Anton911; 23.11.2014 в 15:59.
Anton911 вне форума Ответить с цитированием
Старый 23.11.2014, 15:57   #9
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Если я правильно помню, когда ASLR в Windows появился, kernel32 всё равно был по одному адресу, только адрес выбирался при загрузке. С тех пор что-то изменилось?
Somebody вне форума Ответить с цитированием
Старый 23.11.2014, 17:34   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Вылазиет Access Violation at address
Что возвращается в point? Почему не проверяешь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перехват Miha85193 Общие вопросы Delphi 2 23.05.2012 13:16
Перехват. egorzenit Общие вопросы Delphi 3 29.03.2012 15:19
Перехват клавиш AnTe Общие вопросы Delphi 3 23.07.2010 06:24
Перехват WM_TIMER Proof Win Api 1 27.06.2010 08:35
Перехват клавиши mustang007 Общие вопросы Delphi 6 15.04.2009 02:01