【发布时间】:2014-02-24 14:05:06
【问题描述】:
我想编写一个能够修改自身代码段的程序。例如考虑这个汇编代码:
原始代码:
i1: mov eax,0
i2: mov eax,0X01
我希望在运行时由相同的代码生成的代码:
i1: mov eax,0
i": // some modifing instructions that when are excuted they change the i2 and/or add or remove some instruction such i3
i2: jmp 0x32
i3: mov ebx,0x67
您会看到 i2 在执行指令 i" 后发生了变化。 i" 有义务修改其转发代码指令。
现在我的问题是:
- 如何修改代码段?或者如何寻址代码段 内存区?
- 我们是否允许从相同的代码段进行修改 (不是它无法访问的其他程序)?
- 如何解决因代码段大小变化引起的问题?
- 最后一个问题可能是杀毒软件!它们在运行时检查程序的行为,并且对自我修改很敏感。
谢谢我的朋友们。
【问题讨论】:
-
1) 写入内存。 2)也许。 3) 难,最好先留出空间(插入慷慨的nops)。 4)确认。
-
请添加相关细节(操作系统、CPU)——这表明工作量很小。
-
嗨。有一个很好的深度学习指南,位于:ic.unicamp.br/~pannain/mc404/aulas/pdfs/…。第 136 页的第 3.6.7 章应该对您有所帮助。 5年前我就这样做了。
-
实际上我们想要执行一个自修改程序,它会修改其执行代码。 CPU 或操作系统细节无关紧要,因为我们只需要修改代码即可。例如复制代码中的特定指令。
-
如果你没有空间,这真的很棘手,因为普通代码使用硬编码的地址和跳转目标。您可以划分出更大的代码部分并将其移至其他位置,但对其进行解析以查看是否需要修复,然后通过跳转到您自己的代码来填补漏洞,该代码执行其操作,然后执行移出的原始代码,然后跳回来。这完全取决于您想要投入多少工作以及您需要执行的黑客攻击有多邪恶。如果它是你自己的代码,那么你应该只是重新编译它,并有间隙。