Метод и средства защиты исполняемого программного кода от динамического и статического анализа


Download 482 Kb.
bet19/20
Sana18.06.2023
Hajmi482 Kb.
#1555637
TuriРеферат
1   ...   12   13   14   15   16   17   18   19   20
Bog'liq
Аранов, Владислав Юрьевич

2. §•
Ф
5 О
X
х


Ф i !


ELF файл (*.о)


Не распарсеное промежуточное
представление в памяти ..


Ф


СС


о ш О


Анализ Х86 кода


Анализ Х64 кода


Дерево"промежуточного представления ]
(IR)J


Компиляция ВМ


IR-> Байт-код


COFF файл (*.obj)


Анализ ARM кода


Произвольные и
пользов. параметры





Байт код программы


i Интерпретация ВМ (IR)


Код BM(IR) + байт код


Кодогенерация инструкций Х8б ...


Кодогенерация
инструкций Х64
Не разобранное промежуточное
представление в памяти


Кодогенерация
инструкций ARM.


„ ... „ , „ . Защищенный COFF файл
Защищенный ELF файл ( .о) —


Рисунок 4.8 - Общая структура прототипа защиты


  1. Модуль захвата машинного кода


Для захвата машинного кода из объектных файлов представленных в форматах COFF и ELF использовалась свободно доступная библиотека LLVMObject входящая в состав пакета LLVM версии 3.0. Захват кода, связанных с ним данных и перемещаемых символов осуществляется в модуле obj ectloader.срр при помощи класса Obj ectLoader. При этом широко используются интерфейсы, методы и функции из пространства имен llvm::object. К сожалению, в существующем состоянии «из коробки» модуль LLVMObject был не способен корректно определять размеры символов в объектных файлов, поэтому в процессе работы над прототипом, в данную библиотеку были внесены исправления и расширения функциональности, позволившие использовать модифицированную версию в рамках данного проекта.

  1. Модуль создания выходного объектного модуля

К сожалению, не существует свободных библиотек позволяющих выполнять модификации объектных файлов, так, как это требовалось для данного проекта. Поэтому для реализации сохранения защищенного машинного кода в объектные файлы использовалась модифицированная библиотека objconv под авторством Agner Fog. К сожалению, лицензия под которой распространяется данная библиотека не позволяет использовать ее в коммерческих продуктах без публикации исходных кодов, поэтому для целей ОКР модули, ответственные за сохранение объектного кода, в частности, метод Save класса Obj ectLoader, были полностью переработаны.

  1. Описание интерфейса прототипа командной строки

Вне зависимости от используемой среды разработки (Microsoft Visual studio IDE, make files, CMake, scons и т.д.) разработчик имеет возможность напрямую влиять на процесс сборки приложения на всех его этапах: до компиляции модулей трансляции, перед осуществлением операции связывания отдельных модулей трансляции в исполняемый модуль и в конце, после получения исполняемого модуля. Единым модулем, к которому применяется защита, является объектный файл, порождаемый как результат трансляции исходного кода на языке высокого уровня при помощи компилятора.
Данный уровень работы механизма защиты позволяет удобным образом:
а) встраивать модуль защиты в существующий процесс сборки подлежащего защите пользовательского приложения при минимальной модификации стандартных , ' процедур сборки, , ' • t , ' ' >, ‘


117




б) динамически определять качество применения запутывающих преобразований к защищаемому коду при помощи опции «adebugPoison»
в) полностью контролировать все возможности защиты и иметь возможность их отключения/включения, как для ускорения работы защищаемого кода, так и для осуществления отладки самой системы защиты на этапе изготовления прототипа и разработки конечного продукта.
Картинка-подсказка, определяющая интерфейс командной строки:
VMGuardian CLI started
VMGuardian CLI parameters:
Basic options:
—help produce help message


General:
--iFName arg


--oFName arg
—funcName arg
—targetOs arg


Debug options:
—irdump
—vmirdump


Object file name function for protection will be taken
from
Object to put result to
Function name to protect
OS that target code will be executed on


Dump IR of translated function
Dump IR of VM interpreter


Protection options:
—sPetri Use Petri network obfuscation
—petriMaxNumTargets arg (=10) Maximum number of constants to replace with


