Какой вывод для генератора мусорного кода? - PullRequest
0 голосов
/ 08 сентября 2018

Я нахожусь в группе по анализу вредоносных программ в моем университете, и мне нужно написать программу, которая генерирует код мусора, подобный тому, который использовался для обнаружения вредоносных программ, чтобы сделать его более трудным для анализа его обратными инженерами. Сейчас я так долго не программирую, поэтому у меня возникли проблемы с его запуском. Я решил написать это на python, и я начинаю изучать язык: `

import random
assem_dic = {1:"mov", 2: "push", 3: "add", 4: "call", 5: "xor", 6: "cmp", 7: 
"jmp", 8: "and", 9: "or"} #Assembler-Commands
var_dic = {"mov": 2, "push": 1, "add": 2, "call": 0, "xor": 2, "cmp": 2, 
"jmp": 0, "and": 2, "or": 2} #Number of Inputs for Commands
gpreg_dic = {1: "eax", 2: "ebx", 3: "ecx", 4: "edx"} #General-Purpose- 
                                                      Register
func_dic = {1: "func()", 2: "func2()", 3: "func3()"}

f=open("garbage.txt", "w+")
f.write("Garbage-Code: \n")
for n in range(10):
    assem = random.randint(1,9)
    print(assem_dic[assem], " ", end="", sep="")   #Picking random command
    f.write(assem_dic[assem]+ " ")
    var = var_dic[assem_dic[assem]]  #Checking how much input the command 
                                      needs
    if(var == 1):
        print(random.randint(0,10))
        f.write(str(random.randint(0,10))+ "\n")
    elif(var == 2):
        print(gpreg_dic[random.randint(1,4)], ",", end="", sep="" )
        f.write(gpreg_dic[random.randint(1,4)]+",")
        print(random.randint(1,10))
        f.write(str(random.randint(1,10))+"\n")
    else:
        print(func_dic[random.randint(1,3)])
        f.write(func_dic[random.randint(1,3)]+"\n")
f.close()

`

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

Так как мне написать программу или что мне нужно вывести, чтобы она правильно отображалась в IDA Pro? Нужно ли мне создавать код операции? Я немного застрял здесь и не знаю, как дальше. Я надеюсь, что смог правильно объяснить свою проблему.

1 Ответ

0 голосов
/ 08 сентября 2018

Вы можете использовать py_to_asm (отказ от ответственности: я написал библиотеку) для генерации x86-64 сборки с синтаксисом at&t.

Вы можете создавать assembly программы, создавая экземпляр класса py_to_asm.Asm с contextmanager или с помощью простого создания экземпляра. Используя contextmanager, можно создать метку main:

import py_to_asm

with py_to_asm.Asm(_label_name = '_main', is_main=True) as asm: #assembly to add two values
   asm.mov(asm.register.EAX, asm.integer(2))
   asm.mov(asm.register.EDX, asm.integer(5))
   asm.add(asm.register.EAX, asm.register.EDX)

print(asm)

Выход:

.data

.text
.globl _main
_main:
  pushq %rbp
  movq %rsp, %rbp
  subq $16, %rsp
  movl $2, %eax
  movl $5, %edx
  addl %edx, %eax
  leave
  ret

Вы также можете создать экземпляр класса py_to_asm.Asm просто для создания переменных, регистров и значений:

_asm = py_to_asm.Asm()
all_registers = _asm.register.__class__.registers
register_storage = _asm.register.EAX.__class__.converter
eax = _asm.register.EAX
edx = _asm.register.EDX
val = _asm.integer(2)
print(all_registers)
print(register_storage)
print(eax, edx, val)

Выход:

['RAX', 'RCX', 'RDX', 'RBX', 'RSP', 'RBP', 'RSI', 'RDI', 'EAX', 'ECX', 'EDX', 'EBX', 'ESP', 'EBP', 'ESI', 'EDI', 'AX', 'CX', 'DX', 'BX', 'SP', 'BP', 'SI', 'DI', 'AH', 'AL', 'CH', 'CL', 'DH', 'DL', 'BH', 'BL']
{'RAX': 64, 'RCX': 64, 'RDX': 64, 'RBX': 64, 'RSP': 64, 'RBP': 64, 'RSI': 64, 'RDI': 64, 'EAX': 32, 'ECX': 32, 'EDX': 32, 'EBX': 32, 'ESP': 32, 'EBP': 32, 'ESI': 32, 'EDI': 32, 'AX': 16, 'CX': 16, 'DX': 16, 'BX': 16, 'SP': 16, 'BP': 16, 'SI': 16, 'DI': 16, 'AH': 8, 'AL': 8, 'CH': 8, 'CL': 8, 'DH': 8, 'DL': 8, 'BH': 8, 'BL': 8}
%eax %edx $2

Чтобы создать исполняемый файл из сгенерированной сборки, сначала запишите сгенерированное содержимое в файл:

with asm.write('garbage_code.s'):
  pass

Затем в терминале / командной строке запустите:

gcc garbage_code.s -o garbage_executable

garbage_executable теперь имя исполняемого файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...