chenwhenlong
驱动牛犊
驱动牛犊
  • 注册日期2002-07-23
  • 最后登录2005-08-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1146回复:3

请教一个 VC 内联汇编的问题

楼主#
更多 发布于:2004-12-15 16:30
代码如下:
 
#pragma check_stack(off)
#pragma pack(push, 8)
 
typedef struct {
 DWORD dwProcessId;
 PBYTE pfnHookFunc;
} INJLIBINFO, *PINJLIBINFO;
 
__declspec(naked) DWORD WINAPI CallDefault()
{
// __asm push ebp
// __asm mov ebp, CallDefault
// __asm add ebp, 70
// __asm mov eax, [ebp + INJLIBINFO.dwProcessId]
// __asm pop ebp
// __asm ret
}
 
static void AfterCallDefault(void) {}
 
#pragma pack(pop)
#pragma check_stack
 
//=======================================================================================
void Test()
{
 INJLIBINFO InjLibInfo = {0};
 
 InjLibInfo.dwProcessId = 19800611;
 
 // 计算出 InjLibInfo 结构的大小
 const int cbInfoSize = sizeof(InjLibInfo);
 
 // 计算 CallDefault() 函数所占用的字节数
 const int cbCodeSize = ((LPBYTE)AfterCallDefault - (LPBYTE)CallDefault);
 
 // 计算出所需要的内存大小
 const DWORD cbMemSize = cbCodeSize + cbInfoSize + 3;
 
 // 分配共享内存
 HANDLE hMapping = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL,
  PAGE_READWRITE, 0, cbMemSize, NULL);
 
 // 映射共享内存
 PBYTE pbCodeRemote = (PBYTE)MapViewOfFile(hMapping, FILE_MAP_WRITE,
  0, 0, 0);
 TRACE1("Address Of CallDefault: 0x%08X", pbCodeRemote);
 
 // 将 CallDefault 放入共享内存中
 memcpy(pbCodeRemote, (LPVOID)CallDefault, cbCodeSize);
 
 // 将 INJLIBINFO 结构放入共享内存中
 memcpy(pbCodeRemote + ((cbCodeSize + 4) & ~3), &InjLibInfo, cbInfoSize);
 
 // 调试
 DWORD d = ((DWORD(WINAPI*)(void))pbCodeRemote)();
 
 TCHAR szTEMP[256];
 wsprintf(szTEMP, "CallDefault Return: %d\n", d);
 MessageBox(NULL, szTEMP, "TestFM", MB_ICONINFORMATION);
 
 // 释放共享内存
 UnmapViewOfFile(pbCodeRemote);
 CloseHandle(hMapping);
 return 0;
}
 
我想在 CallDefault 中得到 InjLibInfo 的内存地址,请问如何办啊?
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-15 16:49
代码如下:
 
#pragma check_stack(off)
#pragma pack(push, 8)
 
typedef struct {
 DWORD dwProcessId;
 PBYTE pfnHookFunc;
} INJLIBINFO, *PINJLIBINFO;
 
__declspec(naked) DWORD WINAPI CallDefault()
{
// __asm push ebp
// __asm mov ebp, CallDefault
// __asm add ebp, 70
// __asm mov eax, [ebp + INJLIBINFO.dwProcessId]
// __asm pop ebp
// __asm ret
}
 
static void AfterCallDefault(void) {}
 
#pragma pack(pop)
#pragma check_stack
 
//=======================================================================================
void Test()
{
 INJLIBINFO InjLibInfo = {0};
 
 InjLibInfo.dwProcessId = 19800611;
 
 // 计算出 InjLibInfo 结构的大小
 const int cbInfoSize = sizeof(InjLibInfo);
 
 // 计算 CallDefault() 函数所占用的字节数
 const int cbCodeSize = ((LPBYTE)AfterCallDefault - (LPBYTE)CallDefault);
 
 // 计算出所需要的内存大小
 const DWORD cbMemSize = cbCodeSize + cbInfoSize + 3;
 
 // 分配共享内存
 HANDLE hMapping = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL,
  PAGE_READWRITE, 0, cbMemSize, NULL);
 
 // 映射共享内存
 PBYTE pbCodeRemote = (PBYTE)MapViewOfFile(hMapping, FILE_MAP_WRITE,
  0, 0, 0);
 TRACE1("Address Of CallDefault: 0x%08X", pbCodeRemote);
 
 // 将 CallDefault 放入共享内存中
 memcpy(pbCodeRemote, (LPVOID)CallDefault, cbCodeSize);
 
 // 将 INJLIBINFO 结构放入共享内存中
 memcpy(pbCodeRemote + ((cbCodeSize + 4) & ~3), &InjLibInfo, cbInfoSize);
 
 // 调试
 DWORD d = ((DWORD(WINAPI*)(void))pbCodeRemote)();
 
 TCHAR szTEMP[256];
 wsprintf(szTEMP, "CallDefault Return: %dn", d);
 MessageBox(NULL, szTEMP, "TestFM", MB_ICONINFORMATION);
 
 // 释放共享内存
 UnmapViewOfFile(pbCodeRemote);
 CloseHandle(hMapping);
 return 0;
}
 
我想在 CallDefault 中得到 InjLibInfo 的内存地址,请问如何办啊?


哪个是在堆栈中的空间,小心使用噢
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
chenwhenlong
驱动牛犊
驱动牛犊
  • 注册日期2002-07-23
  • 最后登录2005-08-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-15 17:56
请问如何获取啊。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地板#
发布于:2004-12-16 15:47
建议你用纯汇编来做......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
游客

返回顶部