c++ - Visual C++ 在函数末尾附加 0xCC (int3) 字节

标签 c++ windows assembly visual-c++ machine-code

这是我第一次来,我真的希望你们能帮助我,因为我现在已经没有想法了。

我已经搜索了几个小时的答案,但找不到真正有效的答案。

我想直接将代码注入(inject)到正在运行的进程中。是的,你没看错。我正在尝试将代码注入(inject)另一个应用程序,并且 - 不管你信不信 - 这只是为了扩展它的功能。

我在 Windows 上使用 Visual Studio 2012 Express Edition。

我有以下代码:

__declspec(naked) void Foo()
{
    __asm
    {
        // Inline assembly code here
    }
}
__declspec(naked) void FooEnd() {}

int main()
{
    cout << HEX(Foo) << endl;
    cout << HEX(FooEnd) <<  endl;
    cout << (int)FooEnd - (int)Foo << endl;

    // Inject code here using WriteProcessMemory

    return 0;
}

为了保持可读性,大部分代码已被删除,但我可以根据要求发布它的其他部分。

输出如下:

0x010B1000
0x010B1010
16

结果大小实际上是不正确的。这些函数以正确的顺序编译(确保使用/ORDER),但是编译器在每个扩展它的大小的方法之后添加了一堆 0xCC(int 3)字节,所以我无法获得真实的(有用的)数字包含实际可执行代码的字节数。

在另一个 stackoverflow 问题中,据说禁用“编辑并继续”会使这些额外的字节消失,但无论如何,这对我不起作用。

我也尝试过使用 Release 设置而不是 Debug,更改了一堆优化设置,但这些都没有任何效果。您认为可能的解决方案是什么?我可能遗漏了一些明显的东西。

无论如何,这(在您看来)是获取函数长度(可读性、可靠性、易用性)的最佳方式吗?

我希望我解释了我必须解释的一切,以便您能够提供帮助。如果您还有其他问题,请随时发表评论。

感谢您的时间和努力。

最佳答案

正如 Devolus 指出的那样,编译器在您的代码之后插入这些额外的字节,以便将下一个函数对齐到合理的(通常可以被 16 整除)起始地址。

由于 0xCC 是断点指令,编译器实际上是在尝试帮助您,如果指令指针在执行期间的任何时候意外指向函数外部,代码将进入调试器(如果已附加)。

为了您的目的,这些都不应该让您担心。您可以将 0xCC 填充视为函数的一部分。

关于c++ - Visual C++ 在函数末尾附加 0xCC (int3) 字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18090317/

相关文章:

c++ - 如何使用 'C' 或 'C++' 创建独立的 Windows 程序或应用程序

iphone - 是否可以使用 C/C++ 在 Windows 上开发(而非分发)iPhone 应用程序?

assembly - 高效三值比较

c++ - 空间如何分配 char* 数组?

c++ - epoll等待修改文件描述符集

c# - 编写 Windows 桌面应用程序 (.exe) - 这听起来对吗?

c++ - Windows 8 : Application is not able write to C:\ProgramData\

c++ - 为什么这个内联汇编中的 ror op 不能正常工作?

c - 如何在x86实模式ISR中将数据存储到全局变量中?

c++ - 当类型是未知模板参数时使用原始指针