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

 eXeL@B —› Программирование —› advApiHook: Как узнать имя модуля из которого вызвалась перехваченная функция ?
Посл.ответ Сообщение


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

Создано: 01 июля 2007 12:25
· Личное сообщение · #1

С помощью advApiHook делаю перехват API функции RegOpenKeyExA. Находясь в перехваченной функции хочу знать имя модуля из которого она вызвалась. То есть программа test.exe не только сама использует функцию, но и все dll которые она вызывает – то же. Как это сделать самым простым способом ? Подозреваю, что можно узнавать адрес возврата, потом получать список всех подгруженных модулей в test.exe, затем смотреть по адресному пространству ? Но может можно проще ?

Кусок внедряющий dll:
ZeroMemory(@StartInfo, SizeOf(TStartupInfo));
StartInfo.cb:= SizeOf(TStartupInfo);
a:=CreateProcess(nil,’test.exe’ nil, nil, False, 4,nil, nil, StartInfo, ProcInfo);
injectDll(ProcInfo.hProcess, ‘myhook.dll');
ResumeThread(ProcInfo.hThread);


Функция получившая управление:
function NewRegOpenKeyExA(hKey: HKEY; lpSubKey: PAnsiChar; ulOptions: DWORD; samDesired: REGSAM; var phkResult: HKEY): Longint; stdcall;
Begin
TrueRegOpenKeyExA(hKey,lpSubKey,ulOptions,samDesired,phkResult);
end;




Ранг: 226.0 (наставник), 67thx
Активность: 0.160
Статус: Участник

Создано: 01 июля 2007 19:29 · Поправил: SergX
· Личное сообщение · #2

Можно сделать так:

function NewRegOpenKeyExA(hKey: HKEY; lpSubKey: PAnsiChar; ulOptions: DWORD; samDesired: REGSAM; var phkResult: HKEY): Longint; stdcall;
Begin
TrueRegOpenKeyExA(hKey,lpSubKey,ulOptions,samDesired,phkResult);
asm
@xxx:
nop
jmp @xxx
end;
end;


И олькой занопать джамп и посмотреть куда вернешься.

Или тебе надо из твоей проги узнать кто вызывал ?




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

Создано: 01 июля 2007 19:36
· Личное сообщение · #3

SergX пишет:
Или тебе надо из твоей проги узнать кто вызывал ?


Да, именно. Мне нужно отлавливать и модифицировать вызовы из определённых dll.
Kerberos 1.07 умеет это определять. Лог выдаётся в таком виде:
=================================================================
MODULE_NAME RET_ADDR FUNCTION_NAME
=================================================================
MFC80.DLL | 78237867 | RegOpenKeyExA(80000001, 781E19B8: "Soft
MFC80.DLL | 78237887 | RegQueryValueExA(0000000C, 781E1A78: "N
MFC80.DLL | 78237887 | RegQueryValueExA(0000000C, 781E1A6C: "N
MFC80.DLL | 78237887 | RegQueryValueExA(0000000C, 781E1A60: "R
MFC80.DLL | 78237887 | RegQueryValueExA(0000000C, 781E1A48: "N
MFC80.DLL | 78237887 | RegQueryValueExA(0000000C, 781E1A34: "N
MFC80.DLL | 78237887 | RegQueryValueExA(0000000C, 781E1A2C: "N
MFC80.DLL | 782378CB | RegCloseKey(0000000C) returns: 00000000
MFC80.DLL | 78237867 | RegOpenKeyExA(80000001, 781E197C: "Soft
MFC80.DLL | 78237867 | RegOpenKeyExA(80000001, 781E1940: "Soft
SHELL32.dll | 7C9EF186 | RegCreateKeyExW(80000002, 0012E820: "So
SHLWAPI.dll | 77F642B7 | RegQueryValueExW(000000C0, 7C9C7584: "C
SHELL32.dll | 7C9EF0C9 | RegCloseKey(000000C0) returns: 00000000
SHELL32.dll | 7C9EF186 | RegCreateKeyExW(80000002, 0012EA60: "So
SHELL32.dll | 7CA23F0C | RegSetValueExW(000000C0, 7C9C7584: "Com
SHELL32.dll | 7CA23F15 | RegCloseKey(000000C0) returns: 00000000

=================================================================




Ранг: 228.7 (наставник), 2thx
Активность: 0.120
Статус: Участник
malware research

Создано: 01 июля 2007 19:48
· Личное сообщение · #4

ToBad
В вершине стека, в самом начале твоей функции перехвата, лежит адрес возврата, бери его и смотри из какого он модуля. Обычно так поступают.

-----
Research is my purpose




Ранг: 51.0 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 01 июля 2007 23:07 · Поправил: sotona
· Личное сообщение · #5


var
module : Cardinal;
path : string;
begin
asm
mov eax, [ebp+4]
and eax, 0FFFFF000h
@1: cmp word ptr [eax], 5A4Dh
je @2
sub eax, 1000h
jmp @1
@2: mov edx, [eax+3Ch]
add edx, eax
cmp dword ptr [edx], 4550h
jne @1
mov module, eax
end;
SetLength(path,MAX_PATH);
SetLength(path,GetModuleFileName(module,pchar(path),MAX_PATH));
ShowMessage(path);
end;




Ранг: 51.0 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 01 июля 2007 23:10
· Личное сообщение · #6

че-то хреново отформатировался код, без табов. но вроде понятно




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

Создано: 01 июля 2007 23:52
· Личное сообщение · #7

sotona - Спасибо ! Отлично работает !
Есть вопросик. Как поправить код, что бы можно было засунуть это в функцию, которая будет вызываться из NewRegOpenKeyExA и возвращать имя модуля ? Просто перехватываемых функций будет много, копировать в тело каждой этот код не рационально.
Так же есть наблюдение, если dll покрыта аспром, то возвращается пустая строка до тех пор, пока не пойдёт обращение из кода самой защищённой dll а не аспровой части. Помню в сайсе тоже так было...
По идее метод предложенный Error_Log должен сработать ибо в Kerberos имя модуля при обращении аспра из него - отображается.



Ранг: 51.0 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 02 июля 2007 03:32
· Личное сообщение · #8

То, что написал я, как раз и есть предложенное Error_Log. Но дело в том, что в вызванной функции трудно будет получить адрес возврата функции выше. Поэтому без мелких ассемблерных вставок в каждой функции-перехватчике всё равно не обойтись.

вот функция:

function GetPathByRet(ret_addr: Cardinal): string;
var
module : cardinal;
begin
asm
mov eax, ret_addr
and eax, 0FFFFF000h
@1: cmp word ptr [eax], 5A4Dh
je @2
sub eax, 1000h
jmp @1
@2: mov edx, [eax+3Ch]
add edx, eax
cmp dword ptr [edx], 4550h
jne @1
mov module, eax
end;
SetLength(Result,MAX_PATH);
SetLength(Result,GetModuleFileName(module,pchar(Result),MAX_PATH));
end;


А вызывать её вот так:

procedure blablablabla;
var
path : string;
t : Cardinal;
begin
asm push dword ptr [ebp+4] ; pop dword ptr t end;
path := GetPathByRet(t);
ShowMessage(path);
end;

Т.е. перед вызовом GetPathByRet одна лишня строчка еще. А как иначе сделать - хз.




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

Создано: 02 июля 2007 13:47
· Личное сообщение · #9

sotona пишет:
Т.е. перед вызовом GetPathByRet одна лишня строчка еще. А как иначе сделать - хз.


Супер ! Так вполне подходит ! Ещё раз спасибо !!!


 eXeL@B —› Программирование —› advApiHook: Как узнать имя модуля из которого вызвалась перехваченная функция ?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати