![]() |
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')); ![]() |
|
Создано: 24 мая 2009 11:09 · Личное сообщение · #2 |
|
Создано: 24 мая 2009 14:16 · Личное сообщение · #3 50Hz_220B_1200W пишет: поделись плз исходником wasm.ru/pub/21/files/advapihook.rar вот либа и примеры использования там есть, всё просто. Clerk пишет: рку хотябы запусти и помотри. а если мне не нужно не откого скрываца? ядро это конечно круто), но без надобности то чо я туда полезу.сплайсинг дёшево и сердито). и не надо говорить что Не работает и Сплайсинг мёртв. ----- zzz ![]() |
|
Создано: 24 мая 2009 15:06 · Личное сообщение · #4 |
<< . 1 . 2 . |
![]() |
eXeL@B —› Программирование —› Перехват CreateProcessA |