|
Создано: 7 марта 2009 17:14:27 Личное сообщение #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'));
|