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

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

 eXeL@B —› Протекторы —› Декомпилятор ВМ
<< 1 ... 18 . 19 . 20 . 21 . 22 . 23 . 24 . >>
Посл.ответ Сообщение


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

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

Вашему вниманию предлагаются наработки по декомпиляции ВМ.
Проект на сегодняшний день для меня завершен, но жаль если результат "ляжет на полку", может кому-нибудь и пригодится. Предлагаю сначала ознакомиться с обзором, и если будет интерес то могу выложить и сам плагин, или здесь или в личку заинтересованным лицам, каким образом, пока ещё не решил...
Но если кто-либо ожидает увидеть "автоматическое чудо", то сразу скажу - его нет. Для того чтобы получить результат нужна ручная предварительная работа:
- с исследуемой программы должна быть снята упаковка
- точки входа в ВМ находятся вручную
- возможно неоднократное "жамкание" клавиш в OllyDbg, а возможно и модификация кода, чтобы попасть в нужное место, в зависимости от защищенной функции
- необходимо вручную прицепить к программе требуемый секцию
- запись результатов в файл это тоже ручная работа, но уже более приятная

Не всё гладко обстоит с определением реализаций ВМ, на сегодняшний день примерно каждая третья реализация автоматом не определяется, приходится под неё модернизировать плагин, т.к. не могу сразу предусмотреть все случаи "издевательств" ВМ с кодом примитивов. Лучше дела с восстановлением "исходного" кода защищенных функций - 70% нормально восстанавливается, хотя во многом это зависит от самой структуры функции. Таким образом, если будет заинтересованность и помощь в нахождении подобных ситуаций, то проект может быть доведен до релизной стадии.

ЗЫ: Речь идет об Ореановских машинах. Нигде специально не упоминал.

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


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

Создано: 15 февраля 2017 21:51 · Поправил: difexacaw New!
Цитата · Личное сообщение · #2

Bronco

Да нет, вы не понимаете. Этот визор юзермод. Это локальный стековый супервизор(это не гипервизор, это софтверная реализация). Там есть эвенты на вызов сервисов, в свою очередь импорт сюда полноценных фильтров для антидебага(которые в известном ранее проекте никто заюзать из за гуя не смог) потребовало некоторого времени, так как визор в разработке, почему собственно и взят этот семпл(вручную обойти дебаг - это говно вопрос)

Гипервизоры не могут решать такие задачи, из за изоляции среды(см атомы) и сложности реализации.

Что бы получить результ по сабжу нужно снять статистику, это я сделаю в ближайшее время. Идея проста. Нужно получить стату по выборке данных и исполнению. Это поведение потока. Визор трекает выборки из памяти, соответственно вся память должна быть гранулирована и для соотвествующего в логе входа сохраняться событие выборки данных и исполнения и так же счётчики. Это позволит далее отобразить стату в виде графика. Этот функционал давно реализован https://yadi.sk/i/cAAE4aX236nRik
Но не откатан, пока я пилю само ядро мотора. Для быстрого получения результа я просто создам базу данных, в которую буду сохранять всю стату. Проблема будет только в анализе данной инфы - придётся запилить простой гуй для визуального отображения результа.


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

Создано: 15 февраля 2017 22:13 New!
Цитата · Личное сообщение · #3

