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

ВИДЕОКУРС ВЗЛОМ
обновлён 2 декабря!


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

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

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

 eXeL@B —› Обсуждение статей —› [ Hex ] Armadillo и CopyMem II
Посл.ответ Сообщение


Ранг: 533.8 (!)
Статус: Администратор
Создатель CRACKL@B

Создано: 22 ноября 2010 00:12 New!
Цитата · Личное сообщение · #1

Обсуждение статьи Armadillo и CopyMem II

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

Создано: 29 июня 2014 07:53 · Поправил: kola1357 New!
Цитата · Личное сообщение · #2

Софтайс уже не актуален, сейчас набирает популярность олледебаг.
Поэтому распаковывал подобную прогу в олле. Распаковать получилось, все работает, но вот только не получилось выйти на код раскриптовки как рассказывают в статье. Я распаковывал прогу, покрытую армой версии 4.42.
Значит, ставлю бряк WriteProcessMemory, ставить надо или хардварный, потому что в новых версиях, арма палит обычные бряки. Либо ставить не на первые инструкции.
Первые 2 остановки были на запись бесконечного цикла в еп протектора, это не интересно, а вот тут вижу, что арма собирается копировать 1000 байт в секции кода, значит copymem 2 есть.
Code:
  1. 0012DACC   00492A75  /CALL to WriteProcessMemory from UnPackMe.00492A6F
  2. 0012DAD0   00000048  |hProcess = 00000048 (window)
  3. 0012DAD4   00427000  |Address = 427000
  4. 0012DAD8   003C5230  |Buffer = 003C5230
  5. 0012DADC   00001000  |BytesToWrite = 1000 (4096.)
  6. 0012DAE0   0012DBE8  \pBytesWritten = 0012DBE8
  7.  

Выхожу из функции ctrl+f9 и один раз f7 и еще раз до ret пробегаем и попадаем сюда.
Code:
  1. 004916D4    6A 00           PUSH 0
  2. 004916D6    8B4D 0C         MOV ECX,DWORD PTR SS:[EBP+C]
  3. 004916D9    51              PUSH ECX
  4. 004916DA    8B55 08         MOV EDX,DWORD PTR SS:[EBP+8]
  5. 004916DD    52              PUSH EDX
  6. 004916DE    E8 48030000     CALL 00491A2B                            ; UnPackMe.00491A2B
  7. 004916E3    83C4 0C         ADD ESP,0C
  8.  

Тут видим, что в стек кладется 3 параметра. Первый это 0, это значит расшифровывать, потом ecx - в нем код расшифровки страницы, а потом edx - тут номер страницы. Решил это дело зациклить, одна проблема код расшифровки страницы, который вычисляется в коде, который приведен в статье.

Его начало :
Code:
  1. text1:0044D6BD push 0 ; EnCryptBit - если 1 - закриптовать, 0 - раскриптовать
  2. _text1:0044D6BF mov esi, [ebp+PageNumber]
  3. _text1:0044D6C5 shl esi, 4


Как пишут в статье на него можно выйти 3 раза нажав выполнить до ret, но у меня так не получилось. Я этот код нашел через поиск в памяти по уникальным байтам. А далее сделал скрипт, который прогоняет через этот код все страницы секции кода. Далее отсоединил дочерний процесс при помощи DebugActiveStop и сдампил его.

Вот поэтому вопрос, есть ли еще способы выйти на данный код, потому что через ret не получается это сделать, но код легко найти в памяти по строчке кода
Code:
  1. shl esi,4
, которая довольно уникальная.

Ранг: 390.3 (мудрец)
Статус: Участник
"Тибериумный реверсинг"

Создано: 29 июня 2014 10:02 New!
Цитата · Личное сообщение · #3

kola1357 пишет:
Софтайс уже не актуален, сейчас набирает популярность олледебаг.