—petriMinNumRounds arg (=5)
—slnsSwap
--sADebug
—adebugPoisonMin arg (=1)
--adebugPoisonMax arg (=10)
—adebugCallsAllowed
--adebugTimer arg
--adebugStraightChecks
—adebugCheckDist arg (=100)


calculated values
Minimum number of calculation rounds
Use instruction switch obfuscation
Anti-debugger obfuscation
Left border of random range for poison value
Right border of random range for poison value
Allow external calls in time-controlled blocks
Method used to measure code execution time
Add random straight debugger checks
Average number of instructions between
debugger checks


  1. Описание прототипа с графическим интерфейсом

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


117


118




объектный модуль для защиты должны быть выбраны при помощи графического манипулятора


ввода типа «мышь» или клавиатуры интерактивным образом.
На рРисунок 4.9 представлен основной интерфейс в котором можно выбрать целевую ОС, защищаемую функцию, а также исходный и целевой файлы для защиты. На рРисунок 4.10 можно


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


файлу.





Рисунок 4.9 - Общие настройки прототипа с графическим интерфейсом


118


119







Рисунок 4.10 - Настройки защиты


Интерфейс на ОС Linux аналогичен интерфейсу под ОС Windows с незначительными модификациями косметического толка. Образец интерфейса под ОС Linux можно наблюдать на рРисунок 4.11. Данного результата удалось достигнуть благодаря использованию кроссплатформенной библиотеки (языка) QT.


119


120







Рисунок 4.11- Вид интерфейса под ОС Linux


120


I


121 ,


  1. Набор инструкций конкретной виртуальной машины

Рассмотрим набор инструкций, построенный для конкретной виртуальной машины генератором виртуальных машин. Он состоит из функционально — полного набора инструкций и тех инструкций, которыми мы его дополнили, чтобы их общее количество стало равным 200.
Расшифровка обозначений приводится в п. 2.2.
Функционально - полный набор инструкций

  1. xor8ir i_imm, o_reg

  2. notl6rio_reg

  3. and80mm i_mem, o_mem

  4. addl6im i_imm, o_mem

  5. mul64im iimm, o_mcm

  6. div32mrs i_mem, ojreg

  7. div64rru i_reg, o_reg

  8. mov32rr i_reg, o_reg

  9. mov32mr i_mem, o_reg

  10. mov 16br i_brg, o_reg

  11. mov 16ir i Jmm, o reg

  12. mov32rm i_reg, o_mem

  13. mov8bm i_brg, o_mem

  14. mov64mm i_mcm, o mern

  15. mov32im i_imm, omem

  16. mov 16rb i_reg, o_brg

  17. mov 16ib iimm, o_brg

  18. mov32mb i_mem, o_brg

  19. mov64bb i_brg, o_brg

  20. cmpl6rs32rs o_reg, i_reg

  21. j le3 2rr_abs i_reg, j_reg

  22. ja32bb_rel i_brg, j_brg

  23. jge32mr_abs i_mem, j_reg

  24. jb32rr_rel i_reg, j_reg

  25. jne32mr_abs i_mem, j_reg

  26. j e3 2br_rel i_brg, j_reg


121


122




  1. shr32rm i_reg, sh_mem

  2. shll6mr ijmem, sh_reg

  3. load 16_8 reg, imm

  4. store80_32 reg, imm


Используя первые три команды можно выразить все логические операций с произвольными типами, размерами и количеством операндов.
Инструкции 4-7 представляют функционально полный набор арифметических операций.
Инструкция 8-19 предоставляют функционально полный набор команд пересылки данных, благодаря которому можно не заботиться о типах операндов для других инструкций. Действительно, используя эти инструкции можно преобразовать типы операндов к тем, для которых есть соответствующая инструкция в построенном наборе.
Набор инструкций 20 - 26 является функционально полным набором для выражения всех команд перехода.
Инструкции 27 - 28 - набор позволяющий осуществлять побитовые сдвиги, в том числе и циклические.
И, наконец, 29 - 30 - инструкции для работы со стеком.
Таким образом, сформирован полный набор инструкций, достаточный для выполнения любой функции, не вызывающей другие функции (нет инструкции вызова процедур call).
Затем, этот набор пополняется до 200 инструкций.

  1. jle32im i_imm, j_mem rel

  2. add32rrr i_reg, i_reg, o_reg

  3. xor64irr i_imm, i_reg, o_reg

  4. or80rm i_reg, o jnem

  5. sub80ir i_imm, o_reg

  6. xor8br i_brg, o_reg

  7. div8ir i_imm, o_reg

  8. mul8ir i_imm, o_reg

  9. and8im i_imm, o_mem

  10. andl6ib i_imm, o_brg

  11. mov64ir i_imm, o_reg

  12. jl32mi i_mem, j_imm abs

  13. ja32rr i_reg, j_reg abs

  14. sub32mr i_mem, o_reg


