【问题标题】:how do i get executable code from my source code cpp?如何从我的源代码 cpp 中获取可执行代码?
【发布时间】:2021-10-26 15:41:51
【问题描述】:

我在 youtube 上观看了一些视频,其中 CPP 或 c# 代码的字节被硬编码为 un​​signed char*,然后被注入内存并执行。

如何使用我的源代码做到这一点?我只找到了一种从 exe 注入字节的方法,方法有点复杂,这在执行时给我带来了一些问题。

我还发现这个页面,他们使用某种渗透测试工具生成可执行代码(字节),可以简单地注入内存。

https://www.ired.team/offensive-security/code-execution/using-msbuild-to-execute-shellcode-in-c

【问题讨论】:

  • char * code=...; goto code。但是你必须告诉你的操作系统包含code的页面可以执行里面的指令。
  • 您通常以正常方式获取可执行代码;你编译它。或者,编写汇编代码并手动翻译成 1950 年代的机器代码。
  • @Quimby -- code 不是标签;它不能是goto 语句的目标。
  • 我知道如何将字节注入内存,但是您不能只从编译的 exe 中运行代码,您需要添加标头等。但在链接中的示例中,他们只是注入字节并且它工作得很好。
  • @Quimby -- 嗯,是的,但是内联汇编不是可移植的 C++; asm 关键字没有语义。所以无论你尝试什么,你都会进入编译器特定的东西。

标签: c++ memory portable-executable


【解决方案1】:

简而言之:放弃,直到你对汇编语言有足够的了解以弹出汇编代码。执行代码的盲目复制将不起作用。


C++ 或 C# 编译产生的机器代码:

  1. 可能包含外部引用。一个函数可以调用其他函数,使用全局变量等。即使你没有明确地这样做,语言也可以调用它的运行时。在程序加载时,通过将所有静态导入的对象都放入可执行文件并加载动态导入的模块来解决此问题。
  2. 不一定与位置无关。也就是说,它在另一个内存位置可能表现不佳。它可能包含应调整的对自身的绝对引用,或也应调整的相对外部引用。在程序加载时,这通过处理重定位表来解决。
  3. 其实是1的具体情况,但可以单独查看。 Executable except from code 和 data 包含一些代码注释,最值得注意的是异常处理程序。如果没有异常处理程序,它也可能无法按预期执行。

也就是说,可执行文件的任意复制字节可能会或可能不会在其他位置工作。如果你试图复制整个程序,很可能它不会工作。

对于像注入代码这样的技巧,可以使用汇编或机器代码,而不是高级语言。对不起。


通过从 VS 编译 C++ 代码为您的指令获取机器代码:

  • 调试期间 - 将地址从反汇编窗口复制或拖放到内存窗口。
  • 编译期间 - 使用/FAc option

【讨论】:

  • 我知道,我想这就是他们使用的。汇编机器代码,如“0x09 等”。但是我怎样才能从我的源代码中获取汇编代码。 VS 有汇编调试器,但它是“aex 等”格式。
  • @anasouardini5,将此添加到我的答案中
  • 谢谢,但是我在哪里设置中断点我将它设置在 int main() 但似乎在该地址之上发生了很多事情。我以为我会搜索“此程序无法在dos中运行”并找到第一个地址,但不幸的是,您无法在地址窗口中进行搜索。你在哪里设置选项 /FAc 选项我正在使用 VS GUI 是与终端一起使用的东西吗?
  • 阅读该链接,它也包含有关 IDE 选项的信息docs.microsoft.com/en-us/cpp/build/reference/…
  • MS-DOS stub 更可能远离 PE 的代码部分,而不是靠近 main
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多