驅動層代碼:
#pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com */ NTSTATUS myDriver_DispatchRoutine(IN PDEVICE_OBJECT pDevobj, IN PIRP pIrp); void registerIrp(PDRIVER_OBJECT driver) { KdPrint(("開始注冊派遺函式")); //注冊派遺函式 driver->MajorFunction[IRP_MJ_CREATE] = myDriver_DispatchRoutine; //注冊派遺函式 driver->MajorFunction[IRP_MJ_CLOSE] = myDriver_DispatchRoutine; //注冊派遺函式 driver->MajorFunction[IRP_MJ_READ] = myDriver_DispatchRoutine; //注冊派遺函式 driver->MajorFunction[IRP_MJ_WRITE] = myDriver_DispatchRoutine; //注冊派遺函式 driver->MajorFunction[IRP_MJ_DEVICE_CONTROL] = myDriver_DispatchRoutine; } NTSTATUS myDriver_DispatchRoutine(IN PDEVICE_OBJECT pDevobj, IN PIRP pIrp) { //獲取當前IRP的堆疊 PIO_STACK_LOCATION irpsp = IoGetCurrentIrpStackLocation(pIrp); switch (irpsp->MajorFunction) { case IRP_MJ_CREATE: break; case IRP_MJ_CLOSE: break; case IRP_MJ_READ: break; case IRP_MJ_WRITE: break; case IRP_MJ_DEVICE_CONTROL: { ULONG code = irpsp->Parameters.DeviceIoControl.IoControlCode; switch (code) { case add_code: { int a, b, c; int * inputBuffer = pIrp->AssociatedIrp.SystemBuffer; /*__asm { mov eax, inputBuffer; mov ebx, [eax]; mov a, ebx; mov ebx, [eax + 4]; mov b, ebx; }*/ a = *(int*)inputBuffer; b = *(int*)(inputBuffer+1); KdPrint(("inputBuffer=%x", inputBuffer)); KdPrint(("inputBuffer+1=%x", inputBuffer + 1)); KdPrint(("a=%d,b = %d", a, b)); c = a + b; int * outputBuffer = pIrp->AssociatedIrp.SystemBuffer; /*__asm { mov eax, c; mov ebx, outputBuffer; mov [ebx], eax; }*/ *outputBuffer = c; KdPrint(("c=%d",c)); pIrp->IoStatus.Information = 4;//回傳資料的大小 break; } } } default: break; } //完成IRP請求 pIrp->IoStatus.Information = 4;//設定操作的位元組 pIrp->IoStatus.Status = STATUS_SUCCESS; IoCompleteRequest(pIrp,IO_NO_INCREMENT);//指示完成此IRP //成功回傳 return STATUS_SUCCESS; }
用戶層代碼:
#include "pch.h" #include <iostream> #include <Windows.h> #include <winioctl.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 游戲逆向www.yxfzedu.com */ int add(HANDLE hDevice, int a, int b); int main() { //\\??\\aabc_symbolicName HANDLE hDevice = CreateFile(L"\\\\.\\aabc_symbolicName",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); printf("hDevice: %d \n", hDevice); if (hDevice == INVALID_HANDLE_VALUE) { printf("獲取設備句柄失敗 錯誤碼: \n", GetLastError()); getchar(); return 0; } int a = 2; int b = 3; int c = add(hDevice,a,b); printf("c=%d \n",c); getchar(); return 1; } int add(HANDLE hDevice,int a,int b) { int param[2]; param[0] = a; param[1] = b; ULONG ReturnLength; int result; BOOL flag = DeviceIoControl(hDevice, add_code,¶m,8,&result,4, &ReturnLength,NULL); if (flag) { printf("%d \n", result); } return result; }
更多游戲逆向視頻www.yxfzedu.com
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/439.html
標籤:其他