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

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

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

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

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

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

Цитата:
Сообщение от coNsept Посмотреть сообщение
Попробуй добавить VirtualProtect и разрешить PAGE_EXECUTE_READWRITE от начала относительно той функции где ты проводишь какие либо операции.
Не помогло((

Разбираюсь дальше с инъекцией кода.
Значит инструкция jmp работает со смещением, а не с адресом "напрямую".
Глянул исходники Грузина. Там формула такая была АдресНовойФункции - АдресСтаройФункции - 5. Подстроил под себя. Теперь jmp оригинальной функции отсылает именно на мою копию.

Вот только в копии также есть jmp и call, который ведет в null, там ведь тоже смещение, но те что сейчас записаны они относительно оригинала, а не копии, пока чет не могу формулу подобрать)) Но теперь хоть понятно стало, почему при одинаковых байтах адреса получались разные))


Так, вычислил формулы, все подставляется и работает. Проверил инфецированную функцию LoadLibraryW, вроде приложение не падает и дллки грузятся, как положено. Пора эксперементировать с третей функцией, которая будет работать между оригиналом и копией.
Каждый день узнаю новое...

Последний раз редактировалось Anton911; 25.11.2014 в 10:27.
Anton911 вне форума Ответить с цитированием
Старый 25.11.2014, 11:49   #22
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Сделал третью функцию. Связал их между собой.

Код:
library dll;

uses
  Windows,
  SysUtils;

type
TNewLoadlib = function(llib:PWideChar):Cardinal;  stdcall;

var
  _LoadLibraryW:TNewLoadLib;


{$R *.res}


function NewSystemFunction(libname:PWideChar):Cardinal; stdcall;
  var
    Test:string;
    point:Pointer;
begin
  MessageBox(0, PChar(libname), PChar('Test'), MB_YESNO);
    _LoadLibraryW(libname);
end;


function  _InjectCode:Boolean; stdcall;
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, AddrByte_jmp, AddrByte_call:TAddrToByte;
    OldJmp, OldCall:TAddrToByte;
begin
  Result := False;
  hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,GetCurrentProcessId);
  if hProcess=0 then exit;
  pLL1 := GetProcAddress(GetModuleHandle(kernel32), 'LoadLibraryW');
  //Внедрение дублеката LoadLibraryW
  pCodeProc:=VirtualAllocEx(hProcess,0,34,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
  if DWORD(pCodeProc)=0 then exit;
  if not WriteProcessMemory(hProcess,pCodeProc,pLL1,34,_WR) then exit;
  if _WR = 0 then exit;
  @_LoadLibraryW := pCodeProc;
  // Инфецировать оригинальную LoadLibraryW
  DWORD(AddrByte) := DWORD(Addr(NewSystemFunction)) - DWORD(pll1) - 5; //Вычисляем смещение копии от оригинала
  pll2 := pointer(dword(pll1) + 1);
  if not WriteProcessMemory(hProcess,pll2,@AddrByte,4,_WR) then exit;
  // Инфецировать копию LoadLibraryW
  pll2 := pointer(dword(pCodeProc) + 1);
  if not ReadProcessMemory(hProcess,pll2,@OldJmp,4,_WR) then exit;
  DWORD(OldJmp) := DWORD(OldJmp) - DWORD(AddrByte) - 5;
  if not WriteProcessMemory(hProcess,pll2,@OlDJmp,4,_WR) then exit;
  pll2 := pointer(dword(pCodeProc) + 13);
  if not ReadProcessMemory(hProcess,pll2,@OldCall,4,_WR) then exit;
  DWORD(OldCall) := DWORD(OldCall) - DWORD(AddrByte) - 5;
  if not WriteProcessMemory(hProcess,pll2,@OldCall,4,_WR) then exit;
 Result := True;
end;


     //главный библиотечный обработчик
 procedure DLLEntryPoint(dwReason:DWord);
  var
    OldPageProtection: Cardinal;
 begin
   case dwReason of
     DLL_PROCESS_ATTACH:
     begin
     _InjectCode;

     end;
     DLL_PROCESS_DETACH:
     begin

     end;
   end;
 end;

 begin
   DllProc:= @DLLEntryPoint; //устанавливаеем библиотечный обработчик
   DLLEntryPoint(DLL_PROCESS_ATTACH);
 end.
В месадж бокc высвечивается название допустим "d3d9.dll", и потом сразу краш. Скорее всего изза того, что передается именно название дллки, а не ее полный путь. Но как сделать, чтобы полный путь передавался, никак не пойму.

Ага, нашел баг:
Вот теперь верные строчки:
Код:
  // Инфецировать оригинальную LoadLibraryW
  DWORD(AddrByte1) := DWORD(Addr(NewSystemFunction)) - DWORD(pll1) - 5; //Вычисляем смещение копии от оригинала
  DWORD(AddrByte) := DWORD(pCodeProc) - DWORD(pll1) - 5; //Вычисляем смещение копии от оригинала
  pll2 := pointer(dword(pll1) + 1);
  if not WriteProcessMemory(hProcess,pll2,@AddrByte1,4,_WR) then exit;
  // Инфецировать копию LoadLibraryW
Но с мессадж боксом почемуто крашится иногда, а без него работает, продолжу исследования.
Каждый день узнаю новое...

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

GetCurrentPath + DllName

http://stackoverflow.com/questions/2...ication-window
coNsept вне форума Ответить с цитированием
Старый 25.11.2014, 16:31   #24
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Ладно. Вроде все работает. Но мне это не подходит Придется OpenProcess ковырять. с Глобальным сплайсингом. Но это уже будет свовсем другая история.
Каждый день узнаю новое...
Anton911 вне форума Ответить с цитированием
Старый 09.12.2014, 00:05   #25
fucil
Форумчанин
 
Регистрация: 24.02.2010
Сообщений: 148
По умолчанию

Вариант с перебором всех загруженных dll не подходит, т.к. она уже будет загружена

Как я понял у тебя лаунчер, сделай так: запуск игры и сходу загружай список dll с которыми стартовала игра, и после делай сравнение с этим списком, лишнее выгружай.
+ исключения.

Последний раз редактировалось fucil; 09.12.2014 в 00:18.
fucil вне форума Ответить с цитированием
Ответ


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