Вот что вызывает прот из АПИ на начальной стадии
Code:
  1. 0015105F: Call: 7C809A2D [kernel32.LocalAlloc], Args: 2
  2. 00151573: Call: 7C80DE95 [kernel32.GetCurrentProcess], Args: 0
  3. 00152F34: Call: 7C80998B [kernel32.GetCurrentThread], Args: 0
  4. 001564A5: Call: 7C80B475 [kernel32.GetModuleFileNameW], Args: 3
  5. 001540DB: Call: 7C809A2D [kernel32.LocalAlloc], Args: 2
  6. 00161403: Call: 7C8099CF [kernel32.LocalFree], Args: 1
  7. 00166A16: Call: 7C80B475 [kernel32.GetModuleFileNameW], Args: 3
  8. 0016C759: Call: 7C80AC7E [kernel32.FreeLibrary], Args: 1
  9. 00168867: Call: 77DE6F55 [ADVAPI32.OpenSCManagerW], Args: 3
  10. 00168C28: Call: 77E369B8 [ADVAPI32.EnumServicesStatusExW], Args: 10
  11. 0016D8F6: Call: 7C80AC7E [kernel32.FreeLibrary], Args: 1
  12. 00168E35: Call: 7C90FE21 [kernel32.RtlGetLastWin32Error], Args: 0
  13. 001690DC: Call: 7C809A2D [kernel32.LocalAlloc], Args: 2
  14. 001693AE: Call: 77E369B8 [ADVAPI32.EnumServicesStatusExW], Args: 10
  15. 0016BAB6: Call: 7C8099CF [kernel32.LocalFree], Args: 1
  16. 0016BC11: Call: 77DE6CE5 [ADVAPI32.CloseServiceHandle], Args: 1
  17. 00169CEF: Call: 77DE6FFD [ADVAPI32.OpenServiceW], Args: 3
  18. 00169F51: Call: 77DF6F92 [ADVAPI32.QueryServiceConfigW], Args: 4
  19. 0016A15E: Call: 7C90FE21 [kernel32.RtlGetLastWin32Error], Args: 0
  20. 0016A405: Call: 7C809A2D [kernel32.LocalAlloc], Args: 2
  21. 0016A689: Call: 77DF6F92 [ADVAPI32.QueryServiceConfigW], Args: 4
  22. 0016B591: Call: 7C8099CF [kernel32.LocalFree], Args: 1
  23. 0016B6CC: Call: 77DE6CE5 [ADVAPI32.CloseServiceHandle], Args: 1
  24. 00170106: Call: 7C8207BD [kernel32.GetProcessAffinityMask], Args: 3
  25. 00170835: Call: 7C80998B [kernel32.GetCurrentThread], Args: 0
  26. 00170B89: Call: 7C82EAC2 [kernel32.SetThreadAffinityMask], Args: 2
  27. 00170C61: Call: 7C802446 [kernel32.Sleep], Args: 1
  28. 0017054B: Call: 7C862E24 [kernel32.SetProcessAffinityMask], Args: 2
  29. 00171F29: Call: 7C82EAC2 [kernel32.SetThreadAffinityMask], Args: 2
  30. 0017259F: Call: 7C862E24 [kernel32.SetProcessAffinityMask], Args: 2

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


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

Создано: 15 февраля 2017 22:20 · Поправил: difexacaw New!
Цитата · Личное сообщение · #4

Vamit

Могу вам выложить подробный лог по нтапи, но нужно время на импорт логгера.

Вчера кстате вспомнил была забавная ситуация. Семпл первым делом детектит отладчик через винь апи IsDebuggerPresent(). Детект сей основан на проверке флага в PEB. Фишка в том что если его сбросить, то отладочный юзер лог переключится на ядерный и начнётся генерация CC. Конечно нет проблемы пропатчить кодес, но решилось интересно. Просто задана условная конструкция на выборку данных с этого адреса и соответствующее обнуление регистра-ридера. Но далее из не профайла был тупо поставлен евент на возврат из этой апи и фикс результа. забавно да


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

Создано: 16 февраля 2017 06:32 New!
Цитата · Личное сообщение · #5

difexacaw пишет:
Да нет, вы не понимаете. Этот визор юзермод.

ну мне прямо полегчало..
ну а на самом деле, конечно интересно практическая сторона мотора.

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

Создано: 16 февраля 2017 07:39 New!
Цитата · Личное сообщение · #6

Bronco пишет:
конечно интересно практическая сторона мотора


Гражданин навечно застрял в 32-битах, и отвлекает товарища Vamita от работы на 64-битным вмпротом своими
"моторами", работать с которыми может он один, "ввиду их невероятной сложности"

difexacaw пишет:
Если к примеру rdtsc можно забанить настройкой железа(мср), то cpuid так не получится трекнуть.


Давай ты мне тут не будешь рассказывать, а? Засылай любой "сэмпл", я тебе и cpuid, и rdtsc "трекну"

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



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

Создано: 16 февраля 2017 07:55 New!
Цитата · Личное сообщение · #7

oldman

Семпл выше, найдите как детектит варю.

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

Создано: 16 февраля 2017 09:02 · Поправил: oldman New!
Цитата · Личное сообщение · #8

difexacaw пишет:
Семпл выше, найдите как детектит варю.