122


123




  1. j 132ii i_imm, j_imm abs

  2. j e3 2mm i_mem, j_mem rel

  3. je32im i_imm, j_mem rel

  4. or80bb i_brg, o_brg

  5. jg32br i_brg, j_reg rel

  6. subsigned8ir i_imm, o_reg

  7. jae32rm i_reg, j_mem abs

  8. je32bi i_brg, j_imm abs

  9. shl8ir i_imm, sh_reg

  10. xor8rr i_reg, o_reg

  11. subsigned32mr i_mem, o_reg

  12. or32ib i_imm, o_brg

  13. sub8mb i_mem, o_brg

  14. jge32ir i_imm, j_reg abs

  15. jl32mm i_mem, j_mem abs

  16. jne32rr i_reg, j_reg reg

  17. and32bb i_brg, o_brg

  18. sub80bb i_brg, o_brg

  19. mul80im i_imm, ojnem

  20. jbe32mr i__mem, j_reg rel

  21. add8ib i_imm, o_brg

  22. j ae32ii i_imm, j_imm abs

  23. ja32mr i_mem, j_reg abs

  24. addSigned8rr i_reg, o_reg

  25. mov8ir i_imm, oreg

  26. add8im i_imm, ojnem

  27. subunsigned32im i_imm, ojnem

  28. mulSigned8mr i_mem, o_reg

  29. and32bm i_brg, o_mem

  30. orl6br i_brg, o_reg

  31. andl6br i_brg, o_reg

  32. jae32bm i_brg, j_mem rel

  33. jge32mm i_mem, j_mem abs

  34. jg32bm i_brg, j_mem abs


123


124




  1. shr 16ir sh_reg

  2. sub64br i_brg, o_reg

  3. subsigned80mm i_mem, o_mem

  4. mul8rm i_reg, o_mem

  5. subsigned32ir o_reg

  6. jg32mm i_mem, j_mem reg

  7. rol8mr i_mem, sh_reg

  8. xor80mm i_mem, o_mem

  9. jne32bi i_brg, j_imm abs

  10. xor32br i_brg, o_reg

  11. subsigned8rm i_reg, o_mem

  12. jle32br i_brg, j_reg abs

  13. jle32ir i_imm, j_reg abs

  14. div8im o_mem

  15. jle32mm i_mcm, j_mem abs

  16. jae32rr i_reg, j_reg rel

  17. rol64rm i_reg, sh_mem

  18. jl32im i_imm, j_mem abs

  19. jb32bi i_brg, j_imm abs

  20. jne32mm i_mem, jmem abs

  21. jne32im j_mem abs

  22. subunsigned32rr i_reg, o_reg

  23. jb32bm i_brg, j_mem abs

  24. jge32ri i_reg, j_imm abs

  25. jge32im iimm, j_mem abs

  26. shr 16mm i_mem, sh_mcm

  27. ror8mm i_mem, sh_mem

  28. mulSigned8rm i_reg, ojnem

  29. jb32rr i_reg, j_reg abs

  30. shr32rr i_reg, sh_reg

  31. subsigned32im i_imm, omem

  32. and8mm i_mem, ojnem

  33. and 16rr i_reg, o_reg

  34. divSignedl6mr i_mem, o_reg


124


