#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);
这句是干啥 的??请前辈们帮忙解答一下希望有个详细的注释。。看的有点晕。。拜托了
我想学习在本进程去修改别的进程的东西调用自己的函数之类的

解决方案 »

  1.   

    HOOK了本进程的MESSAGEBOXA 。。 我想知道具体是怎么个回事 啥原理来着
      

  2.   

    他是先jmp到自己的函数 然后执行完后再JMP到原来的messageboxa吗???? 能帮忙给下注释吗?
    有的地方看不太懂 我想尝试去修改别的进程的messageboxa
      

  3.   

    这段代码确实有点儿晦涩,虽然项目中用过类型的方法,但没有好好研究过。趁此时机想了一下,想出来了,做法很好,楼主哪里找到的代码?我也学习了。
    如果直接修改MessageBoxA的前5个地址内容,是不能达到效果的,因为MessageBoxA前5个地址内容也是有很的,直接修改就被破坏了。
    程序中先把这5个地址的内容保存起来,然后修改MessageBoxA的前5个地址内容跳转到自己写的MyMessageBoxA,在这个函数中,开始执行pOrgMessageBox,即执行之前保存的5个地址的内容,然后接下来的5个地址就跳转到原MessageBoxA的第6个地址开始的内容。
      

  4.   

    确实挺有意思的。可以插一段自己想要的代码在MyMessageBox里面,不过有什么用?开远程线程的时候用?
      

  5.   

    恩  我问一个朋友怎么修改其他进程的messagebox他就给了我个例子 
      

  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+地址 后五个字节呢、?
      

  7.   


    你结合着我的解释看看8楼的回复。pOrgMessageBox前5个字节保存的是MessageBox前5个字节,pOrgMessageBox后5个字节是跳转到MessageBox的第6个字节开始执行。
      

  8.   

    您好,
    由于您长时间不结贴,上一次答复已超一个月。
    目前暂无最佳答案,本人帮你顶贴。
    另外可以放在本版的疑难杂症帖链接:
    http://bbs.csdn.net/topics/390351579。
    如果您有什么意见,请您联系我。有才啊!
      

  9.   

    我在项目中做过这个功能,需要Hook技术,还有你必须熟悉PE结构