Python 垃圾代码生成器的输出是什么?

Python 垃圾代码生成器的输出是什么?,python,assembly,generator,Python,Assembly,Generator,我在大学里参加了一个关于分析恶意软件的项目组,我必须编写一个程序,生成垃圾代码,就像它曾经出现在恶意软件中一样,让逆向工程师更难分析它。 现在我没有编程那么长时间,所以我在启动时遇到了一些问题。我决定用python编写它,这是我开始接触这种语言的开始: ` ` 它只是发出一些随机的汇编命令。 现在,我的下一步是制作一个程序,生成随机数据,汇编代码由IDA Pro显示(在上面的示例中,它当然不起作用),然后作为最后一步,制作一个程序,生成垃圾代码,看起来像实函数,在IDA Pro中显示为函数,但没

我在大学里参加了一个关于分析恶意软件的项目组,我必须编写一个程序,生成垃圾代码,就像它曾经出现在恶意软件中一样,让逆向工程师更难分析它。 现在我没有编程那么长时间,所以我在启动时遇到了一些问题。我决定用python编写它,这是我开始接触这种语言的开始: `

`

它只是发出一些随机的汇编命令。 现在,我的下一步是制作一个程序,生成随机数据,汇编代码由IDA Pro显示(在上面的示例中,它当然不起作用),然后作为最后一步,制作一个程序,生成垃圾代码,看起来像实函数,在IDA Pro中显示为函数,但没有任何用处,因此函数什么也不做,这不会对您将它们放在其中的主代码产生任何影响

那么,我必须如何编写程序,或者我必须输出什么才能在IDA Pro中正确显示它呢?我需要创建操作码吗?我有点被困在这里,不知道如何继续下去。我希望我能够正确地解释我的问题。

您可以利用(disclamer:我编写了库)生成带有
at&t
语法的
x86-64
程序集

通过使用
contextmanager
或通过简单实例化创建
py_to_asm.asm
类的实例,可以创建
assembly
程序。通过使用
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
['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
您还可以实例化
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)
输出:

.data

.text
.globl _main
_main:
  pushq %rbp
  movq %rsp, %rbp
  subq $16, %rsp
  movl $2, %eax
  movl $5, %edx
  addl %edx, %eax
  leave
  ret
['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\u executable
现在是可执行文件的名称。

看起来您需要生成机器代码。我假设如果省略标签,您只会得到您要求的指令,而不是无用的
subq$16,%rsp
或RBP堆栈帧设置/拆卸,或
ret
?OP询问如何为外壳代码生成指令序列。不管怎么说,为什么它要在一个不涉及内存的函数中保留16字节的堆栈空间(除了
ret
本身和保存的RBP)Ty作为您的答案呢。我的程序的输出应该是一个.exe文件,我可以把它放在像IDA Pro这样的程序中,我现在怎么做呢?因为我需要在程序中显示汇编输出。那么如何才能将程序集输出添加到.exe文件中呢?