Сейчас на форуме: 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'));




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 07 марта 2009 17:25 · Поправил: coderess
· Личное сообщение · #2

Это код из статьи про перехват API, читай статью
http://wasm.ru/article.php?article=apihook_1 http://wasm.ru/article.php?article=apihook_1

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




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

Создано: 07 марта 2009 17:37
· Личное сообщение · #3

Мда, отлавливать ошибки при загрузки либы путем перезагрузки оси не самый лучший вариант, ошибку то я найду, только времени уйму потеряю, поэт и попросил помощи.




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 07 марта 2009 17:44
· Личное сообщение · #4

Отладчик сайс или сусер ставишь

www.rsdn.ru/article/baseserv/IntercetionAPI.xml

Отладка кода загрузчика

Итак, есть 2 процесса:
Процесс, который внедряет код. Обозначим его П1.
Процесс, в который внедряют код. Обозначим его П2.

Задача заключается в том, чтобы поставить точку останова в П2 перед выполнением внедренного кода. Изначально неизвестно, по какому адресу будет внедрен код в П2. При этом предполагается, что П2 уже загружен и висит где-то в памяти. Для простоты запускаем П1 в каком-либо встроенном отладчике и трассируем, для того, чтобы узнать по какому адресу в П2 будет выделена память. Узнав этот адрес, включаем SoftIce (ctrl+d). Подключаемся к П2 (addr П2-name), при этом SoftIce установит контекст адресов, соответствующий процессу П2. Устанавливаем точку останова по узнанному адресу (bpx address). Закрываем SoftIce(ctrl+d). Выполняем П1. При этом он создает поток в П2. Когда этот поток начинает исполняться, на первой инструкции внедренного кода выскакивает окно SoftIce.


-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




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

Создано: 07 марта 2009 18:00
· Личное сообщение · #5

Олька не подойдет вместо айса?

и по-моему надо бы мне еще дебуг привелегию включить



Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 07 марта 2009 18:18
· Личное сообщение · #6

Поставь себе Windows на виртуалку и перегружай сколько влезет.



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

Создано: 08 марта 2009 07:14
· Личное сообщение · #7

отвечаю сам на свой вопрос по поводу айса:

удобно применить системный отладчик SoftIce, который грузится раньше операционной системы, работает в нулевом кольце и поэтому имеет доступ к любым объектам ОС.



Ранг: 309.8 (мудрец), 21thx
Активность: 0.170
Статус: Участник

Создано: 08 марта 2009 08:11
· Личное сообщение · #8

StopThreads убери и посмотри что будет

-----
Shalom ebanats!




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

Создано: 08 марта 2009 10:38
· Личное сообщение · #9

норм работает, только CreateProcessA не ловит(



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

Создано: 08 марта 2009 11:20 · Поправил: Clerk
· Личное сообщение · #10

Нынче так ничего не делается. В идеале следует перехватывать сервисы, но это там может понадобится жёсткий перехват. Нормально следует установить диспетчер исключений и ловить исключения.
Есть такая техника, именуется развёрткой(парсингом) стека. Первое что приходит на ум это перехват захвата PEB. Подменяем в PEB поле FastPebLockRoutine на свой код. Далее при создании процесса юзоется цепочка:
CreateProcessInternalW -> RtlDosPathNameToNtPathName_U -> RtlDosPathNameToNtPathName_Ustr -> RtlAcquirePebLock
Проходим в обработчике по цепочке фреймов, находим тот, который был при вызове CreateProcessInternalW извлекаем указатель на параметры, заменяем флажки на CREATE_SUSPENDED, подменяем адрес возврата. Все операции выполняются со стеком. Это только пример, на который следует опираться, а не юзоть какойто гуан.)



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

Создано: 08 марта 2009 14:14
· Личное сообщение · #11

Clerk пишет:
Первое что приходит на ум это перехват захвата PEB. Подменяем в PEB поле FastPebLockRoutine на свой код. Далее при создании процесса юзоется цепочка:
CreateProcessInternalW -> RtlDosPathNameToNtPathName_U -> RtlDosPathNameToNtPathName_Ustr -> RtlAcquirePebLock


Нарыл про пеб,
Interestingly, Microsoft have removed some of the interesting pointers from the PEB under Windows 2003, so many exploits that use these methods are not effective for Windows 2003 systems. Specifically, the pointers FastPEBLockRoutine() and FastPEBUnlockRoutine()at PEB offset 0x020 and 0x024 have been removed.

те эти поля убрали или изменили офсет? Не подскажете где про это можно почитать подробнее?



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

Создано: 08 марта 2009 15:17
· Личное сообщение · #12

Blackdealer
В старших версиях убрали(в XP осталось). Это всеголишь пример; вариантов множество, например грузится advapi, можно загрузку отхучить, можно __security_check_cookie заюзоть, способов куча.
> Помогите плз мне найти ошибки
Тот код ошибка сам по себе, не используй его.



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

