Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ visualc&x2B+;在函数末尾追加0xCC(int3)字节_C++_Windows_Assembly_Visual C++_Machine Code - Fatal编程技术网

C++ visualc&x2B+;在函数末尾追加0xCC(int3)字节

C++ visualc&x2B+;在函数末尾追加0xCC(int3)字节,c++,windows,assembly,visual-c++,machine-code,C++,Windows,Assembly,Visual C++,Machine Code,这是我第一次来这里,我真的希望你们能帮助我,因为我现在已经没有想法了 我已经寻找了几个小时的答案,但找不到一个实际可行的答案 我想直接将代码注入正在运行的进程。是的,你读对了。我试图将代码注入到另一个应用程序中,信不信由你,这只是为了扩展它的功能 我正在Windows上使用Visual Studio 2012快速版 我有以下代码: __declspec(naked) void Foo() { __asm { // Inline assembly code here

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

我已经寻找了几个小时的答案,但找不到一个实际可行的答案

我想直接将代码注入正在运行的进程。是的,你读对了。我试图将代码注入到另一个应用程序中,信不信由你,这只是为了扩展它的功能

我正在Windows上使用Visual Studio 2012快速版

我有以下代码:

__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;
}
结果的大小实际上是不正确的。函数是按正确的顺序编译的(确保使用/order),但是编译器在每个扩展其大小的方法之后添加了一堆0xCC(int 3)字节,因此我无法获得包含实际可执行代码的实际(有用)字节数

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

我还尝试使用发布设置而不是调试,更改了一系列优化设置,但这些都没有任何效果。你认为解决办法是什么?我可能遗漏了一些明显的东西

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

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


感谢您的时间和努力。

额外的字节由编译器插入以创建内存对齐,因此您不能放弃它,因为您正在使用下一个函数作为标记


另一方面,由于您无论如何都是在汇编中编写注入的代码,因此您也可以编写代码,编译它,然后将二进制形式放入字节数组中。我就是这样做的,因为这样你就有了确切的长度。

额外的字节由编译器插入以创建内存对齐,因此你不能放弃它,因为你正在使用下一个函数作为标记


另一方面,由于您无论如何都是在汇编中编写注入的代码,因此您也可以编写代码,编译它,然后将二进制形式放入字节数组中。我就是这样做的,因为这样就有了确切的长度。

注入代码时,不需要额外的填充,所以可以丢弃它们。复制它们也可以,这只会导致额外的几个字节的复制。很有可能你正在通过一个页面对齐的块注入到will的内存中,所以剥离它并不能真正获得任何东西

但是如果你真的想把它去掉,解决问题的一个简单方法就是从下一个函数之前的最后一个字节向后迭代,直到没有更多的0xcc字节

i、 e:

\uuu declspec(裸)void Foo()
{
__asm
{
_发出0x4A
_发出0x4B
}
}
__declspec(裸)void FooEnd(){}
int main(int argc,字符**argv)
{
//从内存对齐代码的最后一个字节开始,而不是从FooEnd的第一个字节开始
unsigned char*boolast=(unsigned char*)FooEnd-1;
//继续后退,直到没有0xcc
while(*whoolast==0xCC)
傻瓜——;
//现在,doublast将指向函数的最后一个字节,因此需要添加1
int-length=((int)boolast-(int)Foo)+1;
//应该为Foo的长度输出2

std::cout在注入代码时不需要额外的填充,因此丢弃它们也可以。复制它们也可以,这只会导致额外的几个字节的复制。注入的内存很可能会被一个页面对齐的块占用,因此剥离它并不能真正获得任何东西

但是如果你真的想把它去掉,解决问题的一个简单方法就是从下一个函数之前的最后一个字节向后迭代,直到没有更多的0xcc字节

i、 e:

\uuu declspec(裸)void Foo()
{
__asm
{
_发出0x4A
_发出0x4B
}
}
__declspec(裸)void FooEnd(){}
int main(int argc,字符**argv)
{
//从内存对齐代码的最后一个字节开始,而不是从FooEnd的第一个字节开始
unsigned char*boolast=(unsigned char*)FooEnd-1;
//继续后退,直到没有0xcc
while(*whoolast==0xCC)
傻瓜——;
//现在,doublast将指向函数的最后一个字节,因此需要添加1
int-length=((int)boolast-(int)Foo)+1;
//应该为Foo的长度输出2

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

编译器实际上是在帮助您,因为0xCC是断点指令,如果指令指针在执行过程中的任何时候意外指向函数外部,代码将进入调试器(如果已连接)


<> P>这不应该为你的目的担心你。你可以考虑0xCC填充作为函数的一部分。

< P>正如Devolus指出的,编译器在你的代码之后插入这些额外的字节,以便使下一个函数在合理的(通常可分为16)的起始地址上对齐。

编译器实际上是在帮助您,因为0xCC是断点指令,如果指令指针在执行过程中的任何时候意外指向函数外部,代码将进入调试器(如果已连接)


<> P>这一切都不应该为你的目的担心。你可以考虑0xCC填充作为函数的一部分。

@ Davoul,但其他人使用完全相同的方法。这真的是我不能自定义的吗?其他编译器(你知道的)这样做吗?我曾经注入字节数组,但那是一个LO。
0x010B1000
0x010B1010
16
__declspec(naked) void Foo()
{
   __asm
   {
      _emit 0x4A
      _emit 0x4B
   }
}
__declspec(naked) void FooEnd() {}


int main(int argc, char** argv)
{
   //start at the last byte of the memory-aligned code instead of the first byte of FooEnd
   unsigned char* fooLast = (unsigned char*)FooEnd-1;

   //keep going backwards until we don't have a 0xcc
   while(*fooLast == 0xCC)
      fooLast--;

   //fooLast will now point at the last byte of your function, so you need to add 1
   int length = ((int)fooLast - (int)Foo) + 1;

   //should output 2 for the length of Foo
   std::cout << length;
}