Сейчас на форуме: asfa, _MBK_, Adler (+8 невидимых)

 eXeL@B —› Вопросы новичков —› Поменять флаги секции в EXE из вызываемой им DLL
Посл.ответ Сообщение


Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 18 декабря 2012 02:40
· Личное сообщение · #1

Понимаю, что вопрос глупый и для решения задачи мне не хватает знания PE формата и ещё много чего, однако может кто подскажет.
Есть ЕХЕ файл который вызывает мою длл. Если в нужной секции установить флажок разрешения записи, (патч одного байта по адресу $400247 c $60 на $E0) то в длл можно делать так: dword(pointer($406720)^):=$90909090;
По некоторым соображениям не хочется менять EXE файл на диске. Конечно можно использовать связку OpenProcess/WriteProcessMemory и это работает для всех адресов нужной секции, однако не работает для адреса $400247 где располагается флаг секции.
Хочется найти вариант как поменять на лету флаг записи, что бы далее пользоваться прямой записью dword(pointer($406720)^):=$90909090;



Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 18 декабря 2012 05:13 · Поправил: SReg
· Личное сообщение · #2

ToBad

Code:
  1. library inject;
  2.  
  3. uses
  4.   SysUtils,
  5.   Windows;
  6.  
  7. {$IMAGEBASE $10000000}
  8.  
  9. procedure MyProc; stdcall;
  10. const new_characteristics: Cardinal = $E0000060;
  11. var offset,oldprt : Cardinal;
  12. begin
  13.  offset:= GetModuleHandle(nil);
  14. inc(offset,$21C); // 21C - посмотришь в ольке, чтоб по быстрому и без лишнего кода
  15.  VirtualProtect(Pointer(offset),4,PAGE_READWRITE,oldprt);
  16.  CopyMemory(Pointer(offset), Addr(new_characteristics), 4);
  17. VirtualProtect(Pointer(offset),4,oldprt,oldprt);
  18. end;
  19.  
  20. procedure DLLEntryPoint(dwReason: DWORD);
  21. begin
  22.  case dwReason of
  23.   DLL_PROCESS_ATTACH:
  24.   begin
  25.    MyProc;
  26.   end;
  27.   DLL_PROCESS_DETACH:
  28.   begin
  29.   end;
  30.  end;
  31. end;
  32.  
  33. exports
  34. MyProc;
  35.  
  36. begin
  37.  if @DllProc = nil then
  38.  begin
  39.   DllProc := @DLLEntryPoint;
  40.   DllEntryPoint(Dll_Process_Attach);
  41.  end;
  42. end.

в аттаче работающий пример


683a_18.12.2012_EXELAB.rU.tgz - Project1.rar

| Сообщение посчитали полезным: ToBad


Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 18 декабря 2012 06:07 · Поправил: ToBad
· Личное сообщение · #3

SReg - спасибо за пример! Код меняет флаг секции, только к сожалению это не помогает. Дальнейшая запись всё равно вызывает исключение, память не может быть записана...

Вот мой пример.



Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 18 декабря 2012 06:47
· Личное сообщение · #4

ToBad пишет:
Дальнейшая запись всё равно вызывает исключение

сурово ты написал там)) Вот пробуй...
Code:
  1. library SensApi;
  2.  
  3. uses
  4.   SysUtils,
  5.   Windows;
  6.  
  7. {$IMAGEBASE $10000000}
  8.  
  9. procedure MyProc; stdcall;
  10. const new_characteristics: Cardinal = $E0000020;
  11. jmp : Word = $2BEB;
  12. var offset,oldprt,Hndl : Cardinal;
  13.  
  14. begin
  15.  Hndl:= GetModuleHandle(nil);
  16.  offset:=Hndl+$244;
  17.  VirtualProtect(Pointer(offset),4,PAGE_READWRITE,oldprt);
  18.  CopyMemory(Pointer(offset), Addr(new_characteristics), 4);
  19.  VirtualProtect(Pointer(offset),4,oldprt,oldprt);
  20.  offset:= Hndl + $1BF213;
  21.  VirtualProtect(Pointer(offset),4,PAGE_READWRITE,oldprt);
  22.  CopyMemory(Pointer(offset), Addr(jmp), 2);
  23.  VirtualProtect(Pointer(offset),4,oldprt,oldprt);
  24.  
  25. end;
  26.  
  27. function IsNetworkAlive(a:dword):boolean; stdcall;
  28. begin
  29. Result:=true;
  30. end;
  31.  
  32. procedure DLLEntryPoint(dwReason: DWORD);
  33. begin
  34.  case dwReason of
  35.   DLL_PROCESS_ATTACH:
  36.   begin
  37.    MyProc;
  38.   end;
  39.   DLL_PROCESS_DETACH:
  40.   begin
  41.   end;
  42.  end;
  43. end;
  44.  
  45. exports IsNetworkAlive, MyProc;
  46.  
  47. begin
  48.  if @DllProc = nil then
  49.  begin
  50.   DllProc := @DLLEntryPoint;
  51.   DllEntryPoint(Dll_Process_Attach);
  52.  end;
  53.  
  54. end.





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 18 декабря 2012 10:08
· Личное сообщение · #5

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

| Сообщение посчитали полезным: ToBad


Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 18 декабря 2012 15:58 · Поправил: ToBad
· Личное сообщение · #6

SReg - в том то и дело, что конструкцию типа этой использовать не хотел:
Code:
  1. offset:= Hndl + $1BF213;
  2.  VirtualProtect(Pointer(offset),4,PAGE_READWRITE,oldprt);


Archer пишет:
Либо делай руками VirtualProtect на всю секцию, что достаточно криво, но удовлетворит постановке задачи, что потом можно будет писать прямо.


Да, это то, что нужно. Просто пример SReg расширю на участок попадающий под патч, между двух VirtualProtect сделаю всё что нужно и будет работать!

Всем спасибо за помощь!


 eXeL@B —› Вопросы новичков —› Поменять флаги секции в EXE из вызываемой им DLL
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати