Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
перехват без модификации кода |

21.01.2010, 18:55
|
|
Статус пользователя:
Регистрация: 26.07.2005
Сообщений: 568
Провел на форуме: 1290766
Репутация:
1236
|
|
перехват без модификации кода
////// UPDATED & RECODED ///////
полезная и хитрая вещь, если довести до ума. но тут будет просто концепт. итак, сплайсы, экзепшн хуки - все они изменяют начало функции. но есть возможность перехвата без изменения оригинального кода. для этого мы используем отладочные регистры - dr0-3.
при попадании потока на указанный в отладочном регистре адрес, будет вызван обработчик исключений, перехваченный сплайсом KiUserExceptionDispatcher.
затем обработчик исключений перенаправит поток на наш трамплин и на сам перехватчик.
из минусов - не больше 4х перехватов на поток
итак, к0д winmain =)
полный дистрибутив тут (сам движок (извините без комментов пока - просто не успел) и необходимые наборы утилит в исходном коде)
http://www.rapidshare.ru/1343901
а это код вин маин)
Код:
#include <windows.h>
#include "hwhook.h"
#pragma optimize("gsy", on)
#pragma comment(linker, "/MERGE:.rdata=.data")
#pragma comment(linker,"/MERGE:.text=.data")
#pragma comment(linker,"/SECTION:.data,ERW")
#pragma comment(linker, "/BASE:0x77500000")
#pragma comment(linker, "/ENTRY:WinMain")
#pragma comment(lib, "ntdll.lib")
PHARDWARE_HOOK_ENTRY pdhhWinExec;
UINT WINAPI My_WinExec(LPSTR cmd, UINT show)
{
MessageBox(0,"This is a hook of WinExec =)",0,0);
//lstrcpy(cmd, "notepad.exe"); // call notepad instead of anything
return ((UINT(WINAPI*)(LPSTR,UINT))pdhhWinExec->trampoline)(cmd, show);
}
//////////////////////////////////////////////////////////////////////////
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// init hook
InitializeHardwareHook();
// hook it
pdhhWinExec = HardwareHookFunction(GetProcAddress(GetModuleHandle("kernel32.dll"), "WinExec"), My_WinExec, GetCurrentThreadId());
// test
WinExec("calc.exe", SW_SHOW);
HardwareUnhookFunction(pdhhWinExec);
MessageBox(0, "now unhooked...", 0, 0);
WinExec("calc.exe", SW_SHOW);
MessageBox(0, "yo =)", 0, 0);
return 0;
}
думаю тут вопросов не будет)
что я видоизменил, - да вообшем то все!
в аттаче на рапиде (выше) доделанная сборка, альфа ясен пень, держащая как хук так и анхук в удобоваримой форме, и без асма, которая держит функции с любым числом аргументов, также держит мультихук - когда одна и таже функция одновременно перехватывается несколькими обработчиками, расположенными в разных потоках.
не исключаю что там кривости есть, но не успел, очень торопился на собаку)
включенные утилиты (едины с проектом):
- дизассемблер длин
- двигло сплайса (трамплинный перехват)
- двигло инжекта тела в другой процесс по фиксированной базе
- утилита поиска памяти по паттерну с маской
- и тд
__________________
 
snow white world wide
Последний раз редактировалось sn0w; 22.01.2010 в 02:21..
|
|
|

21.01.2010, 23:10
|
|
Постоянный
Регистрация: 20.03.2009
Сообщений: 564
Провел на форуме: 991929
Репутация:
395
|
|
o_O не получается переварить ) ибо пока только научился инжектить dll в удаленный процесс... щас как раз втыкаю про перехваты.
ну вопрос собственно... я как понимаю это SEH ? потом устанавливать хук надо откуда из программы установщика или уже в теле процесса... (ну я думаю GetThreadContext наверно можно и удаленного получить)... и еще если процесс запускает треады новые в них будут работать эти исключения?
извини за тупые вопросы - я просто еще СОВСЕМ не разобрался с этим делом 
|
|
|