Оба "семпла" запущены под варей. Детектит варю оно элементарно - вызывает cpuid с eax=1, и смотрит в ответе,
включен ли бит 31 в ECX - "Hypervisor present" - бит я выключил. Далее идут вызовы cpuid с eax=0, в надежде
найти вендора "VmwareVmware", но там я заботливо оставил "fuck" Ну там еще с eax=7 вызовы идут,
не вникал зачем оно ему.

Rdtsc юзает активно, но толи криво реализован детект разницы таймеров между прямыми вызовами, и через
форсированый vmexit, толи не для этого вообще используется - вообщем через rdtsc вмпрот варю задетектить не
смог, в отличие от pafish-a, и ему подобных.

ЗЫ. полируем сверху Сциллой и "cэмплы" запускаются под варей и из под x32dbg

ЗЗЫ. На варе установлена win10 anniversary


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

Создано: 16 февраля 2017 09:35 · Поправил: difexacaw New!
Цитата · Личное сообщение · #9

oldman

Не правда, я заменял результ cpuid на тот, который на реал тачке, оно всё равно детектит. И никаких вызовов с 7 нет.

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

Создано: 16 февраля 2017 09:45 · Поправил: oldman New!
Цитата · Личное сообщение · #10

difexacaw пишет:
оно всё равно детектит.


моторчик видать твой хреновато работает, пропускает вызовы

15 раз выполняет cpuid с eax=0, 24 раз с eax=1, и 11 с eax=7 - это который usermode.exe

С ....kernelmode.exe, тот в сумме 56 раз вызвал.

Добавлено спустя -57 минут
difexacaw пишет:
И никаких вызовов с 7 нет.


Просто мой "мотор" всё палит, и .dll которые процесс подгрузил - тоже

Это, судя по rip - bcryptprimitives.dll вызывает с eax=7

ЗЫ.

cpuid rip = 0000000000895AD6 eax = 0000000000000001
cpuid rip = 000000000068A61E eax = 0000000000000001
cpuid rip = 000000000069BE6E eax = 0000000000000001
cpuid rip = 000000000069BE6E eax = 0000000000000001
cpuid rip = 000000000069BE6E eax = 0000000000000001
cpuid rip = 000000000069BE6E eax = 0000000000000001
cpuid rip = 000000000046F50C eax = 0000000000000000
cpuid rip = 000000000046F51F eax = 0000000000000001
cpuid rip = 0000000000524B67 eax = 0000000000000001

Последние 3 - динамические, при запуске ехе там пусто, но потом :

Code:
  1. 0046F50C | cpuid                                    
  2. 0046F50E | mov     dword ptr ss:[ebp - C], eax      
  3. 0046F511 | mov     dword ptr ss:[ebp - 18], ebx     
  4. 0046F514 | mov     dword ptr ss:[ebp - 14], edx     
  5. 0046F517 | mov     dword ptr ss:[ebp - 10], ecx     
  6. 0046F51A | mov     eax, 1                           
  7. 0046F51F | cpuid                                    
  8. 0046F521 | mov     dword ptr ss:[ebp - 4], edx      
  9. 0046F524 | mov     dword ptr ss:[ebp - 8], eax      
  10. 0046F527 | pop     ebx                              
  11. 0046F528 | test    dword ptr ss:[ebp - 4], 4000000  
  12. 0046F52F | je      akvu.46F53F                      
  13. 0046F531 | call    akvu.46F492                      
  14. 0046F536 | test    eax, eax                         
  15. 0046F538 | je      akvu.46F53F                      
  16. 0046F53A | xor     eax, eax                         
  17. 0046F53C | inc     eax                              
  18. 0046F53D | jmp     akvu.46F541                      


Code:
  1. 00524B67 | cpuid                                  
  2. 00524B69 | test    edx, esi                       
  3. 00524B6B | cmp     dh, E                          
  4. 00524B6E | cmc                                    
  5. 00524B6F | sub     ebp, C                         
  6. 00524B75 | mov     dword ptr ss:[ebp + C], eax    
  7. 00524B79 | mov     dword ptr ss:[ebp + 8], ebx    
  8. 00524B7D | adc     ebx, ebp                       
  9. 00524B7F | sbb     ebx, esi                       
  10. 00524B81 | mov     dword ptr ss:[ebp + 4], ecx    
  11. 00524B85 | sbb     ax, di                         
  12. 00524B88 | mov     dword ptr ss:[ebp], edx        
  13. 00524B8C | pop     ebx                            
  14. 00524B8D | and     ah, FB                         
  15. 00524B90 | btc     ax, FFFFFFE4                   
  16. 00524B95 | mov     eax, dword ptr ds:[esi]        
  17. 00524B97 | cmp     sp, 7C16                       
  18. 00524B9C | lea     esi, dword ptr ds:[esi + 4]    
  19. 00524BA2 | xor     eax, ebx                       
  20. 00524BA4 | cmp     bp, 4446                       
  21. 00524BA9 | test    sp, ax                         
  22. 00524BAC | bswap   eax                            
  23. 00524BAE | cmp     bp, 509C                       
  24. 00524BB3 | xor     eax, 79954FB4                  
  25. 00524BB8 | clc                                    
  26. 00524BB9 | jmp     akvu.5F0471                    


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

