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

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

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

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

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

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

Вернул $7512492B. Все как положено, с помощью Cheat Engine открыл процесс проверил, адресс тот что нужен.
Переделал строчку i := Loadlib(a); на Loadlib(a); Ошибка таже самая. Чтото не то с вызовом функции...
Каждый день узнаю новое...

Последний раз редактировалось Anton911; 23.11.2014 в 19:27.
Anton911 вне форума Ответить с цитированием
Старый 23.11.2014, 21:05   #12
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,755
По умолчанию

Модификатор stdcall не забыл?
Vapaamies вне форума Ответить с цитированием
Старый 23.11.2014, 22:39   #13
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
Или я ошибаюсь? На самом деле я уже по всякому пробовал и так и так. Результат один и тотже.
Что-то вы не то курите. Вылезайте из 90х, пора 21 век возвращаться.

Цитата:
Если я правильно помню, когда ASLR в Windows появился, kernel32 всё равно был по одному адресу, только адрес выбирался при загрузке. С тех пор что-то изменилось?
Появилось динамическое распределение памяти.

А процесс то грузится каждый раз по разному адресу Соответственно любая dll и прочие грузятся уже относительно него. Итого в каждом процесс каждая библиотека живет по своему адресу.
Загрузчик переопределяет ImageBase если указанная там область, уже занята.

Да и в корне неправильно патчике. Создаете удаленный поток, грузите через него свою хук-библиотеку и уже эта библиотека сможет что-то запрещать, только в том процессе, выполнять что-либо.

API ловушки на всю систему может разве что MadCodeHook через свой драйвер. Ещё EasyHook тоже через спец. драйвер.

Access violation потому что лезете из своей области памяти в чужую, не можно так делать сударь
Человек_Борща вне форума Ответить с цитированием
Старый 24.11.2014, 03:59   #14
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
Модификатор stdcall не забыл?
Вы Супермен однако))) Спасибо!

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Да и в корне неправильно патчике. Создаете удаленный поток, грузите через него свою хук-библиотеку и уже эта библиотека сможет что-то запрещать, только в том процессе, выполнять что-либо.

API ловушки на всю систему может разве что MadCodeHook через свой драйвер. Ещё EasyHook тоже через спец. драйвер.

Access violation потому что лезете из своей области памяти в чужую, не можно так делать сударь
У меня так сделано: Создается удаленный поток, грузится через него длл в нужный процесс, длл ставит хук на LoadLibraryW, а дальше уже пытаюсь плясать. Я выбрал именно LoadLibrary, потомучто в отличие от тогоже WriteProcessMemory мне не придется для его перехвата хукать все процессы в системе.
Сейчас я попробую пойти немного другим путем... значит: Выделяется в нужном процессе нужное кол-во памяти, записывается в эту память копия функции LoadLibraryW. В оригинальной функции LoadLibraryW первые 5 байт я заменю на адрес своей функции (func1), а в конце своей функции (func1) я вызову "Копию" LoadLibraryW. О результатах отпишусь позже.
Каждый день узнаю новое...

Последний раз редактировалось Anton911; 24.11.2014 в 04:20.
Anton911 вне форума Ответить с цитированием
Старый 24.11.2014, 09:11   #15
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
Сейчас я попробую пойти немного другим путем... значит: Выделяется в нужном процессе нужное кол-во памяти, записывается в эту память копия функции LoadLibraryW. В оригинальной функции LoadLibraryW первые 5 байт я заменю на адрес своей функции (func1), а в конце своей функции (func1) я вызову "Копию" LoadLibraryW. О результатах отпишусь позже.
С чего вы взяли, что там 5 байт? Почему не 9?

Тогда уж в таблице импорта подменяйте оригинал,своей, а в своей вызывайте оригинал и передвавайте в результат + что-то ещё. Такой метод 100% работает, но только для статического вызова.
Человек_Борща вне форума Ответить с цитированием
Старый 24.11.2014, 10:40   #16
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Предположу что *.dll которую ты хочешь фильтровать инжектят через отладчик и возможно делают проверку после ее подгрузки после LoadLibrary, что-то вроде..
Код:
CALL LoadLibrary, ...
CMP EAX, 0
JE BadOffset
Так вот проверь, это возможно может быть один из вариантов почему приложение падает.
Второе, попробуй все таки не выходить из твоей функции с нулем а продолжи выполнять дальше UnHookCodeHook, Result и т.д. но подставь в libname свою пустую DLL которая ничего не выполняет ну или какой-то message box выводит, так, для проверки.

