Сейчас на форуме: UniSoft, laslo, bartolomeo (+5 невидимых)

 eXeL@B —› Программирование —› Сплайсинг RtlCreateUserThread
Посл.ответ Сообщение

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

Создано: 11 октября 2011 20:39 · Поправил: Yotsi
· Личное сообщение · #1

Нагуглил пример для ZwQuerySystemInformation.Опробовал его на MessageBox ,сработало ОК. Попробывал для RtlCreateUserThread,и ничего Возможно я наплутал с соглашением о вызове.Но тогда ведь ф-ция заглушка должна была ,хоть и с крашем процесса , всеравно вызываться.Но она вообще не вызываеться.

DWORD funcadr=0;
UCHAR oldadr[5];

bool SetSplicingHook(void* pfnDst, void* pfnHook, UCHAR buffer[5])
{
if(IsBadWritePtr(buffer, 5) || IsBadReadPtr(pfnDst, 5)) return false;
memcpy(buffer, pfnDst, 5);
DWORD old = 0;
if(!VirtualProtect(pfnDst, 5, PAGE_READWRITE, &old)) return false;
DWORD offset = (DWORD) pfnHook - (DWORD) pfnDst - 5;
*(BYTE*)pfnDst = 0xE9;
*(DWORD*)((DWORD)pfnDst+1) = offset;
if(!VirtualProtect(pfnDst, 5, old, &old)) return false;
return true;
}
void UnsetSplicingHook(void* pfnDst, UCHAR buffer[5])
{
DWORD old = 0;
if(!VirtualProtect(pfnDst, 5, PAGE_READWRITE, &old)) return;
memcpy(pfnDst, buffer, 5);
if(!VirtualProtect(pfnDst, 5, old, &old)) return;
}
typedef NTSTATUS (NTAPI *_RtlCreateUserThread)
(IN HANDLE ProcessHandle,
IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
IN BOOLEAN CreateSuspended,
IN ULONG StackZeroBits,
IN OUT PULONG StackReserved,
IN OUT PULONG StackCommit,
IN PVOID StartAddress,
IN PVOID StartParameter OPTIONAL,
OUT PHANDLE ThreadHandle,
OUT PCLIENT_ID ClientID);

NTSTATUS NTAPI hook(HANDLE ProcessHandle,PSECURITY_DESCRIPTOR SecurityDescriptor,BOOLEAN CreateSuspended,ULONG StackZeroBits,PULONG StackReserved,PULONG StackCommit,PVOID StartAddress,PVOID StartParameter,PHANDLE ThreadHandle,PCLIENT_ID ClientID)
{
NTSTATUS stat;
MessageBoxA(0,"Thread intercept\n","",MB_OK);
UnsetSplicingHook((void*)funcadr,oldadr);
_RtlCreateUserThread rt=(_RtlCreateUserThread)funcadr;
stat=rt(ProcessHandle,SecurityDescriptor,CreateSuspended,StackZeroBits,StackReserved,StackCommit,StartAddress,StartParameter,ThreadHandle,ClientID);
SetSplicingHook((void*)funcadr,hook,oldadr);
return(stat);
}

DWORD WINAPI Thread(LPVOID lParam)
{
MessageBoxA(0,"Thread!","",MB_OK);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
funcadr=(DWORD)GetProcAddress(LoadLibraryA("ntdll.dll"),"RtlCreateUserThread");
printf("%X\n",funcadr);
printf("%d\n",SetSplicingHook((void*)funcadr,hook,oldadr));
CreateThread(0,0,Thread,0,0,0);
getch();
return 0;
}




Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 11 октября 2011 20:52
· Личное сообщение · #2

Разбить __security_cookie и хэндлим __report_gsfailure(). Для младших версий системы можно базу екзе покоцать в пеб и захэндлить валидацию хидера, после чего S-маршрутизация. В старших версиях это не робит(W7), там NtCreateThreadEx юзается. Лучший способ это отложенная передача управления, тоесть хачим код, который вашу RtlCreateUserThread() дёргает.

А патч - это порча целостности модулей, типо как инфект тока в памяти. Это зло, так как имеется оригинал на диске.



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

Создано: 11 октября 2011 20:56
· Личное сообщение · #3

bowrouco пишет:
А патч - это порча целостности модулей, типо как инфект тока в памяти. Это зло, так как имеется оригинал на диске.

