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 ",&gupdate_value); //获取机器地址 system("pause"); __asm { mov eax,0xF8AD1060; mov eax,[eax]; mov value,eax; call fword ptr ds:[buf] } printf("%X ",gupdate_value); printf("%X ",value); system("pause"); return 0; }
然后在调试机写个驱动程序
#include <ntddk.h> VOID DriverUpload(PDRIVER_OBJECT pDriver) { KdPrint(("卸载完成 ")); } 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 ")); KdPrint(("%X ", 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