Код:
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;

Последний раз редактировалось coNsept; 24.11.2014 в 10:43.
coNsept вне форума Ответить с цитированием
Старый 24.11.2014, 13:33   #17
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
С чего вы взяли, что там 5 байт? Почему не 9?

Тогда уж в таблице импорта подменяйте оригинал,своей, а в своей вызывайте оригинал и передвавайте в результат + что-то ещё. Такой метод 100% работает, но только для статического вызова.
Там первая инструкция jmp address, которая занимает 5 байт. Таблица импорта не подойдет, ведь инжектят либы через сторонние инжекторы, которые через GetProcAddress работают.

Значит попробовал я сделать, что хотел, но для начала решил сделать такую систему: Выделяется память, туда копируется оригинальная функция LoadLibraryW, в оригинальной функции LoadLibraryW первые 5 байт (jmp address) я подменяю на (jmp адрес копии). Тоесть я вообще не внедряю свою dll, только WriteProcessMemory. Еслибы это работало я бы пошел дальше. Вот код:
Код:
function  _InjectCode:Boolean;
  var
    wHandle :Integer;
    ProcessID:Integer;
    pLL1,pll2,pll3,pll4,pCodeProc:Pointer;
    hProcess:Cardinal;
    _WR:DWORD;
    jmpInstr:array[0..4] of Byte;
    df:DWORD;
begin
  Result := False;
  wHandle := FindWindow('...', nil);
  if wHandle = 0 then exit;
  GetWindowThreadProcessId(wHandle, @ProcessID);
  hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,ProcessID);
  if hProcess=0 then exit;
  pLL1 := GetProcAddress(GetModuleHandle(kernel32), 'LoadLibraryW');
  //Внедрение дублеката LoadLibraryW
  pCodeProc:=VirtualAllocEx(hProcess,0,34,MEM_COMMIT,PAGE_READWRITE);
  if DWORD(pCodeProc)=0 then exit;
  if not WriteProcessMemory(hProcess,pCodeProc,pLL1,34,_WR) then exit;
  if _WR = 0 then exit;
  // Инфецировать оригинальную LoadLibraryW
  pll4 := Pointer(pCodeProc);     //Тут адрес верный
  pll2 := Pointer(DWORD(pLL1) + $01); // Смещение $01 потомучто пропускаю инструкцию jmp, меня интересует только сам адрес, куда jmp ведет
  if not WriteProcessMemory(hProcess,pll2,pll4,4,_WR) then exit;
  if _WR = 0 then exit;
 Result := True;
end;
И так пробовал:
Код:
function  _InjectCode:Boolean;
type
  TAddrToByte = array[0..3] of byte;
  var
    wHandle :Integer;
    ProcessID:Integer;
    pLL1,pll2,pll3,pll4,pCodeProc:Pointer;
    hProcess:Cardinal;
    _WR:DWORD;
    jmpInstr:array[0..4] of Byte;
    AddrByte, AddrByte1:TAddrToByte;
    df:DWORD;
begin
  Result := False;
  wHandle := FindWindow('...', nil);
  if wHandle = 0 then exit;
  GetWindowThreadProcessId(wHandle, @ProcessID);
  hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,ProcessID);
  if hProcess=0 then exit;
  pLL1 := GetProcAddress(GetModuleHandle(kernel32), 'LoadLibraryW');
  //Внедрение дублеката LoadLibraryW
  pCodeProc:=VirtualAllocEx(hProcess,0,Length(Instruct),MEM_COMMIT,PAGE_READWRITE);
  if DWORD(pCodeProc)=0 then exit;
  if not WriteProcessMemory(hProcess,pCodeProc,pLL1,34,_WR) then exit;
  if _WR = 0 then exit;
  // Инфецировать оригинальную LoadLibraryW
  Pointer(AddrByte) := Pointer(pCodeProc);  //Адрес записывается задом наперед
  JmpInstr[0] := $E9; JmpInstr[1] := AddrByte[3]; JmpInstr[2] := AddrByte[2]; JmpInstr[3] := AddrByte[1]; JmpInstr[4] := AddrByte[0]; 
