Сейчас на форуме: _MBK_, asfa (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Перехват АПИ, проблемы...
Посл.ответ Сообщение

Ранг: 1.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 мая 2009 17:29
· Личное сообщение · #1

нарисовал я тут маленький перехватчик АПИ на основе того что выложен на wasm.ru в одноименной статье (AdvBox32)...
работает с оконными приложениями работает нормуль, но почему то не со всеми (
а консольные вообще не берет видимо из за того что в них нет не проходит SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, 0);

Вопрос как сделать его универсальным для любых аппликух?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 12 мая 2009 18:54
· Личное сообщение · #2

Дык где код то? Если писал через пень-колоду, не будет работать на не оконных. Если прямо писал, всё работает.



Ранг: 1.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 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.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 12 мая 2009 21:10
· Личное сообщение · #4

Во-первых, есть волшебная штука аттач, чтоб не цеплять эту простыню сюда.
Во-вторых, какая цель твоего кода? Это чисто код для аттача ко всем процессам через оконный хук. Понятное дело, что работать будет только для оконных процессов. Других способов инжекта есть пачки, погугли и выбери под свои нужды подходящий.



Ранг: 1.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 мая 2009 21:32
· Личное сообщение · #5

пардон за простыню )
у меня есть оконный процесс в котором это не пашет. почему?



Ранг: 1.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 мая 2009 21:41
· Личное сообщение · #6

пробовал другой способ ,через аппинит - резалт ноль, гуглил много ни одного полноценно работающего исходника... почему не работает не понимаю.

a1d7_12.05.2009_CRACKLAB.rU.tgz - hook_dll.cpp



Ранг: 16.9 (новичок)
Активность: 0.020
Статус: Участник

Создано: 13 мая 2009 13:24
· Личное сообщение · #7

http://www.exelab.ru/f/action=vthread&forum=6&topic=13949



Ранг: 1.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 13 мая 2009 20:00
· Личное сообщение · #8

вобщем тот который через аппинит пашет но только под оллей. иначе фиг. что сие значит?


 eXeL@B —› Вопросы новичков —› Перехват АПИ, проблемы...
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати