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

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

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

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

Есть ли какие то методы или техники,перехвата функций? Универсальные как сплайсинг.Но ПОТОКОБЕЗОПАСНЫЕ.




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

Создано: 07 декабря 2011 21:46 · Поправил: zeppe1in
· Личное сообщение · #2

Yotsi
всё зависит от ваших задач и условий, я сплайсил, и всё было ПОТОКОБЕЗОПАСНО)

-----
zzz




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

Создано: 07 декабря 2011 21:59 · Поправил: Veliant
· Личное сообщение · #3

Использовать например InterlockedExchange при патче или lock rep movsb



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

Создано: 07 декабря 2011 22:00
· Личное сообщение · #4

У меня спецефическая задача - нада перехватывать начало создания потока ,и его завершение до деинициализации лоадером.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

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

Veliant пишет:
lock rep movsb

Protected Mode Exceptions: ... #UD If the LOCK prefix is used.
З.Ы. InterlockedExchange64 есть ещё, 8 байтов должно хватить.



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

Создано: 08 декабря 2011 00:16 · Поправил: Yotsi
· Личное сообщение · #6

Archer пишет:
З.Ы. InterlockedExchange64 есть ещё, 8 байтов должно хватить.

А так что б еще и на win2k работало возможно?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

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

А чем винда то смущает, если оно при возможности на интринзиках делается. Я не проверял, но полагаю, что на CMPXCHG8B.



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

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

Что то я непонимаю ,каким образом CMPXCHG8B может помочь в таком случае
Code:
  1. void HookFunc(DWORD data)
  2. {
  3. RestoreOrigFuncAdr();//A
  4. RunOriginalFunc(data);
  5. WriteHook();//B
  6. }

Когда любой поток в момент выполнения кода между А и Б.Может вызвать оригинальную функцию.



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

Создано: 10 декабря 2011 22:37 · Поправил: Veliant
· Личное сообщение · #9

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



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

Создано: 10 декабря 2011 23:26
· Личное сообщение · #10

А как тогда оригинальную ф-цию вызывать,если первые 5 байт "пропатчены"?




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 10 декабря 2011 23:30 · Поправил: OKOB
· Личное сообщение · #11

Yotsi пишет:
А как тогда оригинальную ф-цию вызывать,если первые 5 байт "пропатчены"?


у себя в теле хука краденые байты исполнять и передовать управление на остальное тело функции. Только не 5, а от пяти кратно длине команды.

-----
127.0.0.1, sweet 127.0.0.1




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

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

Что то я опять до конца непонимаю Нада из оригинальных 5 байт сформировать "шеллкод" с джампом на телом функции,которое находиться после той 5 байтной заглушки?



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

Создано: 11 декабря 2011 10:01 · Поправил: Veliant
· Личное сообщение · #13

Копируешь 5 байт из оригинального кода. Если последние байты попадают на середину команды, то копируешь еще несколько, чтоб было выровнено на команду. Для этого обычно используется дизассемблер длин. После них у себя в буфере генерируешь jmp в оригинальный код. Вот собственно и все




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 11 декабря 2011 10:03
· Личное сообщение · #14

Почитал бы статьи лучше, как хук делается, а?
Было:
1 байт: push ebp
2 байта: mov ebp,esp
другие_команды_на_Н_байтов
func_next:
...
Стало:
5 байтов: jmp/call allocked_mem
возможно_пара_байтов_от_старых_инструкций
func_next:
...
allocked_mem (сначала все затёртые инструкции, потом переход обратно):
1 байт: push ebp
2 байта: mov ebp,esp
другие_команды_которые_затёрты_5_байтами_перехода
jmp func_next



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

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

Все что мне удавалось найти было с восстановлением тех 5 байт



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

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