Создано: 16 февраля 2017 09:56 New!
Цитата · Личное сообщение · #11

oldman

Может оно от версии оси зависит. У меня нет столько вызовов.

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

Создано: 16 февраля 2017 11:13 · Поправил: v00doo New!
Цитата · Личное сообщение · #12

difexacaw, вот честно, сделай отдельную тему со своим "мотором", везде им все засрал, я понимаю, что ты тут всех переплюнешь, но пользы в теме "Декомпилятор ВМ" точно никакой, просто нулевая.
Vamit пишет:
Я уже устал говорить, что прот не детектит дебагер со Сциллой. Если код проги не поломан, то все эти rdtsc, cupid пошли нафиг, на них организована проверка целостности кода и антидампинг.


API же Vamit и сам выдернул все.
Ps Я тоже сейчас особо не несу никакой пользы, но хоть не спамлю, а молча сел ковыряться сам, у difexacaw же совсем другие интересы : рассказать какой клевый "мотор" и как все легко, а вы все устарели, тошнит уже, в каждой теме одно и тоже.

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



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

Создано: 16 февраля 2017 11:32 New!
Цитата · Личное сообщение · #13

v00doo

Не в моторе же суть. Очевидно что отладчика не достаточно, нужны есчо методы. И полезность не нулевая, вот в данный момент снимается статистика по каждой инструкции семпла, выложу как закончит обработку и если получится ужать дамп в разумный размер. Весьма полезная инфа.

Добавлено спустя -22 минут
--> Link <--

В архиве два дампа, секция с семпла и статистика(ужалось в 400k ). Снята для длительного цикла от аллокации памяти до DEADC0DE. Содержит для каждой инструкции счётчик исполнений и счётчик выборок данных из памяти(для каждого адреса). Осталось только как то вывести это на экран, гуй пильнуть.

Добавлено спустя -8 минут
Забыл сказать, можно взять инструкции с макс значением счётчика и выделить так основной цикл в коде и далее можно выделить сам код через граф. То что в 19.#12

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



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

Создано: 16 февраля 2017 13:01 New!
Цитата · Личное сообщение · #14

oldman пишет:
запущены под варей


вари ведь тоже разные бывают-пропатченные или нет.
так что сравнивать реакцию на cpuid и только - не совсем корректно.


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

Создано: 16 февраля 2017 13:38 New!
Цитата · Личное сообщение · #15

difexacaw
Ты думашь что эти 60Мб сырого кода будет кто-то смотреть? У меня после Свипера почти 100Мб получается, ну и что, нужен не полуфабрикат, а конечный результат - исходный код стартап секции прота.

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

Создано: 16 февраля 2017 14:00 · Поправил: oldman New!
Цитата · Личное сообщение · #16

r99 пишет:
вари ведь тоже разные


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

Если прямо так интересно, могу с нуля вообще без твиков виртуалку слепить.

---
ЗЫ. Во время запуска происходит ещё такой вызов апи:

Code:
  1. GetModuleHandleA ( "sbiedll.dll" )


Это оно походу Sandboxie так детектит


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

Создано: 16 февраля 2017 14:29 New!
Цитата · Личное сообщение · #17

oldman пишет:
Это оно походу Sandboxie так детектит


да, причем детект песочниц объединен в одной опции вместе с детектом виртуалок, что, прямо скажем, рукажопство.

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

Создано: 16 февраля 2017 15:00 New!
Цитата · Личное сообщение · #18

Gideon Vi, возможно это для хомяков, для которых что песочница, что ВМ одно и тоже.


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

Создано: 16 февраля 2017 16:46 New!
Цитата · Личное сообщение · #19

