使用writeprocess写机器码改变代码执行状态

#include <windows.h>
#include <tchar.h>
#include <windef.h>

typedef int (*PFNMESSAGEW)(HWND,LPCWSTR,LPCWSTR,UINT);

int sum(int a,int b);


LPCWSTR STR_OK=_T("ok");
LPCWSTR STR_WORDS=_T("it work well");

PFNMESSAGEW pfnMessageBoxW=NULL;
int WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR lpCmdLine,int nShowCmd)
{
    DWORD dwNum=0;


    BYTE OBJ_CODE[]={0xe9,0x0,0x0,0x0,0x0};//jmp code
   
    HMODULE hUser32=::LoadLibraryA("user32");
    pfnMessageBoxW=(PFNMESSAGEW)GetProcAddress(hUser32,"MessageBoxW");
   
    //获取__MESSAGEBOX地址
    DWORD dwMessageAddr=0;
    _asm
    {
        push       ebx
        mov        ebx, __MESSAGEBOX
        mov        dwMessageAddr,ebx
        pop        ebx
    }

//计算改变后的地址地址
    dwMessageAddr-=(DWORD)sum+5;
    memcpy(&OBJ_CODE[1],&dwMessageAddr,sizeof(DWORD));

    DWORD dwSumAddr=(DWORD)sum;
    ::WriteProcessMemory(::GetCurrentProcess(),(LPVOID)dwSumAddr,OBJ_CODE,5,&dwNum);

    int s=sum(3,5);
   
    _asm
    {
__MESSAGEBOX:
        push    MB_OK
        push    STR_OK
        push    STR_WORDS
        push    0
        call    pfnMessageBoxW
        add        esp,16
    }
    FreeLibrary(hUser32);

    return 0;
}

int sum(int a,int b)
{
   
    return 5;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值