22.01.2010, 00:36
|
|
Reservists Of Antichat - Level 6
Регистрация: 04.02.2007
Сообщений: 1,152
Провел на форуме: 3008839
Репутация:
1502
|
|
всегда порывался так сделать, но меня всегда останавливали
1) "а вдруг" кто-то порешит запустить на <= win2000
2) "а вдруг" таки кто-то додумался наконец, что вех - удобная вещь
и со вздохом по старинке писался VirtualProtect
__________________
Bedankt euch dafür bei euch selbst.
H_2(S^3/((z1, z2)~(exp(2pi*i/p)z1, exp(2pi*q*i/p)z2)))=Z/pZ
|
|
|

22.01.2010, 02:15
|
|
Статус пользователя:
Регистрация: 26.07.2005
Сообщений: 568
Провел на форуме: 1290766
Репутация:
1236
|
|
Сообщение от Gar|k
o_O не получается переварить ) ибо пока только научился инжектить dll в удаленный процесс... щас как раз втыкаю про перехваты.
ну вопрос собственно... я как понимаю это SEH ? потом устанавливать хук надо откуда из программы установщика или уже в теле процесса... (ну я думаю GetThreadContext наверно можно и удаленного получить)... и еще если процесс запускает треады новые в них будут работать эти исключения?
извини за тупые вопросы - я просто еще СОВСЕМ не разобрался с этим делом 
1) нет, то что было до UPDATE - был VEH. на данный момент перехватывается обработчик всех исключений KiUserExceptionDispatcher из ntdll, который я сомневаюсь что проверяет большинство антималвара. но ранний вариант - добавление обработчика через AddVectoredException.. тоже имеет право на жизнь
2) пример:
HardwareHookFunction(GetProcAddress(GetModuleHandl e("kernel32.dll"), "WinExec"), My_WinExec, GetCurrentThreadId());
устанавливается на ид потока указанного в параметрах функции в пределах текущего процесса
__________________
 
snow white world wide
Последний раз редактировалось sn0w; 22.01.2010 в 02:28..
|
|
|

28.01.2010, 12:22
|
|
Статус пользователя:
Регистрация: 26.07.2005
Сообщений: 568
Провел на форуме: 1290766
Репутация:
1236
|
|
+ еще одна ВЕЩЬ...
Код:
/*
*
* многие протекторы проверяют отладочные регистры на предмет наличия аппаратных
* точек останова (hardware breakpoint).
* конечноже, в ассемблере есть инструкции работы с этими регистрами, такие как mov eax, dr0
* или mov dr0, eax и тд. но то что нам на руку - все они являются превилигированными
* и напрямую могут вызываться лишь в режиме ядра. в ином случае такой код будет
* вызывать программные исключения и при отсутствии обработчика - крах программы.
* поэтому все они используют функцию GetThreadContext() для получения информации
* о текущем состоянии регистров (и прочей информации) потока. используя один регистр,
* из 4х доступных для потока, под перехват и модификацию GetThreadContext(), как приведено в
* примере ниже, мы полностью исключим возможность обнаружения перехвата.
*/
PHARDWARE_HOOK_ENTRY phheGetThreadContext;
BOOL WINAPI xGetThreadContext(HANDLE h, LPCONTEXT ctx)
{
BOOL rc, dofake = FALSE;
if(ctx->ContextFlags & CONTEXT_DEBUG_REGISTERS){
dofake = TRUE;
dprintf("*** debug test detected ***");
}
rc = ((BOOL(WINAPI*)(HANDLE, LPCONTEXT))phheGetThreadContext->trampoline)(h, ctx);
if(dofake){
ctx->Dr0 = 0;
ctx->Dr1 = 0;
ctx->Dr2 = 0;
ctx->Dr3 = 0;
ctx->Dr7 = 0;
}
return rc;
}
__________________
 
