PE_Kill

PE_Kill

Мудрец
Сообщения
178
Реакции
891
Закончил писать анализатор структур x86 VM. Получилось 1700 строк грязного кода. Надо теперь придумать архитектуру и причесать. Проверил на всех доступных версиях аспра, всё отлично распознается. Интересно наблюдать по логам как усложнялась VM.
В версии 2.3 еще работали с оригинальными опкодами, но вместо
Код:
if (OpCode and $0F < 4)
сделали
if (IsBitPresent(InstBits, 1))
Т.е. вместо обработки опкода, сделали битовую маску, куда вписывали заранее проверенное условие.

Зато вторая VM (часть основной) видна в первозданном виде. Даже можно увидеть как называются структуры, ибо сыпет ошибками типа:
masm:
cmp bl, 4
je @Next
push 0
push "Error"
push "ActionType unknown"
push 0
call MessageBoxA
В 2.4 уже начали шифровать опкоды, а во второй VM шифровать типы операций. Ошибки стали однотипные
masm:
push "104"
call ProtectionError
В 2.5-2.6 уже всё что можно стали шифровать, структуры мутировать и прочее прочее.

Еще интересно, что восстановив исходный код VM обнаружил, что старые декомпиляторы работали неправильно. (Если что на паблик я их не выкладывал).
Оказалось, что во второй VM эмулируются cmp, add, sub и mov
А я думал, что только add, sub и mov

Ибо когда смотришь асм листинг, напичканый константами и битовыми операциями, достаточно сложно понять основную логику. А когда восстановил код:
Код:
if (pInstCur.InstType = 5) or (pInstCur.InstType = 8) then
      asm
        push eax
        mov eax, Op1Data
        push EFlags
        popfd
        sub eax, Op2Data
        pushfd
        pop EFlags
        mov Op1Data, eax
        pop eax
      end;
***
if (pInstCur.InstType <> 5) then
begin
  // Save results
end;
Тут то глаз и зацепился. Почему при типе 5 и 8 происходит вычитание, но только при типе 8 результат сохраняется. При типе 5 получается только EFlags меняется. А что такое cmp? А это sub и есть только операнды остаются неизменными.

В общем то, что требовало работу мозга закончено, осталась рутина. Непосредственно декомпиль, там уже ничего интересного просто время.
 

styx

Финалисты турниров
Новичок
Сообщения
27
Реакции
13
@PE_Kill, на скрине Entrys, подозреваю, что опечатка и быть должно Entries
 

PE_Kill

Мудрец
Сообщения
178
Реакции
891
@PE_Kill, на скрине Entrys, подозреваю, что опечатка и быть должно Entries
Мне было интересно, кто то заметит или нет. Ты выиграл :) Это не опечатка, это неграмотность моя в 2010 году. А сейчас решил не исправлять, типа для истории, хоть мне и режет глаз.

Там очень неоптимально написана работа с VM структурами, за каждым байтом делается запрос ReadProcessMemory. Вот если решусь оптимизировать то и поправлю тексты.
 

PE_Kill

Мудрец
Сообщения
178
Реакции
891
Пишу алго расчета хешей оптимизированные под конкретную задачу. Например MD5 от 4 байт вообще не требует работы с входным буфером, достаточно констант в 3 регистрах, что снижает латентность. Но вот беда, все алгосы давно оптимизированы. Каждый в свое время под то, что было тогда. Циклы развернуты (дабы проц не угадывал ветвления), ROTы проэмулены, если не поддерживает CPU. А в некоторых такая каша из инструкций BMI2 и AVX что там вообще с ума сойти можно.

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

В общем поковыряв сорсы популярных криптолиб, волосы шевелятся от зоопарка внутри. Вроде всё началось с ассемблера, потом ушло в языки высокого уровня, аотом ассемблерные вставки, потом интринсики и вот пришли снова к ассемблерным листингам. Особенно если смотреть ARM версии алгосов, то доходит до того что там байткод генерят типа
db xx,xx,xx,xx
db xx,xx,xx,xx,xx,xx

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

PE_Kill

Мудрец
Сообщения
178
Реакции
891
Возможно это было сделано для того, чтобы компилятор не "оптимизировал" код?
нет, это в репах Go Lang там ARM и AVX недавно завезли, до этого извращались байткодом, даже компиляторы понаписать успели.
 
Верх Низ