这是我第一次来,我真的希望你们能帮助我,因为我现在已经没有想法了。
我已经搜索了几个小时的答案,但找不到真正有效的答案。
我想直接将代码注入正在运行的进程中。是的,你没看错。我正在尝试将代码注入另一个应用程序,并且 - 信不信由你 - 这只是为了扩展它的功能。
我在 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问题中,据说禁用“编辑并继续”会使这些额外的字节消失,但无论如何,这对我不起作用。
我也尝试使用发布设置而不是调试,更改了一堆优化设置,但这些都没有任何效果。您认为可能的解决方案是什么?我可能遗漏了一些明显的东西。
无论如何,这是(在您看来)获得函数长度(可读性、可靠性、易用性)的最佳方法吗?
我希望我解释了我必须做的一切,以便您能够提供帮助。如果您还有其他问题,请随时发表评论。
感谢您的时间和努力。