![]() |
eXeL@B —› Программирование —› Перехват CreateProcessA |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 07 марта 2009 17:14 · Личное сообщение · #1 На просторах инета нашел такой вот код по перехвату Апи функций, откомпилил его, запустил, вся ось встала колом, т.к. я новичок в перехвате (да и в общем в написании подобных либ) прошу помощи у вас. Помогите плз мне найти ошибки, заранее спс uses windows, TLHelp32; type far_jmp = packed record PushOp: byte; PushArg: pointer; RetOp: byte; end; OldCode = packed record One: dword; two: word; end; var AdrCreateProcessA: pointer; OldCrp: OldCode; JmpCrProcA: far_jmp; writen,bw:DWORD; const THREAD_SUSPEND_RESUME = $2; CREATE_SUSPEND = $4; function OpenThread(dwDesiredAccess: dword; bInheritHandle: bool; dwThreadId: dword): dword; stdcall; external 'kernel32.dll'; procedure StopThreads; var h, CurrTh, ThrHandle, CurrPr, CorrTh: dword; Thread: TThreadEntry32; begin CurrTh := GetCurrentProcessId; CurrPr := GetCurrentProcessId; h := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); if h <> INVALID_HANDLE_VALUE then begin Thread.dwSize := SizeOf(TThreadEntry32); if Thread32First(h, Thread) then repeat if (Thread.th32ThreadID <> CurrTh) and (Thread.th32OwnerProcessID <> CurrPr) then begin ThrHandle := OpenThread(THREAD_SUSPEND_RESUME, false, Thread.th32ThreadID); if ThrHandle>0 then begin SuspendThread(ThrHandle); CloseHandle(ThrHandle); end; end; until not Thread32Next(h, Thread); CloseHandle(h); end; end; procedure RunThreads; var h, CurrTh, ThrHandle, CurrPr: dword; Thread: TThreadEntry32; begin CurrTh := GetCurrentThreadId; CurrPr := GetCurrentProcessId; h := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); if h <> INVALID_HANDLE_VALUE then begin Thread.dwSize := SizeOf(TThreadEntry32); if Thread32First(h, Thread) then repeat if (Thread.th32ThreadID <> CurrTh) and (Thread.th32OwnerProcessID = CurrPr) then begin ThrHandle := OpenThread(THREAD_SUSPEND_RESUME, false, Thread.th32ThreadID); if ThrHandle > 0 then begin ResumeThread(ThrHandle); CloseHandle(ThrHandle); end; end; until not Thread32Next(h, Thread); CloseHandle(h); end; end; function TrueCreateProcessA(lpApplicationName: PChar; lpCommandLine: PChar; lpProcessAttributes, lpThreadAttributes: PSecurityAttributes; bInheritHandles: BOOL; dwCreationFlags: dword; lpEnviroment: Pointer; lpCurrentDirectory: PChar; const lpStartupInfo: TStartupInfo; var lpProcessInformation: TProcessInformation): BOOL; var CurrProc: dword; begin CurrProc := GetCurrentProcessId; //Снятие перехвата// WriteProcessMemory(CurrProc, AdrCreateProcessA, @OldCrp, SizeOf(OldCode), Writen); //Вызов функции // result := CreateProcess(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags or CREATE_SUSPEND, lpEnviroment, nil, lpStartupInfo, lpProcessInformation); //Установка перехвата// WriteProcessMemory(CurrProc, AdrCreateProcessA, @JmpCrProcA, SizeOf(far_jmp), writen); end; function NewCreateProcessA(lpApplicationName: PChar; lpCommandLine: PChar; lpProcessAttributes, lpThreadAttributes: PSecurityAttributes; bUnheritHandles: BOOL; dwCreationFlags: dword; lpEnviroment: Pointer; lpCurrentDirectory: PChar; const lpStartupInfo: TStartupInfo; var lpProcessInformation: TProcessInformation): BOOL; stdcall; begin MessageBoxA(0, 'функция перехвачена!', 'Уведомление', MB_OK); result := TrueCreateProcessA(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bUnheritHandles, dwCreationFlags or CREATE_SUSPEND, lpEnviroment, nil, lpStartupInfo, lpProcessInformation); end; procedure SetHook; var hKernel32, hUser32, CurrProc: dword; begin CurrProc := GetCurrentProcess; //Получение адреса CreateProcessA// AdrCreateProcessA := GetProcAddress(GetModuleHandle('kernel32.dll'), 'CreateProcessA'); //Инициализация структуры перехвата CreateProcessA JmpCrProcA.PushOp := $68; JmpCrProcA.PushArg := @NewCreateProcessA; JmpCrProcA.RetOp := $C3; //Сохраняем старое начало функции// ReadProcessMemory(CurrProc, AdrCreateProcessA, @oldCrp, Sizeof(OldCode), bw); //Записываем новое начало CreateProcessA WriteProcessMemory(CurrProc, AdrCreateProcessA, @JmpCrProcA, SizeOf(far_jmp), Writen); end; begin //остонавливаем побочниы нити StopThreads; //Устонавливаем перехват SetHook; //Запускаем нити RunThreads; end. Ну, соотвествено загружаю loadLibrary ( MyDll.dll' ); Выгружаю FreeLibrary (GetModuleHandle ('MyDll.dll')); ![]() |
|
Создано: 07 марта 2009 17:25 · Поправил: coderess · Личное сообщение · #2 |
|
Создано: 07 марта 2009 17:37 · Личное сообщение · #3 |
|
Создано: 07 марта 2009 17:44 · Личное сообщение · #4 Отладчик сайс или сусер ставишь www.rsdn.ru/article/baseserv/IntercetionAPI.xml Отладка кода загрузчика Итак, есть 2 процесса: Процесс, который внедряет код. Обозначим его П1. Процесс, в который внедряют код. Обозначим его П2. Задача заключается в том, чтобы поставить точку останова в П2 перед выполнением внедренного кода. Изначально неизвестно, по какому адресу будет внедрен код в П2. При этом предполагается, что П2 уже загружен и висит где-то в памяти. Для простоты запускаем П1 в каком-либо встроенном отладчике и трассируем, для того, чтобы узнать по какому адресу в П2 будет выделена память. Узнав этот адрес, включаем SoftIce (ctrl+d). Подключаемся к П2 (addr П2-name), при этом SoftIce установит контекст адресов, соответствующий процессу П2. Устанавливаем точку останова по узнанному адресу (bpx address). Закрываем SoftIce(ctrl+d). Выполняем П1. При этом он создает поток в П2. Когда этот поток начинает исполняться, на первой инструкции внедренного кода выскакивает окно SoftIce. ----- Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes ![]() |
|
Создано: 07 марта 2009 18:00 · Личное сообщение · #5 |
|
Создано: 07 марта 2009 18:18 · Личное сообщение · #6 |
|
Создано: 08 марта 2009 07:14 · Личное сообщение · #7 |
|
Создано: 08 марта 2009 08:11 · Личное сообщение · #8 |
|
Создано: 08 марта 2009 10:38 · Личное сообщение · #9 |
|
Создано: 08 марта 2009 11:20 · Поправил: Clerk · Личное сообщение · #10 Нынче так ничего не делается. В идеале следует перехватывать сервисы, но это там может понадобится жёсткий перехват. Нормально следует установить диспетчер исключений и ловить исключения. Есть такая техника, именуется развёрткой(парсингом) стека. Первое что приходит на ум это перехват захвата PEB. Подменяем в PEB поле FastPebLockRoutine на свой код. Далее при создании процесса юзоется цепочка: CreateProcessInternalW -> RtlDosPathNameToNtPathName_U -> RtlDosPathNameToNtPathName_Ustr -> RtlAcquirePebLock Проходим в обработчике по цепочке фреймов, находим тот, который был при вызове CreateProcessInternalW извлекаем указатель на параметры, заменяем флажки на CREATE_SUSPENDED, подменяем адрес возврата. Все операции выполняются со стеком. Это только пример, на который следует опираться, а не юзоть какойто гуан.) ![]() |
|
Создано: 08 марта 2009 14:14 · Личное сообщение · #11 Clerk пишет: Первое что приходит на ум это перехват захвата PEB. Подменяем в PEB поле FastPebLockRoutine на свой код. Далее при создании процесса юзоется цепочка: CreateProcessInternalW -> RtlDosPathNameToNtPathName_U -> RtlDosPathNameToNtPathName_Ustr -> RtlAcquirePebLock Нарыл про пеб, Interestingly, Microsoft have removed some of the interesting pointers from the PEB under Windows 2003, so many exploits that use these methods are not effective for Windows 2003 systems. Specifically, the pointers FastPEBLockRoutine() and FastPEBUnlockRoutine()at PEB offset 0x020 and 0x024 have been removed. те эти поля убрали или изменили офсет? Не подскажете где про это можно почитать подробнее? ![]() |
|
Создано: 08 марта 2009 15:17 · Личное сообщение · #12 |
|
Создано: 08 марта 2009 17:17 · Личное сообщение · #13 |
|
Создано: 08 марта 2009 20:15 · Поправил: Clerk · Личное сообщение · #14 |
|
Создано: 09 марта 2009 05:28 · Личное сообщение · #15 |
|
Создано: 13 мая 2009 15:38 · Личное сообщение · #16 www.rsdn.ru/article/baseserv/IntercetionAPI.xml "Второй способ внедрения исполняемого кода (через хуки) наиболее прост в использовании. Он основан на технологии хуков, а именно: если установить хук на поток чужого процесса, то, как только поток получит сообщение, соответствующее заданному типу хука, система автоматически подключит DLL c хуком к данному процессу. Недостатком данного способа в том, что нельзя внедрить DLL в процесс, не имеющий очереди сообщений. Данная DLL будет присоединена к чужому процессу лишь до тех пор, пока запущена программа, установившая хук. Как только вы завершите эту программу, dll автоматически будет отключена." так и делаю , и не выходит. вообщем, все эти перехватчики из статей левоваты... и вопрос остается открытым. 50Hz_220B_1200W, у тебя что нить получилось? поделись исходником.... а либу я посмотрел - сложно там ( ![]() |
|
Создано: 13 мая 2009 16:11 · Личное сообщение · #17 |
|
Создано: 17 мая 2009 22:32 · Личное сообщение · #18 |
|
Создано: 23 мая 2009 00:38 · Личное сообщение · #19 |
|
Создано: 23 мая 2009 03:49 · Личное сообщение · #20 |
|
Создано: 23 мая 2009 14:39 · Личное сообщение · #21 |
|
Создано: 23 мая 2009 15:42 · Личное сообщение · #22 |
|
Создано: 23 мая 2009 16:08 · Личное сообщение · #23 |
|
Создано: 23 мая 2009 16:44 · Личное сообщение · #24 |
|
Создано: 23 мая 2009 22:41 · Личное сообщение · #25 |
|
Создано: 24 мая 2009 01:03 · Личное сообщение · #26 |
|
Создано: 24 мая 2009 01:28 · Поправил: Модератор · Личное сообщение · #27 |
|
Создано: 24 мая 2009 02:41 · Личное сообщение · #28 |
|
Создано: 24 мая 2009 02:57 · Личное сообщение · #29 |
|
Создано: 24 мая 2009 08:57 · Личное сообщение · #30 Clerk пишет: Отлично, давно думал как это в юзермоде так с памятью поступить, чтобы процессор читал из памяти одно, а ядро другие данные оттуда получало , как в случае со сплайсингом. , как в случае со сплайсингом. Надеюсь вы обьясните это . SLV ответил на твой вопрос. или ты не смотрел даже как рку детектит хуки? ----- [nice coder and reverser] ![]() |
. 1 . 2 . >> |
![]() |
eXeL@B —› Программирование —› Перехват CreateProcessA |