Сейчас на форуме: tyns777, zds, JustLife, 2nd, morgot (+5 невидимых)

 eXeL@B —› Программирование —› Перехват CreateProcessA
<< . 1 . 2 .
Посл.ответ Сообщение

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

Создано: 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'));



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

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

Hellspawn
Что уж там, int3 поставить.. В любом случае модификация кода будет обнаружена и снята. Что и говорить про руткиты. Я на самом дне в ядре выполняю захваты, ибо даже секции данных менять палевно. А тут всё так просто




Ранг: 127.3 (ветеран), 44thx
Активность: 0.090
Статус: Участник

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

50Hz_220B_1200W пишет:
поделись плз исходником

wasm.ru/pub/21/files/advapihook.rar вот либа и примеры использования там есть, всё просто.
Clerk пишет:
рку хотябы запусти и помотри.

а если мне не нужно не откого скрываца?
ядро это конечно круто), но без надобности то чо я туда полезу.сплайсинг дёшево и сердито).
и не надо говорить что Не работает и Сплайсинг мёртв.

-----
zzz




Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

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

Clerk, может продемонстрируете ваш способ, если уж сплайсинг умер?


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


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