CRACKL@B Оригинальный DVD-ROM крэкера: CRACKL@B DVD !
Домой | Статьи | RAR-cтатьи | Форум | Программирование | Скачать | DVD-ROM
Новичку | FAQ | Ссылки | Интервью | Архив | Новости | Связь


Русский / Russian English / Английский

Сейчас на форуме: vovanchik-77, SVLab (+6 невидимых пользователей)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

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

Ранг: 12.3 (новичок)
Статус: Участник

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

Ранг: 104.9 (ветеран)
Статус: Участник

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

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

Ранг: 26.2 (посетитель)
Статус: Участник

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

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

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

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

Ранг: 387.6 (мудрец)
Статус: Участник

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

Clerk, может продемонстрируете ваш способ, если уж сплайсинг умер?
<< . 1 . 2 .
 CRACKL@B —› Программирование —› Перехват CreateProcessA
    Для печати 


Оригинальный DVD-ROM крэкера: CRACKL@B DVD !


Вы находитесь на форуме сайта CRACKLAB.RU
Проект ReactOS