// jmp eax == 0xFF, 0xE0
// 生成新的执行代码
BYTE btNewBytes[8] = { 0xB8, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xE0, 0x00 }; 这个是什么意思啊,尤其是第一句注释!!!! 再就是赋值为何赋那些数字啊下面的代码页是没明白最后一句注释
PBYTE pMessageBox= (PBYTE)GetProcAddress(GetModuleHandle("user32"),"MessageBoxA");
*pMessageBox = 0xC2;
*(PWORD)(pMessageBox+1) = 0x10;MessageBoxA(...);C2 10 00 汇编是ret 10h附完整代码
// jmp eax == 0xFF, 0xE0
// 生成新的执行代码
BYTE btNewBytes[8] = { 0xB8, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xE0, 0x00 };
memcpy(m_btNewBytes, btNewBytes, 8);
*(DWORD *)(m_btNewBytes + 1) = (DWORD)pfnHook; // 加载指定模块,取得API函数地址
m_hModule = ::LoadLibrary(pszModName);
if(m_hModule == NULL)
{
m_pfnOrig = NULL;
return;
}
m_pfnOrig = ::GetProcAddress(m_hModule, pszFuncName);
// 修改原API函数执行代码的前8个字节,使它跳向我们的函数
if(m_pfnOrig != NULL)
{
DWORD dwOldProtect;
MEMORY_BASIC_INFORMATION mbi;
::VirtualQuery( m_pfnOrig, &mbi, sizeof(mbi) );
::VirtualProtect(m_pfnOrig, 8, PAGE_READWRITE, &dwOldProtect); // 保存原来的执行代码
memcpy(m_btOldBytes, m_pfnOrig, 8);
// 写入新的执行代码
::WriteProcessMemory(::GetCurrentProcess(), (void *)m_pfnOrig,
m_btNewBytes, sizeof(DWORD)*2, NULL);
::VirtualProtect(m_pfnOrig, 8, mbi.Protect, 0);
}
// 生成新的执行代码
BYTE btNewBytes[8] = { 0xB8, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xE0, 0x00 }; 这个是什么意思啊,尤其是第一句注释!!!! 再就是赋值为何赋那些数字啊下面的代码页是没明白最后一句注释
PBYTE pMessageBox= (PBYTE)GetProcAddress(GetModuleHandle("user32"),"MessageBoxA");
*pMessageBox = 0xC2;
*(PWORD)(pMessageBox+1) = 0x10;MessageBoxA(...);C2 10 00 汇编是ret 10h附完整代码
// jmp eax == 0xFF, 0xE0
// 生成新的执行代码
BYTE btNewBytes[8] = { 0xB8, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xE0, 0x00 };
memcpy(m_btNewBytes, btNewBytes, 8);
*(DWORD *)(m_btNewBytes + 1) = (DWORD)pfnHook; // 加载指定模块,取得API函数地址
m_hModule = ::LoadLibrary(pszModName);
if(m_hModule == NULL)
{
m_pfnOrig = NULL;
return;
}
m_pfnOrig = ::GetProcAddress(m_hModule, pszFuncName);
// 修改原API函数执行代码的前8个字节,使它跳向我们的函数
if(m_pfnOrig != NULL)
{
DWORD dwOldProtect;
MEMORY_BASIC_INFORMATION mbi;
::VirtualQuery( m_pfnOrig, &mbi, sizeof(mbi) );
::VirtualProtect(m_pfnOrig, 8, PAGE_READWRITE, &dwOldProtect); // 保存原来的执行代码
memcpy(m_btOldBytes, m_pfnOrig, 8);
// 写入新的执行代码
::WriteProcessMemory(::GetCurrentProcess(), (void *)m_pfnOrig,
m_btNewBytes, sizeof(DWORD)*2, NULL);
::VirtualProtect(m_pfnOrig, 8, mbi.Protect, 0);
}
解决方案 »
- 问一个关于函数返回值的问题
- 新手control和value的区别
- 求助!!!!!昨天回家时VC还是正确的,今天就出现问题了!!
- 能否用虚拟机模拟一主机,并与之连网,就像两台真实电脑连网一样?
- 我想在VC/MFC基础类中申请它的分版主,希望大家多多支持!!!
- 如何相应ctrl+A ctrl+ B等消息?
- 该引用哪个falsh 文件
- 求救大神,用C++读取文件数据,得到空格之间的数据、字母D前和D后
- 为什么要将位图转换成HIBITMAP格式???
- 关于win2000开发。
- installshield的Combo Box的默認怎麼設定
- MDI中对MainFrame进行了拆分,但是ChildFrame不见了
0012fb15 ffe0 jmp eaxb8对应mov,00004000对应函数地址(00400000),所以*(DWORD *)(m_btNewBytes + 1) = (DWORD)pfnHook; 实现了跳到自己代码的目的;
当执行我自己的函数后,如何跳转回去执行原来的函数我目前是想 钩recv 统计流量另外,那些汇编 我还是不很明白,能再详细点吗
比如C2 10 00 汇编是ret 10h
那C2 10 00 又是什么呢?我觉得我思维不清晰
0012fb15 ffe0 jmp eax这一长串 数字 真头疼 能说说吗?我Q 895000080 怎么谢都行