oldman пишет:
Гражданин навечно застрял в 32-битах

архитектура не принципиальна для обкатки, а без материала это всё теория.
сам по себе метод интересный.
oldman пишет:
и отвлекает товарища Vamita от работы на 64-битным вмпротом

не в упрёк Vamit, но как я понял, мотивация зависима от интереса к приложению, сам прот чисто как препятствие.
будет апп под х64, возможно будет и декомпиль.


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

Создано: 16 февраля 2017 22:25 · Поправил: difexacaw New!
Цитата · Личное сообщение · #20

Вот что юзается при запуске(без подмены результа cupid):

Code:
  1. NtQueryInformationProcess, ProcessDebugPort
  2. NtQueryInformationProcess, ProcessDebugObjectHandle
  3. NtSetInformationThread, ThreadHideFromDebugger
  4.  
  5. RDTSC Ip: 0x684647
  6.  
  7. NtCreateFile, akelpad.vmp.usermode.exe
  8. NtQueryInformationFile
  9. NtMapViewOfSection
  10. NtUnmapViewOfSection
  11. NtClose
  12. NtProtectVirtualMemory
  13. NtAllocateVirtualMemory
  14.  
  15. (wait)
  16.  
  17. -- 1.05G Ip's
  18.  
  19. NtClose, DEADC0DE
  20.  
  21. 008A273B popfd
  22. 008A273C rdtsc
  23. 008A273E nop           <- #DB
  24.  
  25. KiUED:
  26.  
  27. NtQueryInformationProcess, ProcessExecuteFlags
  28. NtQueryVirtualMemory, Ip: 0x69B868
  29. NtContinue Ip -> 0x0046FE08
  30.  
  31. CPUID 1, Ip: 0x895AD6
  32.  
  33. OpenSCM()
  34. EnumServiceStatusEx()
  35.  
  36. -- shadow..


Добавлено спустя -39 минут
Vamit

> У меня после Свипера почти 100Мб получается

Так ведь нужен общий метод что бы как то ориентироваться в таких огромных логах. Вот к примеру овер 1G инструкций, с чего начать подходить к этому. Учитывая что я даже не знаю что есть свипер".

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

Создано: 16 февраля 2017 23:04 New!
Цитата · Личное сообщение · #21

difexacaw пишет:
Учитывая что я даже не знаю что есть свипер".


имхо гражданин упорот, ибо так тролить.. ну нельзя просто

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


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

Создано: 16 февраля 2017 23:16 New!
Цитата · Личное сообщение · #22

oldman

Я не смотрел, так как мне не понравился пункт:

- точки входа в ВМ находятся вручную

Можно ради интереса подсчитать общее число инструкций(без повторений).


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

Создано: 17 февраля 2017 00:13 New!
Цитата · Личное сообщение · #23

difexacaw пишет:
Вот что юзается при запуске(без подмены результа cupid):

по результу прикольно, только гипервизор больше сигнатур детектит
difexacaw пишет:
- точки входа в ВМ находятся вручную

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


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

Создано: 17 февраля 2017 00:27 New!
Цитата · Личное сообщение · #24

Bronco

> по результу прикольно, только гипервизор больше сигнатур детектит

Возможно далее если скорректировать результ cpuid. Я это есчо не сделал. В данном случае больше cpuid нет.


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

Создано: 17 февраля 2017 00:56 · Поправил: DenCoder New!
Цитата · Личное сообщение · #25

difexacaw пишет:
точки входа в ВМ находятся вручную

они вообще-то легко сигнатурно детектятся.


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

Создано: 17 февраля 2017 02:01 · Поправил: difexacaw New!
Цитата · Личное сообщение · #26

Vamit

> У меня после Свипера почти 100Мб получается

Я тут подсчитал число повторений, не уверен что я ровно дамп сохранил, но пока получается следующее. При числе исполненных инструкций 780М, с учётом повторений число инструкций 5K.

Проверил, всё верно. 1.266G общее число инструкций., 1.05G это без учёта ветвлений. Всего инструкций без повторений ~11.6K

О каких стопицот мегабайтах шла речь хз, видимо сабж кривой, почените.

По данным стата(это делают те 11k инструкций):
Выборок из памяти(R/W) - 230.7M
Без повторений - 4М, но без учёта размера выбираемых данных.

Добавлено спустя 1 час 32 минуты
Пильнул парсер, что бы выделить адреса из дампа. Вот результ в аттаче.

