Форум: "WinAPI";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];
Внизfile hooks Найти похожие ветки
← →
Rouse_ © (2005-12-29 18:18) [40]Получу настоящий адрес вызываемой функции и выполню ее.
Также смотри хелп по ImageRvaToVa...
> Можно про это по подробнее.
Шрайбера под рукой нет.
Если в общих чертах то:
Почти все подобные вызовы (Zw*) имеют в теле функции следующее:
mov eax, NumberFunction
lea edx, [esp+04h]
int 2eh
где NumberFunction есть номер вызываемой функции в таблице системных сервисов, которая находится по адресу, содержащемуся в глобальной переменной KeServiceDescriptorTable. Данная переменная указывает на следующую структуру:
typedef struct SystemServiceDescriptorTable
{
SSD SystemServiceDescriptors[4];
} SSDT, *LPSSDT;
Соответсвенно перехватом системных вызовов ядра, таких как:
ZwCreateFile, ZwOpenFile, IoCreateFile, ZwQueryDirectoryFile, ZwClose ты можешь выполнить сабжевую задачу.
← →
The_scorpion © (2005-12-29 18:26) [41]Так и думал что в ImageRvaToVa дело...хотел сейчас посмотреть, но sdk меня покинул, сюрприз блин.
А если и ImageRvaToVa перехватить?
← →
Rouse_ © (2005-12-29 18:26) [42]Собственно что обьяснять, вот тебе пример драйвера реализующий такой функционал: http://rouse.front.ru/keservicedescriptortable.zip
← →
Rouse_ © (2005-12-29 18:28) [43]
> А если и ImageRvaToVa перехватить?
Как сказал Игорь Шевченко - ""Жаба хитра, но маленький хрущ с винтом много хитрее ее" (с)"
Пойдем другим путем :)
← →
Игорь Шевченко © (2005-12-29 20:14) [44]The_scorpion ©
>Что-то я не понял...ну пребежишься ты по всем функциям в таблице >импорта, что это даст?...Как ты узнаешь какая функция была перехвачена?
Узнавать даже не требуется. Я сравню адрес с тем, что мне выдал GetProcAddress, если отличается, значит перехвачена либо GetProcAddress либо искомая функция.
Rouse_ © (29.12.05 18:18) [40]
> Почти все подобные вызовы (Zw*) имеют в теле функции следующее:
>
Уже не имеют. Уже другое содержимое.
← →
Rouse_ © (2005-12-30 01:20) [45]
> Уже не имеют. Уже другое содержимое.
Мммм, можно ссылочку? Или собственные исследования? Просто хочется быть в курсе нововведений, а времени как обычно не хватает по вечерам...
← →
n0name (2005-12-30 07:08) [46]sysenter/sysext
IDA 4.6 <- ntdll.dll
← →
n0name (2005-12-30 07:15) [47]
> Соответсвенно перехватом системных вызовов ядра, таких как:
> ZwCreateFile, ZwOpenFile, IoCreateFile, ZwQueryDirectoryFile,
> ZwClose ты можешь выполнить сабжевую задачу.
NtQuerySysemInformation(SystemHandleInformation, ...)
NtQueryObject(ObjectTypeInformation, ...)
TypeName -> "File"
NtQueryObject(ObjectNameInformation, ...)
ObjectName -> FileName
← →
Игорь Шевченко © (2005-12-30 10:50) [48]
> Просто хочется быть в курсе нововведений
mov eax,function_number
mov edx,7FFE0300h
call edx
ret xxxxx
← →
Rouse_ © (2005-12-30 11:33) [49]
> Игорь Шевченко © (30.12.05 10:50) [48]
Ааа, ну это тогда не сильно принципиально - подход тотже остался :) Пасибо :)
← →
Rouse_ © (2005-12-30 13:16) [50]
call edx
ret xxxxx
Секунду, а где вызов int 2eh? Это же шлюз между кольцами...
← →
Игорь Шевченко © (2005-12-30 13:41) [51]Rouse_ © (30.12.05 13:16) [50]
> Секунду, а где вызов int 2eh?
а его нету. Как было отмечено в ондом из постом, адрес, на который ссылается edx, является адресом команды sysenter
← →
Rouse_ © (2005-12-30 13:48) [52]О как...
Век живи - век учись, а все равно дураком помрешь :) Пасибо...
← →
Игорь Шевченко © (2005-12-30 13:58) [53]
> Как было отмечено в ондом из постом
Праздник в разгаре, однако
← →
Rouse_ © (2005-12-30 14:01) [54]
> Праздник в разгаре, однако
:)))
С наступающим :)
← →
n0name (2005-12-30 21:47) [55]В WinXP можно юзать и Int 2Eh, никто не запретит %)
Вот пример для SP0.program Int2EhInterface;
type
DWORD = Cardinal;
PChar = Pointer;
NTSTATUS = Integer;
PDWORD = ^DWORD;
function MessageBoxA(HWND: DWORD; Msg, Capt: PChar; uType: DWORD): Integer; stdcall; external "user32.dll";
const
Msg: array [0..8] of char = "Test Msg"#0;
Capt: array [0..9] of char = "Test Capt"#0;
function DoInt2Eh(SysN: Integer): NTSTATUS; stdcall; assembler;
asm
mov eax, [ebp + 8]
lea edx, [ebp + 20]
int 2Eh
end;
function ZwTerminateProcess(hProcess: DWORD; uCode: DWORD): NTSTATUS; stdcall; assembler;
asm
push 101h
call DoInt2Eh;
end;
function ZwWriteVirtualMemory(hProcess: DWORD; BaseAddress: Pointer; Buffer: Pointer; Size: DWORD; bw: PDWORD): NTSTATUS;
stdcall; assembler;
asm
push 115h
call DoInt2Eh
end;
procedure DoMessage;
begin
MessageBoxA(0, @Msg, @Capt, 0);
end;
var
Buf: DWORD;
begin
Buf := $6C6F6F43;
DoMessage;
ZwWriteVirtualMemory(DWORD(-1), @Msg, @Buf, 4, nil);
DoMessage;
ZwTerminateProcess(DWORD(-1), 0);
end.
← →
Игорь Шевченко © (2005-12-30 23:09) [56]n0name (30.12.05 21:47) [55]
> В WinXP можно юзать и Int 2Eh, никто не запретит %)
Это факт. Вот только отслеживать номера сервисов от сервис-пака к сервис паку дело очень утомительное.
С наступающим!
Rouse_ © (30.12.05 14:01) [54]
Взаимно, Саша, удачи во всем!
← →
n0name (2005-12-31 08:05) [57]
> С наступающим!
Тебе того же, чтоб все твои желания сбылись =)
> Это факт. Вот только отслеживать номера сервисов от сервис-
> пака к сервис паку дело очень утомительное.
Динамический дизасм ntdll.dll, для этого можно использовать простой дизасм длин.
PS: Всех форумчан с НГ =)
← →
pilot (2006-03-07 11:36) [58]http://forum.vingrad.ru/index.php?showtopic=21411&view=findpost&p=343749
Страницы: 1 2 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.013 c