Сейчас на форуме: zds, UniSoft (+5 невидимых)

 eXeL@B —› Программирование —› GetProcAddress
Посл.ответ Сообщение


Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 02 февраля 2013 15:09
· Личное сообщение · #1

В одной проге столкнулся с тем, что GetProcAddress указывает на apphelp. При вызове getproca c параметром CreateProcessW получаю адрес в AcLayers. Раньше такое наблюдал при режиме совместимости. Проблема в том, что прога вызывает CreateProc из кернела напрямую, а мне надо его перехватить. Есть ли способ получить нормальный адрес из кернела? Руками парсить экспорт не сильно хочется.




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

Создано: 02 февраля 2013 16:10
· Личное сообщение · #2

Совместимость и есть, application compatibility layers. А вызываешь откуда, из инжекченой длл? Теоретически можно дёрнуть из другого процесса, если архитектура позволяет. А в своём процессе повырубать совместимость уже. Как вариант-спустись пониже и хукай функции ниже, ибо совместимость захардкодена для некоторых функций по сути.




Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 02 февраля 2013 16:14 · Поправил: Nightshade
· Личное сообщение · #3

Вызов из заинжекченой длл. Дернуть из другого процесса думаю реально. Не знаю совпадет ли адрес в другом процессе. Спуститься пониже тоже реально, но придется переписывать кучу кода. Парсер экспорта в длл (зная ее imagebase) есть у кого?




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

Создано: 02 февраля 2013 16:22
· Личное сообщение · #4

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




Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 02 февраля 2013 17:09
· Личное сообщение · #5

Язык желательно делфи. Гугл у меня походу сломался. Или я не так гуглю. Мне нужен CreateProccessW из kernel32.dll.




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 02 февраля 2013 17:26
· Личное сообщение · #6

ну как-то так:
Code:
  1. function GetProcAddressEx(const imagebase: dword; apiname: pchar): pointer;
  2. var
  3.   pPeHeader   : PImageNtHeaders;
  4.   pPExport    : PImageExportDirectory;
  5.   pName       : PDWordArray;
  6.   pFunc       : PDWordArray;
  7.   pOrd        : PWordArray;
  8.   i           : Integer;
  9.   apinum      : Integer;
  10. begin
  11.   result    := nil;
  12.   pPEHeader := PImageNtHeaders(imagebase+DWord(PImageDosHeader(imagebase)._lfanew));
  13.   pPExport  := PImageExportDirectory(imagebase+pPEHeader.OptionalHeader.DataDirectory[0].VirtualAddress);
  14.   pName     := POINTER(imagebase + DWord(pPExport.AddressOfNames));
  15.   pFunc     := POINTER(imagebase + DWord(pPExport.AddressOfFunctions));
  16.   pOrd      := POINTER(imagebase + DWord(pPExport.AddressOfNameOrdinals));
  17.  
  18.   For i := 0 to pPExport.NumberOfNames - 1 do
  19.   begin
  20.     If (lstrcmpiA(apiname,PChar(imagebase + pName[i])) = 0) then
  21.     begin
  22.       result := POINTER((imagebase) + pFunc[pOrd[i]]);
  23.       break;
  24.     end;
  25.   end
  26. end;


-----
[nice coder and reverser]


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


Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 02 февраля 2013 20:51
· Личное сообщение · #7

Получилось так:
Code:
  1. function GetProcAddressEx(const imagebase: dword; apiname: pansichar): pointer;
  2. type
  3. TDWordArray = array[0..maxint div 16] of dword;
  4. PDWordArray = ^TDWordArray;
  5. var
  6.   pPeHeader   : PImageNtHeaders;
  7.   pPExport    : PImageExportDirectory;
  8.   pName       : PDWordArray;
  9.   pFunc       : PDWordArray;
  10.   pOrd        : PWordArray;
  11.   i           : Integer;
  12.   apinum      : Integer;
  13. begin
  14.   result    := nil;
  15.   pPEHeader := PImageNtHeaders(imagebase+DWord(PImageDosHeader(imagebase)._lfanew));
  16.   pPExport  := PImageExportDirectory(imagebase+pPEHeader.OptionalHeader.DataDirectory[0].VirtualAddress);
  17.   pName     := POINTER(imagebase + DWord(pPExport.AddressOfNames));
  18.   pFunc     := POINTER(imagebase + DWord(pPExport.AddressOfFunctions));
  19.   pOrd      := POINTER(imagebase + DWord(pPExport.AddressOfNameOrdinals));
  20.  
  21.   For i := 0 to pPExport.NumberOfNames - 1 do
  22.   begin
  23.     If (lstrcmpiA(apiname,PansiChar(imagebase + pName[i])) = 0) then
  24.     begin
  25.       result := POINTER((imagebase) + pFunc[pOrd[i]]);
  26.       break;
  27.     end;
  28.   end
  29. end;

спс за код


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