В логе список адресов инструкций, которые выполняют сабжевый гигабайтный цикл. Это 8K кода, остальной(из 11к, удалил из лога) - вызов апи видимо в конце работы цикла.

Интересно было бы снять стату по записи в код. Так же можно конструктором выделить весь код и сдампить, ну что бы было наглядно, а то разбросан по всему модулю.

Следует заметить что данное решение выполнено автоматикой на основе статы, я даже в код поделки не смотрел

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

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



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

Создано: 18 февраля 2017 11:25 New!
Цитата · Личное сообщение · #27

Интересно было посмотреть что за код, захватил конструктором часть из дампа. Может кому интересно --> Link <--


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

Создано: 18 февраля 2017 11:46 New!
Цитата · Личное сообщение · #28

difexacaw
Может хватит уже в эту тему всякую хрень выкладывать. Тема для декомпиляции вм в общем, и по вмпроту в частности. От тебя же практически ни одного дельного поста по этой теме не было. Если обкатываешь свой хххвизор, то создай отдельную тему и пиши туда что захочешь. Зачем же здесь мусорить.

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



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

Создано: 18 февраля 2017 11:50 New!
Цитата · Личное сообщение · #29

Vamit

От вас для меня тоже в данной теме вообще ничего годного

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


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

Создано: 18 февраля 2017 13:34 · Поправил: Vamit New!
Цитата · Личное сообщение · #30

Всё что описано ниже относится к VmProtect v3
Нормальной декомпиляции функций ядра протектора мешают модифицированные пакетные вызовы виртуализованных функций.

Схема обычного пакетного вызова в основном идентична ранним версиям протектора:
Вызывающая функция (виртализованный код)
Code:
  1. - тело вызывающей функции
  2. - адрес возврата в стек (адрес реальной точки входа в вм)
  3. - контекст вм в стек
  4. - смена адреса пикода и переход на него (пакетный вызов)
  5.           - восстановление контекста из стека (точка 1)
  6.           - тело вызываемой функции
  7.           - выход из вм
  8. - вход в вм с адреса возврата
  9. - продолжение тела вызывающей функции

Реальная вызываемая функция
Code:
  1. - вход в вм с сохранением контекста (открытый код)
  2. - загрузка контекста в вм (здесь и далее виртуализованный код)
  3. - антидампинг
  4. - контекст вм в стек
  5. Точка 1, сюда идет пакетный вызов
  6. - восстановление контекста из стека
  7. - тело функции
  8. - выход из вм

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

Схема модифицированного пакетного вызова:
Вызывающая функция (виртализованный код)
Code:
  1. - тело вызывающей функции
  2. - адрес возврата в стек (адрес пикода)
  3. - контекст вм в стек
  4. - смена адреса пикода и переход на него (пакетный вызов)
  5.           - восстановление контекста из стека (точка 1)
  6.           - тело вызываемой функции
  7.           - простой переход со сменой адреса пикода на адрес возврата
  8. - продолжение тела вызывающей функции

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

А вот как девиртуализовать модифицированную пакетную функцию отдельно от вызывающей для меня пока загадка. Конечно есть одна мысль, сохранять состояние декомпилятора на точке 1 пакетного вызова, затем выходим из режима декомпиляции, загружаем в декомпилятор сохраненное состояние, чистим его на предмет данных, не относящихся к пакетной функции и стартуем декомпиляцию с точки 1, но тут большая трудоемкость реализации сохранений/восстановлений состояний декомпилятора. Намного проще другой путь - на точке 1 пакетного вызова производим выбор, что же декомпилить дальше, продолжать декомпиляцию вызывающей функции, оформив пакетный вызов как call xxx или декомпилить только пакетную функцию, предварительно почистив в декомпиляторе все данные не относящиеся к ней. Но эта реализация тоже не проста, как кажется...


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

Создано: 19 февраля 2017 01:47 New!
Цитата · Личное сообщение · #31

Что значит "пакетный вызов" ?
это передача управления на другой метод под виртой, с восстановлением контекста цпу, или другое?
адрес возрата уникален или меняется?
вопросов много, оссобено по терминам. требую новый словарь.
<< 1 ... 18 . 19 . 20 . 21 . 22 . 23 . 24 . >>
 eXeL@B —› Протекторы —› Декомпилятор ВМ

Видеокурс ВЗЛОМ