snow white world wide
|
|
|

28.01.2010, 15:16
|
|
Reservists Of Antichat - Level 6
Регистрация: 04.02.2007
Сообщений: 1,152
Провел на форуме: 3008839
Репутация:
1502
|
|
Не вызывает обработчик исключений GetThreadContext(). И даже ZwGetContextThread(). Так что "все они используют функцию GetThreadContext()" - не-а 
__________________
Bedankt euch dafür bei euch selbst.
H_2(S^3/((z1, z2)~(exp(2pi*i/p)z1, exp(2pi*q*i/p)z2)))=Z/pZ
|
|
|

29.01.2010, 19:56
|
|
Статус пользователя:
Регистрация: 26.07.2005
Сообщений: 568
Провел на форуме: 1290766
Репутация:
1236
|
|
Сообщение от desTiny
Не вызывает обработчик исключений GetThreadContext().
хаха понял что ты имеешь ввиду, но написано о том что все они используют... - о протекторах
хотя конечно не все, тк
если о самом обработчике, то да, в нем также есть доступ к ContextRecord-> DrX и тд.
и вот например таким кодом можно его задетектить
Код:
//////////////////////////////////////////////////////////////////////////
LONG WINAPI GblGbl(EXCEPTION_POINTERS* pExceptionInfo)
{
if(pExceptionInfo->ExceptionRecord->ExceptionCode!=EXCEPTION_INT_DIVIDE_BY_ZERO)
return EXCEPTION_CONTINUE_SEARCH;
if(pExceptionInfo->ContextRecord->Dr0){
MessageBoxA(0,"HOOK DETECTED",0,0);
return EXCEPTION_CONTINUE_EXECUTION;
}
return EXCEPTION_CONTINUE_SEARCH;
}
PHARDWARE_HOOK_ENTRY pwe;
UINT WINAPI xWinExec(LPSTR lp, UINT n)
{
MessageBoxA(0,"hook of winexec", 0,0);
return ((UINT(WINAPI*)(LPSTR,UINT))pwe->trampoline)(lp,n);
}
//////////////////////////////////////////////////////////////////////////
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
AddVectoredExceptionHandler(0x31338,GblGbl);
InitializeHardwareHook();
pwe = HardwareHookFunction(WinExec, xWinExec, GetCurrentThreadId(), 0);
int a =1, b=1;
b--;
a = a/b;
WinExec("cmd", 0);
return a;
}
получим messagebox(hook detected)
__________________
 
snow white world wide
Последний раз редактировалось sn0w; 29.01.2010 в 20:55..
|
|
|

29.01.2010, 22:40
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
Кстати, такая защита от антиотладки неподходит )
Дело в том, что я могу специально задания значения к примеру Dr7
Затем заново запросить контекст и сново проверить значение регистров.
Также нужно желательно запоминать както. И фильтровать собственные установки и те которые поставили в проге.
P.S. лучше юзай GhbGhb вместо GblGbl 
Последний раз редактировалось slesh; 29.01.2010 в 22:43..
|
|
|

30.01.2010, 00:08
|
|
Reservists Of Antichat - Level 6
Регистрация: 04.02.2007
Сообщений: 1,152
Провел на форуме: 3008839
Репутация:
1502
|
|
Сообщение от sn0w
хаха понял что ты имеешь ввиду, но написано о том что все они используют... - о протекторах
хотя конечно не все, тк
если о самом обработчике, то да, в нем также есть доступ к ContextRecord-> DrX и тд.
и вот например таким кодом можно его задетектить
Вот нет бы посмотреть откуда эта инфа берётся у обработчика и надуть всех - так надо вех впихнуть. Ну да, вех он и есть вех 
__________________
Bedankt euch dafür bei euch selbst.
H_2(S^3/((z1, z2)~(exp(2pi*i/p)z1, exp(2pi*q*i/p)z2)))=Z/pZ
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|