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

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


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

Создано: 23 мая 2016 23:07 · Поправил: Boostyq
· Личное сообщение · #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, но у меня он не работал)


0695_24.05.2016_EXELAB.rU.tgz - thapi.log

-----
В облачке многоточия





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

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

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

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

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

-----
[nice coder and reverser]





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

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

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

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

-----
В облачке многоточия





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

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

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

-----
[nice coder and reverser]





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

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

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

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

-----
В облачке многоточия





Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

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

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


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

-----
Give me a HANDLE and I will move the Earth.




Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

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

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

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



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

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

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

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

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

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

-----
TEST YOUR MIGHT





Ранг: 110.8 (ветеран), 104thx
Активность: 0.090.01
Статус: Участник

Создано: 24 мая 2016 09:41 · Поправил: Rainbow
· Личное сообщение · #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


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

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

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

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

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

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

-----
В облачке многоточия


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


Ранг: 110.8 (ветеран), 104thx
Активность: 0.090.01
Статус: Участник

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

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


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




Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

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

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

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

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

-----
Чтобы юзер в нэте не делал,его всё равно жалко..





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

Создано: 24 мая 2016 11:06
· Личное сообщение · #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. }


-----
В облачке многоточия





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

Создано: 26 мая 2016 13:57 · Поправил: UniSoft
· Личное сообщение · #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 функций
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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