спасибо кэп!
1) поддержку софтайса стопицот лет назад прекратили, под новые версии винды он не идет
2) отладчики ядерного уровня и прикладного - две, абсолютно разные, вещи
3) собственно сам Armadillo недавно сдох. По большей части, этот протектор - уже история

Ранг: 488.4 (мудрец)
Статус: Участник

Создано: 29 июня 2014 13:00 · Поправил: VodoleY New!
Цитата · Личное сообщение · #4

kola1357 инжектиш в прогу свою длл которая пытается вычитать всю память.. арма за тебя все сама расшифрует, от тебя будет нужно ток нужные странички в файл сохранить. WriteProcessMemory это конечно круто.. но когда надо ВСЕ тело проги? а не отдельные странички?
З.Ы. борьбы с копимемом вариантов масса.. в свое время.. делали .. кто во что гаразд
З.Ы.Ы для особых ценителей.. можно и софтайс завести.. я дебажил его сисером.. или 2мя ольками с детачем дебагера.. то все на любителя и не принципиально

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

Создано: 29 июня 2014 13:05 New!
Цитата · Личное сообщение · #5

VodoleY пишет:
инжектиш в прогу свою длл

Да про такой способ слышал, но я применял способ зацикливания этого алгоритма, так как copymem подгружает только секцию кода, то нужно перебрать все странички, в моей проге размер секции кода был 1с000, то есть 1с страниц. Далее просто пробежал по циклу расшифровки, передавая ему одну за другой страницы и получил расшифрованную секцию кода.

Ранг: 488.4 (мудрец)
Статус: Участник

Создано: 29 июня 2014 13:11 New!
Цитата · Личное сообщение · #6

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

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

Создано: 29 июня 2014 17:15 New!
Цитата · Личное сообщение · #7

ELF_7719116 пишет:
2) отладчики ядерного уровня и прикладного - две, абсолютно разные, вещи

Согласен, а вот распаковывать протекторы уровня ринг-0 реально в ольке ? Или нужен именно отладчик уровня ядра ? Просто если протектор уровня ядра, у него много прав в системе, он может себе сделать полномочия системного процесса. И делать какие-нибудь гадости из ядра, которые олька не сможет поймать.


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

Создано: 29 июня 2014 17:25 New!
Цитата · Личное сообщение · #8

kola1357 какие протекторы по вашему мнению ring-0? арма таковым не является

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

Создано: 29 июня 2014 17:38 New!
Цитата · Личное сообщение · #9

Hellspawn, к примеру XtremeProtector, StarForce.


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

Создано: 29 июня 2014 17:47 New!
Цитата · Личное сообщение · #10

kola1357 топик про арму. XtremeProtector - мертв а StarForce крайних версий можно и в ollydbg, не принципиально.

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

Создано: 29 июня 2014 19:33 New!
Цитата · Личное сообщение · #11

ELF_7719116 пишет:
3) собственно сам Armadillo недавно сдох. По большей части, этот протектор - уже история

Автор забросил этот протектор ? Удивительно, но приемы типа copymem 2, debug-blocker, наномиты довольно интересны и в этом этот протектор уникален. Я со всем этим столкнулся именно в этом протекторе, они не сильно страшные (первые 2), но когда работаешь с другими протами, где обычно нужно дойти до оеп, найти спертые байты, если своровал, восстановить таблицу импорта апи, ее обычно все протекторы затрагивают. Ну и антидампы - новая фишка протекторов, правда не сильно усложняет нам жизнь. Вот из всего этого, мне кажется самое сложное это найти спертые байты.


Статус: Пришелец

Создано: 1 июля 2014 08:37 New!
Цитата #12

kola1357 пишет:
Софтайс уже не актуален, сейчас набирает популярность олледебаг.

Я бы сказал теряет. К тому моменту, когда выйдет x64 версия все инструменты уже будут под IDA и другие отладчики.