125




  1. xor8mb o_brg

  2. rol64mr i_mem, sh_reg

  3. add8bb i_brg, o_brg

  4. divSignedl 6ir i_imm, o_reg

  5. or8rr i_reg, o_reg

  6. jae32bi i_brg, j_imm abs

  7. jg32ir j_reg abs

  8. ror8rm i_reg, sh_mem

  9. subsigned80im i_imm. ojnem

  10. div8mr i_mem, o_reg

  11. ro!32rr i_reg, shjeg

  12. subsigned8mr i_mem, o_reg

  13. sub80br i_brg, o_reg

  14. subunsigned8rr i_reg, o_reg

  15. shr64rm i_jeg, sh_mem

  16. subsigned32rm i_reg, ojnem

  17. jl32bi i_brg, j_imm abs

  18. jne32ii i_imm, jimm abs

  19. subsigned64mr i_mem, o_reg

  20. mov32ib i_imm, o_brg

  21. subSigned8mr i_mem, o_reg

  22. mov32ir i_imm, o_reg

  23. divSigned8im i_imm, ojnem

  24. jbe32br i_brg, j_jeg absadd32mb i_mem, o_brg

  25. mov80rb i_reg, o_brg

  26. jle32mi i_mem, jimm abs

  27. div8rr i_reg, o_reg

  28. mulSigned8mm i_mem, ojnem

  29. subsigned 16im i_imm, ojnem

  30. add8mb i_mem, o_brg

  31. jle32bi i_brg, j_imm abs

  32. or80im i_imm, ojnem

  33. rol 16rr i_reg, sh_reg

  34. rol32rm i_reg, sh_mem


125


126




  1. subsigned8im i_imm, o_mem

  2. and8mr i_mem, o_reg

  3. subunsigned32ir i_imm, o_reg

  4. jne32bm i_brg, j_mem rel

  5. jle32ii i_imm, j_imm ab

  6. addSigned8ir o_re

  7. xor32ib i_imm, o_brg

  8. and8 ib o_brg

  9. ror64rr i_reg, sh_reg

  10. sub80rr i_reg, o_reg

  11. mul 8mm i_mem, o_mem

  12. shr64mr sh_reg

  13. mul80ir iimm, o reg

  14. subunsigned8rm i_reg, o_mem

  15. j ae3 2mm i_mem, j_mem rel

  16. jb32ii i__imm, j_imm abs

  17. shl64mr ijmem, sh_reg

  18. ja32bi i_brg, jimm abs

  19. shr64mm i_mem, sh_mem

  20. xor80rm i_reg, o_mem

  21. xor8bm i_brg, o_mem

  22. mulSignedl6im i_imm, o_mem

  23. or32br i_brg, o_reg

  24. shr8rm i reg, sh_mem

  25. shr64rr i_reg, sh_reg

  26. subsigned80mr i_mem, o_reg

  27. sub8im i_imm, ojnem

  28. mul 16rm i_reg, o_mem

  29. jbe32rm i_reg, j_mem abs

  30. sub32ib i_imm, o_brg

  31. subunsigned8ir i_imm, o_reg

  32. jge32rm i_reg, j_mem abs

  33. andSOir i_imm, o_reg

  34. div32rm i_reg, ojnem


126


127




  1. mul8rr i_reg, o_reg

  2. jle32rm i_reg, j_mem abs

  3. jl32rm i_reg, j_mem abs

  4. and80im i_imm, o__mem

  5. jle32im i_imm, j_mem abs

  6. jae32bi i_brg, j_imm rel

  7. jbe32ri i_reg, j_imm rel

  8. subunsigned64mr i_mem, o_reg

  9. jb32rm i_reg, j_mem rel

  10. ja32im i_imm, j_mem rel

  11. jb32mi i_mem, j_imm abs

  12. jg32rm i_reg, j_mem abs

  13. add80br i_brg, o_reg

  14. subsigned64im iimm, o_mem

  15. ja32bm i_brg, j_mem abs

  16. subunsigned 16im o_mcm

  17. jbe32ir j_reg rel

  18. jne32ii j_imm rel

  19. jbe32rr i_reg, j_reg abs

  20. jb32ri i_reg, jimm abs


127


128





Download 482 Kb.

Do'stlaringiz bilan baham:
1   ...   12   13   14   15   16   17   18   19   20




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling