Посл.ответ |
Сообщение |
Ранг: 450.3 (мудрец), 13thx Активность: 0.2↘0 Статус: Участник
|
Создано: 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.16↘0 Статус: Участник
|
Создано: 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.2↘0 Статус: Участник
|
Создано: 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.12↘0 Статус: Участник malware research
|
Создано: 01 июля 2007 19:48 · Личное сообщение · #4
ToBad
В вершине стека, в самом начале твоей функции перехвата, лежит адрес возврата, бери его и смотри из какого он модуля. Обычно так поступают.
----- Research is my purpose | Сообщение посчитали полезным: |
Ранг: 51.0 (постоянный) Активность: 0.03↘0 Статус: Участник
|
Создано: 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.03↘0 Статус: Участник
|
Создано: 01 июля 2007 23:10 · Личное сообщение · #6
че-то хреново отформатировался код, без табов. но вроде понятно
| Сообщение посчитали полезным: |
Ранг: 450.3 (мудрец), 13thx Активность: 0.2↘0 Статус: Участник
|
Создано: 01 июля 2007 23:52 · Личное сообщение · #7
sotona - Спасибо ! Отлично работает !
Есть вопросик. Как поправить код, что бы можно было засунуть это в функцию, которая будет вызываться из NewRegOpenKeyExA и возвращать имя модуля ? Просто перехватываемых функций будет много, копировать в тело каждой этот код не рационально.
Так же есть наблюдение, если dll покрыта аспром, то возвращается пустая строка до тех пор, пока не пойдёт обращение из кода самой защищённой dll а не аспровой части. Помню в сайсе тоже так было...
По идее метод предложенный Error_Log должен сработать ибо в Kerberos имя модуля при обращении аспра из него - отображается.
| Сообщение посчитали полезным: |
Ранг: 51.0 (постоянный) Активность: 0.03↘0 Статус: Участник
|
Создано: 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.2↘0 Статус: Участник
|
Создано: 02 июля 2007 13:47 · Личное сообщение · #9
sotona пишет:
Т.е. перед вызовом GetPathByRet одна лишня строчка еще. А как иначе сделать - хз.
Супер ! Так вполне подходит ! Ещё раз спасибо !!!
| Сообщение посчитали полезным: |