kola1357
Автор фишек copymem, db, nanomites забросил это протектор значительно давно, намного раньше чем прекращение развития и поддержки проекта. Кому какое дело до этих фишек, если по ним уже миллион статей? И как могут эти защитные механизмы помочь разработчикам ПО от взлома готовым набором инструментов для создания кейгена под арму?

Под CopyMEM способ Hex'а рулит. Без всяких DLL и прочих заморочек. Забавно, что единственный комментарий к статье под моим авторством и датирован 2009-ым годом. Это ж как время пролетело, больше 5 лет жизни...

kola1357 пишет:
есть ли еще способы выйти на данный код

А зачем именно туда? Выйти на этот код можно поставив бряк внутри WaitForDebugEvent, а по выходу найти код обработки ошибки доступа к памяти. Это может показаться не малой работой, но на деле же это всего пару часов отладки по не опытности. Потом вы будете видеть этот код как рентген. Мне для моего скрипта (сверх не универсального) достаточно выйти сразу же за WaitForDebugEvent. Смотрите сами:
Code:
  1. #include <idc.idc>
  2.  
  3. static kill_open_pages_protection(max_pages_count_var)
  4. {
  5.   PatchDword(max_pages_count_var, 0x7FFFFFFF);
  6. }
  7.  
  8. static process_page(page_addr, start_processing_exception)
  9. {
  10.   EIP = start_processing_exception;
  11.   StepInto(); // trace loading pointer of DebugEvent
  12.   GetDebuggerEvent(WFNE_SUSP, 1); // wait while dbg will return control
  13.   StepInto(); // trace loading bad mem addr
  14.   GetDebuggerEvent(WFNE_SUSP, 1); // wait while dbg will return control
  15.   EAX = page_addr;
  16.   GetDebuggerEvent(WFNE_CONT, -1);
  17. }
  18.  
  19. static main() {
  20.   // .doglcx:0091CE8A mov     eax, ds:MagicArrayOffset_0
  21.   // .doglcx:0091CE8F mov     ecx, [eax]
  22.   // .doglcx:0091CE91 xor     ecx, 80000001h
  23.   // .doglcx:0091CE97 cmp     [ebp+var_210], ecx
  24.   // .doglcx:0091CE9D jnz     loc_91D2CB
  25.   //
  26.   // .doglcx:0091CEA3 mov     edx, [ebp+lpDebugEvent] ; CopyMEM
  27.   // .doglcx:0091CEA9 mov     eax, [edx+24h]
  28.   // .doglcx:0091CEAC mov     [ebp+var_220], eax
  29.   // .doglcx:0091CEB2 cmp     ds:OpenPagesCounter, 0
  30.   // .doglcx:0091CEB9 jnz     loc_91CF5B
  31.   auto start_processing_exception = 0x91CEA3;
  32.   // .doglcx:0091E7DB mov     edx, ds:OpenPagesCounter
  33.   // .doglcx:0091E7E1 cmp     edx, ds:MaxOpenPages
  34.   // .doglcx:0091E7E7 jle     loc_91E8E9
  35.   auto max_open_pages_count_var_addr = 0x9E89D8;
  36.   // .bycmt:00A04CFC PagesCount dd 1203
  37.   // .bycmt:00A04D00 OpenPagesCounter dd 14h
  38.   auto PagesCount = 0xA04CFC;
  39.   // at the begining of ProcessPageRecovery proc
  40.   // .doglcx:0091E659 mov     eax, [ebp+PageNumber]           ; get page number to decrypt
  41.   // .doglcx:0091E65C mov     ecx, ds:PageStateArray
  42.   // .doglcx:0091E662 mov     edx, [ecx+eax*4]
  43.   auto PagesStateArray = 0xA04D08;
  44.   auto ImageBase = 0x401000;
  45.   auto i, total;
  46.   // decrypt all crypted pages
  47.   if (PrevAddr(PagesStateArray) != BADADDR) {
  48.     auto PagesStates = Dword(PagesStateArray);
  49.     total = Dword(PagesCount);
  50.     Message("===================CopyMEM II killer=================\n");
  51.     Message("Pages to decrypt: %x\n", total);
  52.     // prepare hack
  53.     kill_open_pages_protection(max_open_pages_count_var_addr);
  54.     Message("Back encryption turned off...\n");
  55.     for (= 0; i < total; ++i) {
  56.       auto check_page = Dword(PagesStates + i * 4);
  57.       if (check_page)
  58.         continue;
  59.       // start recovery
  60.       auto page_addr = EAX & 0xFFF;
  61.       page_addr = page_addr + ImageBase + i * 0x1000;
  62.       process_page(page_addr, start_processing_exception);
  63.       Message("page %x decrypted\n", page_addr);
  64.       // end recovery
  65.     }
  66.   }
  67. }

