eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 августа!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

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

Сейчас на форуме: morgot, Adler, DeeDee, korsaring (+4 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Протекторы —› Themida - Обфускация и эмуляция API функций
Посл.ответ Сообщение

Ранг: 67.5 (постоянный)
Статус: Участник

Создано: 23 мая 2016 23:07 · Поправил: 23 мая 2016 23:30 Boostyq New!
Цитата · Личное сообщение · #1

Всем привет, изучаю продукты, упакованные Themida и уже второй раз сталкиваюсь с такой штуковиной:
Вызовы функций вида E8 ? ? ? ? 90 уходят за пределы модуля, а там полная шляпа:
Code:
  1. 050D037D - E9 05000000           - jmp 050D0387
  2. 050D0382 - 49                    - dec ecx
  3. 050D0383 - 4E                    - dec esi
  4. 050D0384 - 6F                    - outsd 
  5. 050D0385 - 7C 05                 - jnge 050D038C
  6. 050D0387 - 0F31                  - rdtsc 
  7. 050D0389 - 60                    - pushad 
  8. 050D038A - 60                    - pushad 
  9. 050D038B - 61                    - popad 
  10. 050D038C - 9C                    - pushfd 
  11. 050D038D - E9 12000000           - jmp 050D03A4

...или еще пару десятков прыжков, в итоге приходящих на оригинальную API функцию
Вначале я все обрабатывала руками, но на второй день потеряла текстовик с записями и надоело держать компьютер включенным, чтобы адреса не сбились
-----------------------------------------------------------------
Вообщем, пишу анализатор, что уже готово:
-Поиск всех таких вызовов по маске E8 ? ? ? ? 90
-Следование по всем редиректам
Code:
  1. E8 ?? ?? ?? ??    - относительный вызов
  2. E9 ?? ?? ?? ??    - относительный прыжок
  3. FF 15 ?? ?? ?? ?? - точный вызов
  4. FF 25 ?? ?? ?? ?? - точный прыжок
  5. EB ??             - прыжок сдвига

-Дохождение до оригинального вызова:
Code:
  1. 5EEC3151 -> main call to 050D0379
  2. {
  3.  050D0379 -> MOV EDI,EDI : 2
  4.  050D037B -> PUSH EAX : 1
  5.  050D037C -> PUSH EDX : 1
  6.  050D037D -> relative jump to 050D0387
  7.   050D0387 -> RDTSC : 2
  8.   050D0389 -> PUSHAD : 1
  9.   050D038A -> PUSHAD : 1
  10.   050D038B -> POPAD : 1
  11.   050D038C -> PUSHFD : 1
  12.   050D038D -> relative jump to 050D03A4
  13.    050D03A4 -> ADC AH,AE : 3
  14.    050D03A7 -> relative jump to 050D03C0
  15.     050D03C0 -> POPFD : 1
  16.     050D03C1 -> POPAD : 1
  17.     050D03C2 -> POP EDX : 1
  18.     050D03C3 -> POP EAX : 1
  19.     050D03C4 -> XCHG EAX,EBP : 1
  20.     050D03C5 -> PUSH EAX : 1
  21.     050D03C6 -> PUSH EDX : 1
  22.     050D03C7 -> PUSHAD : 1
  23.     050D03C8 -> POPAD : 1
  24.     050D03C9 -> RDTSC : 2
  25.     050D03CB -> PUSH EAX : 1
  26.     050D03CC -> PUSH EDX : 1
  27.     050D03CD -> PUSHAD : 1
  28.     050D03CE -> POPAD : 1
  29.     050D03CF -> RDTSC : 2
  30.     050D03D1 -> PUSH EAX : 1
  31.     050D03D2 -> PUSH EDX : 1
  32.     050D03D3 -> RDTSC : 2
  33.     050D03D5 -> POP EDX : 1
  34.     050D03D6 -> POP EAX : 1
  35.     050D03D7 -> POP EDX : 1
  36.     050D03D8 -> POP EAX : 1
  37.     050D03D9 -> POP EDX : 1
  38.     050D03DA -> POP EAX : 1
  39.     050D03DB -> PUSH EAX : 1
  40.     050D03DC -> PUSHAD : 1
  41.     050D03DD -> PUSH EAX : 1
  42.     050D03DE -> PUSH EDX : 1
  43.     050D03DF -> MOVZX ESI,DI : 3
  44.     050D03E2 -> RDTSC : 2
  45.     050D03E4 -> PUSHFD : 1
  46.     050D03E5 -> relative jump to 050D03F6
  47.      050D03F6 -> OR AH,46 : 3
  48.      050D03F9 -> relative jump to 050D040A
  49.       050D040A -> POPFD : 1
  50.       050D040B -> POP EDX : 1
  51.       050D040C -> POP EAX : 1
  52.       050D040D -> MOV EDX,ECX : 2
  53.       050D040F -> POPAD : 1
  54.       050D0410 -> XCHG EAX,EBP : 1
  55.       050D0411 -> PUSH EAX : 1
  56.       050D0412 -> PUSH EDX : 1
  57.       050D0413 -> PUSH EAX : 1
  58.       050D0414 -> PUSH EDX : 1
  59.       050D0415 -> PUSHAD : 1
  60.       050D0416 -> POPAD : 1
  61.       050D0417 -> RDTSC : 2
  62.       050D0419 -> PUSHAD : 1
  63.       050D041A -> POPAD : 1
  64.       050D041B -> POP EDX : 1
  65.       050D041C -> POP EAX : 1
  66.       050D041D -> RDTSC : 2
  67.       050D041F -> PUSH EAX : 1
  68.       050D0420 -> PUSH EDX : 1
  69.       050D0421 -> relative jump to 050D042E
  70.        050D042E -> RDTSC : 2
  71.        050D0430 -> PUSHAD : 1
  72.        050D0431 -> POPAD : 1
  73.        050D0432 -> POP EDX : 1
  74.        050D0433 -> POP EAX : 1
  75.        050D0434 -> POP EDX : 1
  76.        050D0435 -> POP EAX : 1
  77.        050D0436 -> MOV EBP,ESP : 2
  78.        050D0438 -> PUSH EAX : 1
  79.        050D0439 -> PUSH EDX : 1
  80.        050D043A -> PUSHAD : 1
  81.        050D043B -> PUSHFD : 1
  82.        050D043C -> relative jump to 050D0452
  83.         050D0452 -> OR EAX,6D933878 : 6
  84.         050D0458 -> relative jump to 050D0463
  85.          050D0463 -> POPFD : 1
  86.          050D0464 -> MOV AH,3 : 2
  87.          050D0466 -> POPAD : 1
  88.          050D0467 -> RDTSC : 2
  89.          050D0469 -> PUSHAD : 1
  90.          050D046A -> PUSHAD : 1
  91.          050D046B -> POPAD : 1
  92.          050D046C -> MOV SI,B1FD : 4
  93.          050D0470 -> POPAD : 1
  94.          050D0471 -> POP EDX : 1
  95.          050D0472 -> POP EAX : 1
  96.          050D0473 -> POP EBP : 1
  97.          050D0474 -> PUSHAD : 1
  98.          050D0475 -> MOV CX,23B5 : 4
  99.          050D0479 -> relative jump to 050D048B
  100.           050D048B -> POPAD : 1
  101.           050D048C -> relative jump to 76A73476
  102.            76A73476 -> shift jump to 76A73465
  103.             76A73465 -> direct jump to 77021E4C
  104.              77021E4C - kernelbase.dll.GetModuleHandleW -> final function address!
  105. }

-Анализ pushad/popad pushfd/popfd - они просто сокращаются, ибо взятое равно положенному
-Сохранение важных инструкций, таких как:
Code:
  1. MOV EDI,EDI (правда она нахер не нужна, просто 2 байтовый nop, мб для хот-патча)
  2. MOV EBP,ESP

-Сокращение некоторых инструкций,
Code:
  1. XCHG EAX,EBP; PUSH EAX --> PUSH EBP

-Генерация примерного (недостаточный анализ) листинга выполнения:
Code:
  1. 050C0315 - MOV EDI,EDI
  2. 050C0349 - PUSH EBP
  3. 050C053A - PUSH DWORD PTR [EBP+20]
  4. 050C0553 - PUSH DWORD PTR [EBP+1C]
  5. 050C057D - PUSH DWORD PTR [EBP+18]
  6. 050C0593 - PUSH DWORD PTR [EBP+14]
  7. 050C05BE - PUSH DWORD PTR [EBP+10]
  8. 050C05F5 - PUSH DWORD PTR [EBP+8]
  9. 76A70940 - JMP [76A70940] ; ->kernelbase.dll.DuplicateHandle

Вообще, я думаю, это не обязательно. т.к. вся это по сути эмулированные функции
-----------------------------------------------------------------
Что хочу сделать еще:
-Дополнить анализ (!Если вы что-то об этом знаете, обязательно напишите тут, я добавлю, спасибо)
-Исправить ошибки, такие как зависания и т.п.
-Возможно, создание дампа, вписывание таблицы импорта и замена вызовов для удобного изучения
-Если есть интерес и я таки допилю утиль, то могу выложить
-П.С. я знаю что пишу велосипед (видела исходники healiat, но у меня он не работал)


{ Атач доступен только для участников форума } - thapi.log


Ранг: 990.3 (! ! !)
Статус: Модератор
Author of DiE

Создано: 23 мая 2016 23:22 New!
Цитата · Личное сообщение · #2

а вот это смотрели?

https://tuts4you.com/download.php?view.3526

там вроде мусор шаблонный и легко выпиливается, помню на форуме был срипт 100% рабочий.

Ранг: 67.5 (постоянный)
Статус: Участник

Создано: 23 мая 2016 23:26 · Поправил: 23 мая 2016 23:30 Boostyq New!
Цитата · Личное сообщение · #3

Hellspawn пишет:
а вот это смотрели?

Конечно,
К сожалению, все, что я пробовала не смогло ничего сделать вообще
Мб руки кривые, но ни один скрипт от LCF-AT не дошел до конца, хотя я слышала, что она отлично сделала
П.с. я скрипты пока не умею писать, у меня exe если что


Ранг: 990.3 (! ! !)
Статус: Модератор
Author of DiE

Создано: 23 мая 2016 23:31 New!
Цитата · Личное сообщение · #4

Boostyq странно, обычно все работало, там XP желательна для анпака, ну ок если так.
инструмент лишним точно не будет, если будет работать а движок для дебага какой или просто скан памяти процесса?

Ранг: 67.5 (постоянный)
Статус: Участник

Создано: 24 мая 2016 01:26 New!
Цитата · Личное сообщение · #5

Hellspawn пишет:
Boostyq странно, обычно все работало, там XP желательна для анпака, ну ок если так.
инструмент лишним точно не будет, если будет работать а движок для дебага какой или просто скан памяти процесса?

Да, я слышала, что XP желателен, мб из-за того что Dll-ка, а не Exe, там либо не видит библиотеку, либо детектит
Использую:
-Небольшую библиотеку для работы с памятью - написала сама, я наверное единственная, кто пишет код на русском
-Библиотеку disasm от Oleh Yuschuk - она довольно старая (2001 год)


Ранг: 482.5 (мудрец)
Статус: Участник
_Вечный_Студент_

Создано: 24 мая 2016 05:44 New!
Цитата · Личное сообщение · #6

Boostyq пишет:
Если есть интерес и я таки допилю утиль, то могу выложить


за всех не скажу, но у меня лично интерес есть.
Так что если-таки допилите, то выкладывайте обязательно!

Ранг: 280.6 (наставник)
Статус: Участник
Destroyer of protectors

Создано: 24 мая 2016 07:26 New!
Цитата · Личное сообщение · #7

Boostyq пишет:
-П.С. я знаю что пишу велосипед (видела исходники healiat, но у меня он не работал)

разнообразие порождает гармонию, очень приятно видеть, что наши девушки в теме.

Ранг: 95.7 (постоянный)
Статус: Участник

Создано: 24 мая 2016 09:16 New!
Цитата · Личное сообщение · #8

Boostyq пишет:
правда она нахер не нужна

Нет.Девушка так писать не будет, а вот быдлосамка (клитор-переросток) с раздутым как жопа чсв да.
У баб оно как - подрезала солюшн и расплыла со всех щелей от радости.Да и порог выхода из девушек(хотя этот порог нарушается после всеми известного процесса) - это овер 25, ибо уже старухи.Ну да ладно сексизма.

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

Обфускацией это назвать язык не поворачивается.Это скорее дрисня на постном масле


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

Создано: 24 мая 2016 09:41 · Поправил: 24 мая 2016 09:46 Rainbow New!
Цитата · Личное сообщение · #9

Boostyq пишет:
MOV EDI,EDI (правда она нахер не нужна, просто 2 байтовый nop, мб для хот-патча)
MOV EBP,ESP


Если мне не изменяет память, это слямзеное OEP API. Если это так, то тут пропущена инструкция PUSH EBP. Что касается mov edi, edi - где-то читал, что мелкомягкие решили таким способом организовывать апишные прологи, для того что бы было удобно хукать при помощи безусловного джампа, устанавливаемого на EP функи. Инструкция mov edi, edi внедрена специально. Она занимает 2 байта и не несет в себе никакой нагрузки. Если типичный минимальный пролог функции для фрейма стека на базе EBP-регистра формируется при помощи 2 инструкций (PUSH EBP + MOV EBP, ESP), это занимает 3 байта, а с mov edi, edi - уже 5, что идеально подходит под 5-байтовый JMP XXXXXXXX. Ну типа не надо использовать дизассемблер для вычисления длин инструкций, что бы перенести n цельных команд, занятых джампом в трамплин, а сразу брать и хукать, заранее зная, что там будет mov edi, edi (2) + push ebp (1) + mov ebp, esp (2).

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


Ранг: 67.5 (постоянный)
Статус: Участник

Создано: 24 мая 2016 10:36 · Поправил: 24 мая 2016 16:24 Boostyq New!
Цитата · Личное сообщение · #10

unknownproject пишет:
Нет.Девушка так писать не будет, а вот быдлосамка (клитор-переросток) с раздутым как жопа чсв да.
У баб оно как - подрезала солюшн и расплыла со всех щелей от радости.Да и порог выхода из девушек(хотя этот порог нарушается после всеми известного процесса) - это овер 25, ибо уже старухи.Ну да ладно сексизма.

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

Обфускацией это назвать язык не поворачивается.Это скорее дрисня на постном масле

Я тебя услышала и ты меня расстроил ._.
Знаешь, ты такой умный, я тебе завидую...
Я тоже хочу кинуть монету два раза, чтобы мне выпала решка и вломить заключение, что как монету не кинуть это все "как ты говориш дрисня" и всегда выпадает одно и тоже, другого быть не может - защита вообще дно
-----------------------------------------------------------------
А если серьезно, ты идиот? Темида имеет гибкие настройки.
Конечно, бывает, что там только внешняя упаковка, например в играх, где нельзя выполнять долгие операции во время рендеринга - тебе такое и попалось.
Но! Что ты будешь делать, если встретишь виртуальную машину? Функция уходит в непонятный цикл и куча мусора в секциях? А если точка вм обфусцирована? Вместо вызовов апи выход за пределы модуля, что сделаешь? Сдампишь, пофиксишь импорт и полезешь искать скрипты, а руками сможешь распаковать? Я смогу, потому что стараюсь подучить, чтобы получить опыт, потому что опыт - самое важное в распаковке...
-----------------------------------------------------------------
Ты мне не нравишься, нужно быть добрее к людям -_-
Rainbow спасибо, еще туда так же можно вставить EB ??, тоже для хука

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



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

Создано: 24 мая 2016 10:47 New!
Цитата · Личное сообщение · #11

Boostyq пишет:
Rainbow спасибо, еще туда так же можно вставить EB ??, тоже для хука


Ну в случае short-jump'а задействуется только mov edi, edi. В случае c long - 3 инструкции.. Так что хукайте, мелкомягкие дают добро


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

Создано: 24 мая 2016 10:48 New!
Цитата · Личное сообщение · #12

Boostyq пишет:
относительный прыжок

относительно чего?
короткий или длинный понятно, но всё равно прикольно, запомню.
MasterSoft пишет:
очень приятно видеть, что наши девушки в теме.

+1...затаив дыхание читал...

Ранг: 67.5 (постоянный)
Статус: Участник

Создано: 24 мая 2016 11:06 New!
Цитата · Личное сообщение · #13

Bronco пишет:
относительно чего?
короткий или длинный понятно, но всё равно прикольно, запомню.

Вот, если нужно, я написала функцию, которая выдает адрес куда идет call/jmp
Code:
  1. DWORD ThAPI_GetRedirectAddress(DWORD pid, BYTE *data, DWORD address = 0)
  2. {
  3.          /*
  4.          E8 ?? ?? ?? ??    - относительный вызов
  5.          E9 ?? ?? ?? ??    - относительный прыжок
  6.          FF 15 ?? ?? ?? ?? - точный вызов
  7.          FF 25 ?? ?? ?? ?? - точный прыжок
  8.          EB ??             - прыжок сдвига
  9.          */
  10.  
  11.          if (data[0] == 0xFF && (data[1] == 0x15 || data[1] == 0x25))
  12.          {
  13.                  DWORD point = 0;
  14.                  Память::Процесс_Прочитать(pid, *(DWORD *)(data + 2), &point, 4); // модифицированная ReadProcessMemory
  15.                  return point;
  16.          }
  17.          else if (address)
  18.          {
  19.                  if (data[0] == 0xE8 || data[0] == 0xE9)
  20.                         return address + *(DWORD *)(data + 1) + 5;
  21.                  else if (data[0] == 0xEB)
  22.                         return address + *(INT8 *)(data + 1) + 2;
  23.          }
  24.  
  25.          return 0;
  26. }

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

Создано: 26 мая 2016 13:57 · Поправил: 26 мая 2016 14:34 UniSoft New!
Цитата · Личное сообщение · #14

Rainbow пишет:
Инструкция mov edi, edi внедрена специально. Она занимает 2 байта и не несет в себе никакой нагрузки. Если типичный минимальный пролог функции для фрейма стека на базе EBP-регистра формируется при помощи 2 инструкций (PUSH EBP + MOV EBP, ESP), это занимает 3 байта, а с mov edi, edi - уже 5, что идеально подходит под 5-байтовый JMP XXXXXXXX.

Вообще-то это несколько не так... технология hotpach...
да в этой технологии не требуется дизассемблер длин...
а 2-х байтовая инструкция mov edi, edi специально зарезервирована для короткого перехода на 5 байт назад, которые зарезервированы уже для длинного перехода (куда угодно в x86) (+-2Gb в x64)

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

 eXeL@B —› Протекторы —› Themida - Обфускация и эмуляция API функций

Оригинальный DVD-ROM: eXeL@B DVD !

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