То ли у меня адрес посчитать не получаеться,то ли еще что то
Code:
  1. BYTE *shellJump;
  2. typedef void(NTAPI *LdrShutdownThread)();
  3. void NTAPI HOOK_LdrShutdownThread()
  4. {
  5.          printf("HOOK\n");
  6.          LdrShutdownThread LdrShutdownThreadSh=(LdrShutdownThread)shellJump;
  7.          LdrShutdownThreadSh();
  8. }
  9. void SetHook(DWORD OrigAdr,DWORD HookAdr)
  10. {
  11.          DWORD old = 0;
  12.          void *Orig=(void*)OrigAdr;
  13.          void *Hook=(void*)HookAdr;
  14.          VirtualProtect(Orig, 5,PAGE_EXECUTE_READWRITE, &old);
  15.          DWORD offset = (DWORD) Hook - (DWORD) Orig - 5;
  16.          *(BYTE*)Orig = 0xE9;
  17.          *(DWORD*)((DWORD)Orig+1) = offset;
  18.          VirtualProtect(Orig, 5, old, &old);
  19. }
  20. DWORD WINAPI ThrFunc(LPVOID lParam)
  21. {
  22.          printf("thr func\n");
  23.          return 0;
  24. }
  25. int _tmain(int argc, _TCHAR* argv[])
  26. {
  27.          HMODULE ntdll=LoadLibrary(L"ntdll.dll");
  28.          DWORD adr=(DWORD)GetProcAddress(ntdll,"LdrShutdownThread");
  29.          int InsLen=MDAL_GetOpcodesLenByNeedLen((BYTE*)adr,5);
  30.          if(InsLen!=0)
  31.          {
  32.                  shellJump=(BYTE*)VirtualAlloc(0,1024*4,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
  33.                  memcpy(shellJump,(void*)adr,InsLen);
  34.                  DWORD offset = adr - (DWORD)shellJump - InsLen ;
  35.                  shellJump[InsLen]=0xE9;
  36.                  shellJump+=InsLen+1;
  37.                  memcpy(shellJump,&offset,4);
  38.                  shellJump-=InsLen+1;
  39.                  SetHook(adr,(DWORD)&HOOK_LdrShutdownThread);
  40.                  CreateThread(0,0,ThrFunc,0,0,0);
  41.          }
  42.          getch();
  43.          return 0;
  44. }




Ранг: 162.4 (ветеран), 11thx
Активность: 0.060
Статус: Участник

Создано: 12 декабря 2011 12:31 · Поправил: SWR
· Личное сообщение · #17

я для записи использовал mmx регистр (сразу 8 байт писал)



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

Создано: 12 декабря 2011 23:49
· Личное сообщение · #18

SWR пишет:
я для записи использовал mmx регистр (сразу 8 байт писал)

Записи чего?Адреса для джампа?



Ранг: 162.4 (ветеран), 11thx
Активность: 0.060
Статус: Участник

Создано: 13 декабря 2011 13:06
· Личное сообщение · #19

всей инструкции. +остаток из оригинала.



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

Создано: 14 декабря 2011 00:28
· Личное сообщение · #20

Что то я совсем запуталься(( Как назад прыгнуть то



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

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

Code:
  1. PUSH EBP
  2. MOV EBP, ESP
  3. ...

заменяешь на
Code:
  1. JMP buffer
  2. ...возможно мусор....
  3. m1:чистый код

в своем буфере
Code:
  1. push ebp
  2. mov ebp, esp
  3. ..затертые команды попавшие в 5 байт..
  4. тут нужный тебе код
  5. jmp m1




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

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

Есть не условный а абсолютный джамп?Какой его опкод?




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 14 декабря 2011 13:10
· Личное сообщение · #23

Yotsi пишет:
Есть не условный а абсолютный джамп?

Есть

Yotsi пишет:
Какой его опкод?

SHORT: EB
LONG: E9

-----
Yann Tiersen best and do not fuck




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

Создано: 14 декабря 2011 15:28
· Личное сообщение · #24

Уточню вопрос - если такой вид джампа когда для перехода указываеться четко определенный адрес а не разница между адресами?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 14 декабря 2011 16:06
· Личное сообщение · #25

Простого перехода нет, можно аналоги делать, типа push imm32; ret
А вообще почитал бы уже ман, поотлаживал свой софт, что там не работает, и разобрался, чем про каждый опкод спрашивать.

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

Ранг: 50.0 (постоянный), 31thx
Активность: 0.090.1
Статус: Участник

Создано: 14 декабря 2011 19:46
· Личное сообщение · #26

Yotsi пишет:
Уточню вопрос - если такой вид джампа когда для перехода указываеться четко определенный адрес а не разница между адресами?

Переход есть, опкод EA, правда это дальний переход. Впрочем ничто не мешает использовать в качестве целевого селектора тот же селектор, что и текущий. Тогда вся разница между ближиним и дальним переходом будет
только в стеке.



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

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

У кого нибудь есть версия детуров посвежее чем здесь http://pastebin.com/RCJ896TM ?
ЗЫ: я правильно понимаю что детуры используют выше описанную технику с выполнением затертого кода и прыжком ы тело ф-ции?


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


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