Я ищу счетчик открытых страниц, значение разрешенного максимума открытых страниц и массив статусов страниц. Прибив значение максимума, идем по массиву статусов и везде где страница нуждается в расшифровке проходим весь цикл обработки ошибки, отпуская отладчик армы каждый раз и позволяя ему отдать винде исключение. Оно остается не обработанным (и не важно что это было за исключение. Мы переставляем в скрипте указатель команд на нужное место и пусть арма думает, что обрабатывает именно ошибку памяти. Когда все страницы расшифрованы, можно делать дамп. Желательно это делать на первой же обработке CopyMEM, пока приложение не успело запуститься и нагадить в своей собственной памяти.

kola1357 пишет:
Далее отсоединил дочерний процесс при помощи DebugActiveStop и сдампил его.

Это еще зачем? Можно просто дампить.

kola1357 пишет:
Ну и антидампы - новая фишка протекторов, правда не сильно усложняет нам жизнь. Вот из всего этого, мне кажется самое сложное это найти спертые байты.

Во-первых, очень не новая. CopyMEM это тоже анти-дамп метод и ему 100 лет уже. Во-вторых, самое сложное виртуальные машины на сегодня. Сегодня их ломают двумя основными способами - или инлайн (код то остается кодом, даже после обфускации, а виртуализация по сути просто вариант обфускации), в том числе инлайн пикода с восстановлением контрольных сумм, или же полная девиртуализация, что скриптом уж точно не сделаешь для хороших ВМ. А это месяцы и даже годы трудов на создание системы девиртуализации.

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


Ранг: 390.3 (мудрец)
Статус: Участник
"Тибериумный реверсинг"

Создано: 1 июля 2014 13:34 New!
Цитата · Личное сообщение · #13

int пишет:
самое сложное виртуальные машины на сегодня.

хм! за SecuROM я бы так не сказал, тащемта анализируя область обмена данными между хендлами и основные регистры VM, можно очень быстро воспроизвести, что творится внутри виртуальной машинки. традиционно, туда засунуты примитивные операции, типа xxx DWORD [куда-то], что-то, где вместо xxx-MOV или XOR. а в остальном, из секуромовской вм извлекается профит в виде удобной навигации и всяких вкусностей, типа перехода в OEP. впрочем, это частный случай, а в остальных протекторах наверняка чуть посложнее

Ранг: 617.3 (!)
Статус: Участник

Создано: 1 июля 2014 14:40 New!
Цитата · Личное сообщение · #14

ELF_7719116
Ты сравниваешь немного разные вещи, у армы сплайсинг практически не менялся со времен его изобретения, секира же от версии к версии его модифицирует.

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



Ранг: 1120.2 (!!!!)
Статус: Участник

Создано: 1 июля 2014 17:01 New!
Цитата · Личное сообщение · #15

ELF_7719116 пишет:
за SecuROM я бы так не сказал


с тем же стар-форсом и vmp гораздо веселее.
 eXeL@B —› Обсуждение статей —› [ Hex ] Armadillo и CopyMem II

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

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