我正在尝试使用其地址挂钩函数,到目前为止整体工作正常!
唯一的问题是当将std::cout
与WinAPI挂钩的MessageBoxA
结合使用时,它会崩溃!奇怪的是,它只会在特定情况下崩溃,而不是与printf
或int i = MessageBoxA(...);
或32
一起调用
为了进行测试,我做了这样,函数地址的指令直接返回// mov eax, 32
// ret
const DWORD instructionCount = 6;
BYTE instructions[instructionCount] = { 0xB8, 0x20, 0x00, 0x00, 0x00, 0xC3 };
。 我知道的钩子并不多,但这仅用于测试。
VirtualProtect()
除了必须更改memcpy(MessageBoxA, instructions, instructionCount);
区域的保护之外,那么
现在我基本上只做
int i = MessageBoxA(NULL, "Hello World", "Injector", MB_OK);
printf("Works: %d\n", i);
printf("Works: %d\n", MessageBoxA(NULL, "Hello World", "Injector", MB_OK));
std::cout << "Works: " << i << std::endl;
std::cout << "Doesn't: " << MessageBoxA(NULL, "Hello World", "Injector", MB_OK) << std::endl;
printf("Hello World\n");
现在使用它进行测试:
std::cout << MessageBoxA(...)
然后它在32
之后崩溃。删除该行,一切正常!
请注意,它成功打印__declspec(noinline) int testFunction(int i)
{
return i;
}
,在到达下一个语句时崩溃。
同样只是在那种情况下它不起作用,所以使用它:
MessageBoxA
然后重复使用上面的代码并将testFunction
更改为jsonData = """{
"products" : {
"DQ578CGN99KG6ECF" : {
"sku" : "DQ578CGN99KG6ECF",
"productFamily" : "Compute",
"attributes" : {
"location" : "US East (N. Virginia)",
"instanceType" : "hs1.8xlarge",
"tenancy" : "Shared",
"operatingSystem" : "Windows",
"licenseModel" : "License Included",
"preInstalledSw" : "NA"
}
},
"G2N9F3PVUVK8ZTGP" : {
"sku" : "G2N9F3PVUVK8ZTGP",
"productFamily" : "Instance",
"attributes" : {
"location" : "Asia Pacific (Seoul)",
"instanceType" : "i2.xlarge",
"tenancy" : "Host",
"operatingSystem" : "Windows",
"licenseModel" : "License Included",
"preInstalledSw" : "SQL Server Enterprise"
}
},
"FBZZ2TKXWWY5HZRX" : {
"sku" : "FBZZ2TKXWWY5HZRX",
"productFamily" : "Compute",
"attributes" : {
"location" : "Asia Pacific (Seoul)",
"instanceType" : "i2.4xlarge",
"tenancy" : "Dedicated",
"operatingSystem" : "SUSE",
"licenseModel" : "No License required",
"preInstalledSw" : "NA"
}
}
}
}"""
(以及参数),现在所有4个语句都有效!
最重要的是,在特定情况下,是否有任何人对于导致崩溃的原因和原因有什么想法?当其他案件完美无缺时。
答案 0 :(得分:3)
我认为问题是您正在破坏堆栈指针。请尝试使用以下内容:
const DWORD instructionCount = 8;
BYTE instructions[instructionCount] = { 0xB8, 0x20, 0x00, 0x00, 0x00, 0xC2, 0x10, 0x0 };
如同彼得·科德斯所提到的那样,这将会从堆栈中弹出。希望有所帮助。