[保护模式]测试一致代码段

1.首先 在被调试机器里定义一下代码

// r3.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"


#include <stdio.h>
#include <stdlib.h>


int gupdate_value = 0;
int main(int argc,char * argv[])
{
    char buf[]={0x0,0,0,0,0x90,0};
    unsigned int value = 0;
    *((unsigned int *) &buf[0])=0xF8AD1060;   
    printf("%X\n",&gupdate_value);   //获取机器地址
    system("pause");
    __asm
    {
        mov eax,0xF8AD1060;
        mov eax,[eax];
        mov value,eax;
        call fword ptr ds:[buf]
    }
    printf("%X\n",gupdate_value);
    printf("%X\n",value);
    system("pause");
    return 0;
}

然后在调试机写个驱动程序

#include <ntddk.h>

VOID DriverUpload(PDRIVER_OBJECT pDriver)
{
    KdPrint(("卸载完成\n"));
}

int g_value = 10;

void  __declspec(naked) test()
{
    __asm
    {
        int 3;
        mov eax, 0x2E7140;  //此地址是由被调试机获取的
        mov ebx, 0x100;
        mov[eax], ebx;

        retf;

    }



}


NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pReg)
{
    KdPrint(("welcome to driver world\n"));
    KdPrint(("%X\n", test));
    pDriver->DriverUnload = DriverUpload;
    return STATUS_SUCCESS;
}

 

记住地址0x9A9CE270

 然后通过WinDBG 查询下函数地址是否正确

0: kd> uf 0x9A9CE270
9a9ce270 cc              int     3
9a9ce271 b840711b00      mov     eax,1B7140h
9a9ce276 bb00010000      mov     ebx,100h
9a9ce27b 8918            mov     dword ptr [eax],ebx
9a9ce27d cb              retf

这里可以看到函数地址是正确的

 

那接下来我们把

0x9A9CE270 拆分成 10 10 12 分页

9A9CE      270

首先拆前5位并将它补齐

0010 0110 1010   26A

0001 1100 1101   1CD

posted @ 2019-07-28 17:16  瀚瀚大人  阅读(186)  评论(0编辑  收藏  举报