Создано: 08 марта 2009 17:17
· Личное сообщение · #13

Clerk пишет:
Тот код ошибка сам по себе, не используй его.


немножко погуглив, начинаю понимать.
В User моде работаю норм, а вот этот код пока новинка, надо на чем нибудь учиться. даже на ошибках.



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

Создано: 08 марта 2009 20:15 · Поправил: Clerk
· Личное сообщение · #14

> В User моде работаю норм, а вот этот код пока новинка
И что там нового, дрочево на паскале (C).
Кстати для тебя специально переконпилил старую свою либу, база бля перехватов, вроде нормально скомпилил хз там файлов сотни.. openfile.ru/224309/



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

Создано: 09 марта 2009 05:28
· Личное сообщение · #15

Clerk
спасиб за либу, внимательно просматриваю ее



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

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

www.rsdn.ru/article/baseserv/IntercetionAPI.xml

"Второй способ внедрения исполняемого кода (через хуки) наиболее прост в использовании. Он основан на технологии хуков, а именно: если установить хук на поток чужого процесса, то, как только поток получит сообщение, соответствующее заданному типу хука, система автоматически подключит DLL c хуком к данному процессу. Недостатком данного способа в том, что нельзя внедрить DLL в процесс, не имеющий очереди сообщений. Данная DLL будет присоединена к чужому процессу лишь до тех пор, пока запущена программа, установившая хук. Как только вы завершите эту программу, dll автоматически будет отключена."

так и делаю , и не выходит. вообщем, все эти перехватчики из статей левоваты... и вопрос остается открытым.

50Hz_220B_1200W, у тебя что нить получилось? поделись исходником.... а либу я посмотрел - сложно там (




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

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

и вторую статью посмотри wasm.ru/article.php?article=apihook_2 там внизу библиотека Advanced Api Hook работает на ура.

-----
zzz




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

Создано: 17 мая 2009 22:32
· Личное сообщение · #18

zeppe1in
Не работает, некрофелия вместе с автором. Сплайсинг мёртв.




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 23 мая 2009 00:38
· Личное сообщение · #19

хм... могу поделиться своим способом перехвата... либой... проект на VC++ 2008. метод обхода обычный прыжок, только дальше отличия...



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

Создано: 23 мая 2009 03:49
· Личное сообщение · #20

multiarc пишет:
хм... могу поделиться своим способом перехвата... либой... проект на VC++ 2008. метод обхода обычный прыжок, только дальше отличия...


залей плз, попробую на дельфи переделать




Ранг: 58.1 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 23 мая 2009 14:39
· Личное сообщение · #21

multiarc.at.tut.by/winsta.7z
местами куски недописанные, прошу сильно не пинать) но перехват и некоторые фичи дописаны до конца




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

Создано: 23 мая 2009 15:42
· Личное сообщение · #22

Clerk у меня всё работает. и что не так со сплайсингом? я сделал то что мне было нужно и всё хорошо.

-----
zzz




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

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

zeppe1in пишет:
я сделал то что мне было нужно и всё хорошо.


поделись плз исходником



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

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

zeppe1in
рку хотябы запусти и помотри.




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 23 мая 2009 22:41
· Личное сообщение · #25

Clerk пишет:
рку хотябы запусти и помотри.


рку, который в паблике говно, можно сплайсануть так что он даже ухом не поведёт)

-----
[nice coder and reverser]




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

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

Hellspawn
Я только пример привёл, но даже он ваш сплайс накроет. Да вобще никакая тулза не нужна. Мапим модуль и сравниваем секции кода. И лесом идёт ваш сплайс.




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 24 мая 2009 01:28 · Поправил: Модератор
· Личное сообщение · #27

я говорил конкретно про рку, что ты перескакиваешь то. можно хукнуть так, что он не увидет. а то что можно что-то там накодить это и так ясно. и вообще оффтоп это.

-----
[nice coder and reverser]




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

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

Hellspawn
Ну вы даёте.. Что офтоп ?
> можно хукнуть так, что он не увидет
Отлично, давно думал как это в юзермоде так с памятью поступить, чтобы процессор читал из памяти одно, а ядро другие данные оттуда получало , как в случае со сплайсингом.
Надеюсь вы обьясните это .



Ранг: 309.8 (мудрец), 21thx
Активность: 0.170
Статус: Участник

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

например вставить вместо простого джампа на переходник в начало функции что-то более оригинальное, это сбивает с толку рку/авз.

-----
Shalom ebanats!





Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

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

Clerk пишет:
Отлично, давно думал как это в юзермоде так с памятью поступить, чтобы процессор читал из памяти одно, а ядро другие данные оттуда получало , как в случае со сплайсингом.
, как в случае со сплайсингом.
Надеюсь вы обьясните это .


SLV ответил на твой вопрос. или ты не смотрел даже как рку детектит хуки?

-----
[nice coder and reverser]



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


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