А если мне имеено таким методом и надо?



Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 11 октября 2011 21:16
· Личное сообщение · #4

Yotsi
Ну я бы понял, если бы это было на диске. Типо какойто простейший файловый патч. Но в памяти это нельзя делать.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 11 октября 2011 21:32
· Личное сообщение · #5

Что вы человеку голову заморочили? Хучится всё, но проблема в том, что CreateThread не вывзвает RtlCreateUserThread в своей работе, поэтому мессадж и не выскакивает. Это, кстати, можно за секунду проверить в дизассемблере.

-----
Stuck to the plan, always think that we would stand up, never ran.




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

Создано: 11 октября 2011 21:52
· Личное сообщение · #6

ARCHANGEL пишет:
Что вы человеку голову заморочили? Хучится всё, но проблема в том, что CreateThread не вывзвает RtlCreateUserThread в своей работе, поэтому мессадж и не выскакивает. Это, кстати, можно за секунду проверить в дизассемблере.

А я то думал что все эти CreateThreadEx,CreateThread,beginthread,beginthreadex и иже с ними стучаться для создания потока в одно и то же место в ntdll Значит есть несколько путей создания потоков в юзермоде? Через какое же место в ntdll можно гарантированно перехватить создание потока в юзермоде ?



Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 11 октября 2011 21:58
· Личное сообщение · #7

ARCHANGEL
Я не смотрел код, только щас увидел там CreateThread(). Они поэтому ничего кроме патча не могут - так как не смотрят реализацию апи.



Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 12 октября 2011 20:38
· Личное сообщение · #8

Yotsi

NtCreateThread например, NtCreateThreadEx в поздних версиях (Windows 7).

bowrouco

Мало того что бред понапейсал, так еще и не в тему. Тебе какая разница что и как он делает? Он задал конкретный вопрос, подразумевающий конкретный же ответ.



Ранг: 47.7 (посетитель), 17thx
Активность: 0.090
Статус: Участник

Создано: 12 октября 2011 21:06 · Поправил: bowrouco
· Личное сообщение · #9

Alchemistry
Ну если бы мне было не всёравно, то я бы обьяснил как код патчить. Как по мне, так этому даже учить не стоит, так как это вредоносно. И почему не в тему ?
Какраз таки в тему. Хороший годный и краткий ответ дал. Вы не можите его осознать ? - так учите матчасть!




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 12 октября 2011 21:19
· Личное сообщение · #10

bowrouco твои ответы можешь понять только ты
тогда может не стоит отвечать?

| Сообщение посчитали полезным: yagello, PE_Kill

Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 12 октября 2011 21:21
· Личное сообщение · #11

bowrouco

Что вредоносного в перехвате? Патчи твои нелюбимые есть даже у мс, называются Detours, иди учи матчасть сам. Впрочем тебе бесполезно что-то доказывать или объяснять Заканчиваем оффтоп - двигай тему в личку если тебе нечем заняться.



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

Создано: 12 октября 2011 21:54 · Поправил: Yotsi
· Личное сообщение · #12

Alchemistry пишет:
NtCreateThread например, NtCreateThreadEx в поздних версиях (Windows 7).

В нтдлл моей семерки нету экспорта NtCreateThreadEx =/



Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 12 октября 2011 22:05
· Личное сообщение · #13

Yotsi

Как определили этот невероятный факт?



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

Создано: 12 октября 2011 22:10 · Поправил: Yotsi
· Личное сообщение · #14

Alchemistry пишет:
Как определили этот невероятный факт


Проблема оказалась в пробеле

ЗЫ:а не уверсальней ли перехватывать ZwResumeThread ?
ЗЫЫ: чем ZwResumeThread так круто что на его адрессе VirtualProtect при параметре PAGE_READWRITE валиться с Access violation ?А с PAGE_EXECUTE_READWRITE все ОК??



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

Создано: 16 октября 2011 15:11
· Личное сообщение · #15

Alchemistry
Инде киляет любой софт, портящий модуля в памяти(дескрипторные таблицы тамже и IAT тоже). Так как такой софт вредоносный. Для этого патчгурд изобрели. А детор как и верификатор и эта ваша апи NtResumeThread это отладочный функционал.

> чем ZwResumeThread так круто что на его адрессе VirtualProtect при параметре PAGE_READWRITE валиться с Access violation ?А с PAGE_EXECUTE_READWRITE все ОК??
Кривые параметры передаёте, прототип смотрите.


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


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