![]() |
eXeL@B —› Вопросы новичков —› Перехват АПИ, проблемы... |
Посл.ответ | Сообщение |
|
Создано: 12 мая 2009 17:29 · Личное сообщение · #1 нарисовал я тут маленький перехватчик АПИ на основе того что выложен на wasm.ru в одноименной статье (AdvBox32)... работает с оконными приложениями работает нормуль, но почему то не со всеми ( а консольные вообще не берет видимо из за того что в них нет не проходит SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, 0); Вопрос как сделать его универсальным для любых аппликух? ![]() |
|
Создано: 12 мая 2009 18:54 · Личное сообщение · #2 |
|
Создано: 12 мая 2009 20:55 · Личное сообщение · #3 library AdvBox32; uses Windows; type OldCode = packed record One: dword; two: word; end; far_jmp = packed record PuhsOp: byte; PushArg: pointer; RetOp: byte; end; var JmpMbw, JmpMba: far_jmp; OldMbw, OldMba: OldCode; MbwAdr, MbaAdr: pointer; function trueGetVolumeInformation(lpRootPathName: PChar; lpVolumeNameBuffer: PChar; nVolumeNameSize: DWORD; lpVolumeSerialNumber: PDWORD; var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: PChar; nFileSystemNameSize: DWORD): integer; stdcall; var Written: dword; b:boolean; begin WriteProcessMemory(INVALID_HANDLE_VALUE, MbaAdr, @OldMba, SizeOf(OldCode), Written); b := GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize); result := 1; WriteProcessMemory(INVALID_HANDLE_VALUE, MbaAdr, @JmpMba, SizeOf(far_jmp), Written); end; ////////////////////////////////////////////// function myGetVolumeInformation(lpRootPathName: PChar; lpVolumeNameBuffer: PChar; nVolumeNameSize: DWORD; lpVolumeSerialNumber: PDWORD; var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: PChar; nFileSystemNameSize: DWORD): integer; stdcall; var sn, tmp: dword; begin asm //int 3; mov eax, dword ptr [ebp+14h] mov tmp,eax; end; Result := trueGetVolumeInformation(lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize); //nVolumeNameSize := sn; asm push eax mov eax,tmp mov [eax],$FFFFFFFF pop eax end; end; Procedure SetHook(); var hUser32: dword; Bytes: dword; begin hUser32 := GetModuleHandle('kernel32.dll'); MbwAdr := GetProcAddress(hUser32, 'GetVolumeInformationW'); MbaAdr := GetProcAddress(hUser32, 'GetVolumeInformationA'); ReadProcessMemory(INVALID_HANDLE_VALUE, MbwAdr, @OldMbw, SizeOf(OldCode), Bytes); ReadProcessMemory(INVALID_HANDLE_VALUE, MbaAdr, @OldMba, SizeOf(OldCode), Bytes); // JmpMbw.PuhsOp := $68; JmpMbw.PushArg := @NewMessageBoxExW; JmpMbw.RetOp := $C3; JmpMba.PuhsOp := $68; JmpMba.PushArg := @myGetVolumeInformation; JmpMba.RetOp := $C3; //WriteProcessMemory(INVALID_HANDLE_VALUE, MbwAdr, @JmpMbw, SizeOf(far_jmp), Bytes); WriteProcessMemory(INVALID_HANDLE_VALUE, MbaAdr, @JmpMba, SizeOf(far_jmp), Bytes); end; Procedure Unhook(); var Bytes: dword; begin WriteProcessMemory(INVALID_HANDLE_VALUE, MbaAdr, @OldMba, SizeOf(OldCode), Bytes); //WriteProcessMemory(INVALID_HANDLE_VALUE, MbwAdr, @OldMbw, SizeOf(OldCode), Bytes); end; Function MessageProc(code : integer; wParam : word; lParam : longint) : longint; stdcall; begin CallNextHookEx(0, Code, wParam, lparam); Result := 0; end; Procedure SetGlobalHookProc(); begin SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, 0); Sleep(INFINITE); end; // Procedure SetGlobalHook(); var hMutex: dword; TrId: dword; begin hMutex := CreateMutex(nil, false, 'AdvareHook'); if GetLastError = 0 then CreateThread(nil, 0, @SetGlobalHookProc, nil, 0, TrId) else CloseHandle(hMutex); end; procedure DLLEntryPoint(dwReason: DWord); begin case dwReason of DLL_PROCESS_ATTACH: begin SetGlobalHook(); SetHook() end; DLL_PROCESS_DETACH: UnHook(); end; end; begin DllProc := @DLLEntryPoint; DLLEntryPoint(DLL_PROCESS_ATTACH); end. ![]() |
|
Создано: 12 мая 2009 21:10 · Личное сообщение · #4 Во-первых, есть волшебная штука аттач, чтоб не цеплять эту простыню сюда. Во-вторых, какая цель твоего кода? Это чисто код для аттача ко всем процессам через оконный хук. Понятное дело, что работать будет только для оконных процессов. Других способов инжекта есть пачки, погугли и выбери под свои нужды подходящий. ![]() |
|
Создано: 12 мая 2009 21:32 · Личное сообщение · #5 |
|
Создано: 12 мая 2009 21:41 · Личное сообщение · #6 пробовал другой способ ,через аппинит - резалт ноль, гуглил много ни одного полноценно работающего исходника... почему не работает не понимаю. ![]() ![]() |
|
Создано: 13 мая 2009 13:24 · Личное сообщение · #7 |
|
Создано: 13 мая 2009 20:00 · Личное сообщение · #8 |
![]() |
eXeL@B —› Вопросы новичков —› Перехват АПИ, проблемы... |