// $E9 это и есть jmp (как она записывается в памяти в байте)
  if not WriteProcessMemory(hProcess,pll1,@JmpInstr,5,_WR) then exit;
  if _WR = 0 then exit;
 Result := True;
end;
Но из обоих кодов вытекают одни и теже проблемы, а их 2:
1) В скопированной функции адреса (jmp address и call address) меняются, хотя байты теже самые.
2) Не могу никак правильно перевести адрес в 4 байта, чтобы записать его как инструкцию jmp адрес. После инфецирования первые 5 байт в оригинальной функции (которые мы подменили), ведут в null, потому-что не правильно записывается туда...
Не догоняю в чем же дело.

Цитата:
Сообщение от coNsept Посмотреть сообщение
Предположу что *.dll которую ты хочешь фильтровать инжектят через отладчик и возможно делают проверку после ее подгрузки после LoadLibrary, что-то вроде..
Код:
CALL LoadLibrary, ...
CMP EAX, 0
JE BadOffset
Так вот проверь, это возможно может быть один из вариантов почему приложение падает.
Второе, попробуй все таки не выходить из твоей функции с нулем а продолжи выполнять дальше UnHookCodeHook, Result и т.д. но подставь в libname свою пустую DLL которая ничего не выполняет ну или какой-то message box выводит, так, для проверки.

Код:
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;
Понял вас, но дело в том, что приложение падает даже при своей загрузке, когда загружаются стандартные dll. Про отладчики я уже молчу)
И дело в том, что все работает даже с нулем. Но стоит дописать еще какую-нибудь строчку... Типо вывода в файл или месаджбокс и краш.
Каждый день узнаю новое...

Последний раз редактировалось Anton911; 24.11.2014 в 14:02.
Anton911 вне форума Ответить с цитированием
Старый 24.11.2014, 14:14   #18
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Код:
function NewSystemFunction(libname:PWideChar):Cardinal;
begin
  UnHookCodeHook(@SystemFunctionBridge);
  Result := LoadLibraryW(libname);  SetProcedureHook(GetModuleHandle('kernel32.dll'),'LoadLibraryW',@NewSystemFunction,@SystemFunctionBridge);
end;
Я не силен в дельфях, плюсы ближе по духу, но если я правильно понял выше приведенный код работает нормально и без проблем вызывается без лишнего кода?
Быть точнее если в NewSystemFunction приведен только тот код который я указал.

Последний раз редактировалось coNsept; 24.11.2014 в 14:19.
coNsept вне форума Ответить с цитированием
Старый 24.11.2014, 14:35   #19
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Цитата:
Сообщение от coNsept Посмотреть сообщение
Код:
function NewSystemFunction(libname:PWideChar):Cardinal;
begin
  UnHookCodeHook(@SystemFunctionBridge);
  Result := LoadLibraryW(libname);  SetProcedureHook(GetModuleHandle('kernel32.dll'),'LoadLibraryW',@NewSystemFunction,@SystemFunctionBridge);
end;
Я не силен в дельфях, плюсы ближе по духу, но если я правильно понял выше приведенный код работает нормально и без проблем вызывается без лишнего кода?
Быть точнее если в NewSystemFunction приведен только тот код который я указал.
Да работает. Я вас случайно запутал, с кодом где Result = 0 даже если условие не выполняется происходит краш игры.
Каждый день узнаю новое...

Последний раз редактировалось Anton911; 24.11.2014 в 14:46.
Anton911 вне форума Ответить с цитированием
Старый 24.11.2014, 15:39   #20
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Попробуй добавить VirtualProtect и разрешить PAGE_EXECUTE_READWRITE от начала относительно той функции где ты проводишь какие либо операции.

Последний раз редактировалось coNsept; 24.11.2014 в 15:42.
coNsept вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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