#include <iostream>
#include <windows.h>
using namespace std;
BYTE *pOrgMessageBox = NULL;
typedef int (WINAPI *MESSAGEBOXA)(HWND, LPCTSTR, LPCTSTR, UINT);int
WINAPI
MyMessageBoxA(
HWND hWnd ,
LPCSTR lpText,
LPCSTR lpCaption,
UINT uType)
{
return ((MESSAGEBOXA)pOrgMessageBox)(hWnd, "你妹", "你姐", MB_OK);
}
void main()
{
DWORD dwProtect;
VirtualProtect(MessageBoxA, 5, PAGE_EXECUTE_READWRITE, &dwProtect);
pOrgMessageBox = new BYTE[10]; memcpy(pOrgMessageBox, MessageBoxA, 5);
*(BYTE*)(pOrgMessageBox + 5) = 0xE9;
*(DWORD*)(pOrgMessageBox + 6) = (DWORD)MessageBoxA + 5 - (DWORD)(pOrgMessageBox + 10);
*(BYTE*)(MessageBoxA) = 0xE9; //MessageBoxA
*(DWORD*)((BYTE*)MessageBoxA + 1) = (DWORD)MyMessageBoxA - ((DWORD)MessageBoxA + 5);
VirtualProtect(MessageBoxA, 5, dwProtect, NULL);
MessageBoxA(NULL, "123456", "654321", MB_OK);
VirtualProtect(MessageBoxA, 5, PAGE_EXECUTE_READWRITE, &dwProtect); memcpy(MessageBoxA, pOrgMessageBox, 5);
VirtualProtect(MessageBoxA, 5, dwProtect, NULL); delete pOrgMessageBox;
MessageBoxA(NULL, "我是一个强大的函数", "", MB_OK);
他是修改 了本进程的MessgeBoxA 一共是往他的头部写入了5个字节 jmp一个字节 跳转地址是4个字节
这样不就够了吗? 为啥需要10个字节呢他?
*(DWORD*)(pOrgMessageBox + 6) = (DWORD)MessageBoxA + 5 - (DWORD)(pOrgMessageBox + 10);
这句是干啥 的??请前辈们帮忙解答一下希望有个详细的注释。。看的有点晕。。拜托了
我想学习在本进程去修改别的进程的东西调用自己的函数之类的
#include <windows.h>
using namespace std;
BYTE *pOrgMessageBox = NULL;
typedef int (WINAPI *MESSAGEBOXA)(HWND, LPCTSTR, LPCTSTR, UINT);int
WINAPI
MyMessageBoxA(
HWND hWnd ,
LPCSTR lpText,
LPCSTR lpCaption,
UINT uType)
{
return ((MESSAGEBOXA)pOrgMessageBox)(hWnd, "你妹", "你姐", MB_OK);
}
void main()
{
DWORD dwProtect;
VirtualProtect(MessageBoxA, 5, PAGE_EXECUTE_READWRITE, &dwProtect);
pOrgMessageBox = new BYTE[10]; memcpy(pOrgMessageBox, MessageBoxA, 5);
*(BYTE*)(pOrgMessageBox + 5) = 0xE9;
*(DWORD*)(pOrgMessageBox + 6) = (DWORD)MessageBoxA + 5 - (DWORD)(pOrgMessageBox + 10);
*(BYTE*)(MessageBoxA) = 0xE9; //MessageBoxA
*(DWORD*)((BYTE*)MessageBoxA + 1) = (DWORD)MyMessageBoxA - ((DWORD)MessageBoxA + 5);
VirtualProtect(MessageBoxA, 5, dwProtect, NULL);
MessageBoxA(NULL, "123456", "654321", MB_OK);
VirtualProtect(MessageBoxA, 5, PAGE_EXECUTE_READWRITE, &dwProtect); memcpy(MessageBoxA, pOrgMessageBox, 5);
VirtualProtect(MessageBoxA, 5, dwProtect, NULL); delete pOrgMessageBox;
MessageBoxA(NULL, "我是一个强大的函数", "", MB_OK);
他是修改 了本进程的MessgeBoxA 一共是往他的头部写入了5个字节 jmp一个字节 跳转地址是4个字节
这样不就够了吗? 为啥需要10个字节呢他?
*(DWORD*)(pOrgMessageBox + 6) = (DWORD)MessageBoxA + 5 - (DWORD)(pOrgMessageBox + 10);
这句是干啥 的??请前辈们帮忙解答一下希望有个详细的注释。。看的有点晕。。拜托了
我想学习在本进程去修改别的进程的东西调用自己的函数之类的
有的地方看不太懂 我想尝试去修改别的进程的messageboxa
如果直接修改MessageBoxA的前5个地址内容,是不能达到效果的,因为MessageBoxA前5个地址内容也是有很的,直接修改就被破坏了。
程序中先把这5个地址的内容保存起来,然后修改MessageBoxA的前5个地址内容跳转到自己写的MyMessageBoxA,在这个函数中,开始执行pOrgMessageBox,即执行之前保存的5个地址的内容,然后接下来的5个地址就跳转到原MessageBoxA的第6个地址开始的内容。
*(DWORD*)(pOrgMessageBox + 6) = (DWORD)MessageBoxA + 5 - (DWORD)(pOrgMessageBox + 10);//这个是啥?? *(BYTE*)(MessageBoxA) = 0xE9; //MessageBoxA *(DWORD*)((BYTE*)MessageBoxA + 1) = (DWORD)MyMessageBoxA - ((DWORD)MessageBoxA + 5);//这个是计算出跳转的目标地址差用来JMP 前五个字节是保存jmp+地址 后五个字节呢、?
你结合着我的解释看看8楼的回复。pOrgMessageBox前5个字节保存的是MessageBox前5个字节,pOrgMessageBox后5个字节是跳转到MessageBox的第6个字节开始执行。
由于您长时间不结贴,上一次答复已超一个月。
目前暂无最佳答案,本人帮你顶贴。
另外可以放在本版的疑难杂症帖链接:
http://bbs.csdn.net/topics/390351579。
如果您有什么意见,请您联系我。有才啊!