PE_Kill

PE_Kill

Мудрец
Сообщения
135
Реакции
825
Закончил писать анализатор структур 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

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

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