Thunk新思路, x86成功,x64失败,寻求帮助

「已注销」 「已注销」 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
这个链接是Thunk实现的一种新思路:http://www.cppblog.com/proguru/archive/2008/08/24/59831.html
作者将hWnd替换为this指针,回调函数风格变成:
LRESULT CALLBACK wndProc(UINT msg, WPARAM wpa, LPARAM lpa)
{
// hWnd 通过Thunk代码保存到窗口类的第一个数据成员:HWND _wnd; 中
}


于是我在作者思路的基础上改写如下:
struct ThunkData
{
#if defined(_M_IX86)
#pragma pack(push, 1)
unsigned char m_szMachineCode[22];
void* init(DWORD_PTR proc, void* pthis)
{
*((WORD *) &m_szMachineCode[ 0]) = 0xB851;
*((DWORD *) &m_szMachineCode[ 2]) = (DWORD)pthis;
*((DWORD *) &m_szMachineCode[ 6]) = 0x08244C8B;
*((DWORD *) &m_szMachineCode[10]) = 0x44890889;
*((DWORD *) &m_szMachineCode[14]) = 0xE9590824;
*((DWORD *) &m_szMachineCode[18]) = proc - reinterpret_cast<DWORD>(this) - sizeof(ThunkData);
// write block from data cache and flush from instruction cache
FlushInstructionCache(GetCurrentProcess(), this, sizeof(ThunkData));
return this;
}
#pragma pack(pop)

#elif defined(_M_AMD64)
#pragma pack(push, 1)
unsigned char m_szMachineCode[27];
void* init(DWORD_PTR proc, void *pthis)
{
*((WORD *)&m_szMachineCode[0]) =0xB848;
*((INT_PTR*)&m_szMachineCode[2]) =reinterpret_cast<INT_PTR>(pthis);
*((DWORD *)&m_szMachineCode[10]) =0x89480848;
*((DWORD *)&m_szMachineCode[14]) =0x00B848C1;
*((INT_PTR*)&m_szMachineCode[17]) =proc;
*((WORD *)&m_szMachineCode[25]) =0xE0FF;
FlushInstructionCache(GetCurrentProcess(), this, sizeof(ThunkData));
return this;
}
#pragma pack(pop)
#endif

void* getCode()
{
return this;
}

void* operator new(size_t)
{
return VirtualAlloc(NULL, sizeof(ThunkData), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
}

void operator delete(void* thunk)
{
VirtualFree(thunk, 0, MEM_RELEASE);
}
};


其中,x86下成功,但x64失败:CreateWindowEx时返回错误码1812,意思是:The specified image file did not contain a resource section.
之后崩溃。

请帮忙:x64的实现哪里出现了问题?应该如何修正呢?
...全文

相关推荐

评论 6
收藏 已收藏
分享
返回顶部
「已注销」
汇编语言 21,500 成员 41,619 内容