016_为DDK_HelloWorld添加默认派遣例程

预计平均三天一课,录制过程中,大纲会实时更新(更改)

主讲:郁金香灬老师  QQ150330575

开发环境:VC6VS2003VS2008

www.yjxsoft.net

www.yjxsoft.com

教程购买地址:http://yjxsoft.taobao.com

 

 1.3.8为DDK_HelloWorld添加默认派遣例程-16课

      A、初识IRP

      B、一个简单的IRP处理函数

      C、IRP.IoStatus结构

      D、IoCompleteRequest函数

 

IPR简介:

IRP全称(I/O Request Package),即输入输出请求包。他是windows驱动的重要概念,用户模式下所有对驱动程序的I/O请求,全部由操作系统转化为一个叫做IRP的数据结构,不同的IRP数据会被“派遗”到不同的派遣函数(DisPatch Function)中。

作用:

上层应用程序与底层驱动通信。EXE程序与SYS

 

五种常用的IRP类型:

#define IRP_MJ_CREATE                     0x00 //CreateFile()

#define IRP_MJ_CLOSE                      0x02 //CloseHandle()  

#define IRP_MJ_READ                       0x03//ReadFile

#define IRP_MJ_WRITE                      0x04//WriteFile

#define IRP_MJ_DEVICE_CONTROL           0x0e//DeviceIoControl  

 

 

过程:

 1、创建IRP处理函数

 2、在驱动入口函数里DriverEntry()注册IRP处理函数

 3、细化IRP函数

相关内核API:

 //获取指定IRP的栈空间地址

PIO_STACK_LOCATION IoGetCurrentIrpStackLocation( IN  PIRP Irp);

VOID IoCompleteRequest(

  IN  PIRP Irp,//指定需要完成的IPR

  IN  CCHAR PriorityBoost //

);

 

 

 

方法1:统一注册派遗函数

//注册派遗函数

pDriverObject->MajorFunction[IRP_MJ_CREATE]=ddk_DispatchRoutine;

//注册派遗函数

pDriverObject->MajorFunction[IRP_MJ_CLOSE]=ddk_DispatchRoutine;

//注册派遗函数

pDriverObject->MajorFunction[IRP_MJ_READ]=ddk_DispatchRoutine;

//注册派遗函数

pDriverObject->MajorFunction[IRP_MJ_WRITE]=ddk_DispatchRoutine;

//注册派遗函数

pDriverObject->MajorFunction[ IRP_MJ_DEVICE_CONTROL]=ddk_DispatchRoutine;

 

 

 

 

NTSTATUS ddk_DispatchRoutine(IN PDEVICE_OBJECT pDevobj,IN PIRP pIrp )

{

   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:

   break;

   default:

     KdPrint(("其它处理"));

//指示完成此IRP

    

}

 //成功返回

return STATUS_SUCCESS;

}

 

//方法二:分开注册

//注册派遗函数

pDriverObject->MajorFunction[IRP_MJ_CREATE]=ddk_DispatchRoutine_CREATE;

//注册派遗函数

pDriverObject->MajorFunction[IRP_MJ_CLOSE]=ddk_DispatchRoutine_CLOSE;

//注册派遗函数

pDriverObject->MajorFunction[IRP_MJ_READ]=ddk_DispatchRoutine_READ;

//注册派遗函数

pDriverObject->MajorFunction[IRP_MJ_WRITE]=ddk_DispatchRoutine_WRITE;

//注册派遗函数

pDriverObject->MajorFunction[ IRP_MJ_DEVICE_CONTROL]=ddk_DispatchRoutine_CONTROL;

 

NTSTATUS ddk_DispatchRoutine_CONTROL(IN PDEVICE_OBJECT pDevobj,IN PIRP pIrp )

{

    //对相应的IPR进行处理

   pIrp->IoStatus.Information=0;//设置操作的字节数为0,这里无实际意义

   pIrp->IoStatus.Status=STATUS_SUCCESS;//返回成功

   IoCompleteRequest(pIrp,IO_NO_INCREMENT);//指示完成此IRP

   KdPrint(("离开派遣函数\n"));//调试信息

   return STATUS_SUCCESS; //返回成功

}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程安排,暂定,有可能会实时修改 编程语言,VC++6.0 工具主要为(OD1.1,CE5.4) 预计平均3天左右更新一课 大家好,我是郁金香老师:QQ150330575 欢迎大家参加梅州技术 VC++外挂编程VIP培训班。 在接下来的一段时间将由我和大家一起学习游戏外挂的分析,制作。 课程分四个大章节 初级篇,中级篇,进阶篇,高级篇 初级篇内容:编写一个完整的,简单的外挂 C++的数据类型:Byte,Word,DWORD,int,float API函数的调mouse_event,GetWindowRect,SetCursorPos,FindWindow,SendMessage) CE5.4工具的使用方法 中级篇内容:调试工具的使用技巧,功能CALL的概念 调试工具OD1.1的使用技巧(如硬件断点,条件断点,内存断点。 常用汇编指令与对应高级语言的转换。 游戏功能CALL概念 找第一个功能CALL 外挂框架的构建(通用) 进阶篇内容:分析游戏内部数据,分析常用功能CALL 游戏数据实践找各种功能CALL(如打怪,选怪,物品使用,技能栏之类)及相应的代码编写 高级篇内容:编写完整外挂 完成一个相对完整的外挂,实现 自动挂机,打怪,存放物品之类的功能 1 入门篇.以《QQ连连看为例》 1.1、一个最简单的外挂 1.1.1、游戏数据分析(SPY++) 1.1.1、游戏窗口数据分析(SPY++) a、取得窗口相对坐标 b、读出游戏窗口信息GetWindowRect c、移动鼠标指针SetCursorPos 1.1.2 用VC++写个最简单的外挂(实现游戏开局) a、鼠拟鼠标单击mouse_event b、鼠标指针移动还原 c、集成到startgame函数里 1.2、用CE查找棋盘数据 1.2.1、数据类型:Bit,Byte,Word,Dword 、用CE查找坐位号; 1.2.2、用CE查出4个棋盘基址; 1.3、用模拟技术编制外挂 1.3.1 模拟鼠标点击实现 交换棋子 1.3.2 把所有功能集成封装到 函数里 1.3.3 利用棋盘数据 ,模拟实现下棋功能 1.3.4 编写完整外挂,界面美化 1.4、游戏加速.去掉对动画效果.非HOOK 1.4.1:用OD找出 动画延时代码 1.4.2:写代码去掉延时,实现游戏加速 2 中级篇 以热血江湖为例 2.1、分析前的准备..CALL简介: 2.1.1、CALL调用示例分析.远程代码注入器 2.1.2、调试工具OD简介,血值,魔力值,坐标偏移; 2.1.3、游戏基址概念; 2.1.4、常用汇编指令详解 2.1.5、内联汇编编程实例 2.2、游戏分析利器OD(OllyDbg) 2.2.1、分析角色基址 2.2.2、找打坐CALL 2.2.3、读出角色当前血值 2.2.4、远程注入代码,调用打坐CALL; 2.2.5、实例分析:找技能栏对象数组基址+偏移: 2.2.6: 拦截F1-F8功能CALL 2.3、外挂框架构建 2.3.1、DLL动态链接库构建,与调用 2.3.2、API与回调函数 2.3.3、DLL中构建窗口 2.4、用OD分析游戏功能CALL.《热血江湖》为例:主要是找CALL 2.4.1、选怪CALL 2.4.2、找游戏物品背包的基址+偏移 2.4.3、 吃红药(补血)CALL 2.4.4、 吃蓝(补魔)CALL 2.4.5、 技能CALL1 2.4.6、技能CALL2 2.4.7、所有技能CALL 2.4.8、捡物CALL 2.4.9、所有动作CALL 3、进阶篇 主要讲功能CALL的参数分析 汇编浮点指令/浮点运行/浮点数整数转换/汇编里的指针 3.1、喊话功能 3.2、走路 3.3、 怪物过滤 3.3.1、怪物属性分析 3.3.2、怪物列表关键代码分析 3.3.3、怪物列表基址+大小 3.3.4、怪物列表编写代码 3.3.5、怪物过滤 3.4、 物品过滤 3.4.1、物品属性分析 3.4.2、物品列表关键代码分析 3.4.3、找出物品列表基址+偏移 3.4.4、物品过滤(编程读出物品列表数据) 3.5、 组队相关 3.5.1、 玩家列表 3.5.2、 组队功能 3.5.3、 离队功能 3.6、购物/售物 3.6.1、与NPC对话框 3.6.2、打开购物/售物对话框 3.6.3、购物功能 3.6.4、售物功能 3.7、 摆摊.开店 a、开店CALL参数分析 b、写代码测试 4、高级篇 4.1、编写完整的外挂 4.2、游戏更新后的外挂更新 4.3、脚本功能 4.4、游戏多开实现 4.5、盗号的实现
//官方网站:www.feiyuol.com //郁金香灬老师 //QQ 150330575 //个人网站:www.yjxsoft.com 跨进程调用CALL 跨进程调用带多个的参数CALL // myInject_dll.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include"RWA.h" //PVOID 跨进程分配内存(WORD nSize ); //1、获取进程句柄 //2、读写 分配内存 创建线程 //3、跨进程分配内存 void mycall() { PVOID p1=跨进程分配内存(1000); printf("分配的内存地址=%p\n",p1); printf("按回车键 释放内存\n"); getchar(); 跨进程释放内存(p1,1000); printf("已经 释放内存\n"); } LPTHREAD_START_ROUTINE a; BOOL 跨进程调用CALL(PVOID pcall地址,PVOID plst参数 ); //LoadLibraryA(dll名字指针) //MessageBeep(1) void Test远程调用MessageBeep() { 跨进程调用CALL(MessageBeep,(PVOID)0x12768); } //注入my022MFC.dll到目标进程 void Test3() { char szDllName[]="my022MFC.dll"; //全路径 // char szDllName[]="C:\\Users\\yjxsoft\\Documents\\visual studio 2010\\Projects\\my022\\Debug\\my022MFC.dll"; PVOID p1=跨进程分配内存(1000); printf("分配的内存地址=%p\n",p1); WN((DWORD)p1,szDllName,sizeof(szDllName));//WriteProcessMemory /*跨进程调用CALL(LoadLibraryA,(PVOID)szDllName);*/ 跨进程调用CALL(LoadLibraryA,(PVOID)p1); } void Test4() { // char szDllName[]="my022MFC.dll"; //全路径 char szDllName[]="E:\\1905\\代码\\my022-24\\Debug\\my022MFC.dll"; PVOID p1=跨进程分配内存(1000); printf("分配的内存地址=%p\n",p1); WN((DWORD)p1,szDllName,sizeof(szDllName));//WriteProcessMemory /*跨进程调用CALL(LoadLibraryA,(PVOID)szDllName);*/ 跨进程调用CALL(LoadLibraryA,(PVOID)p1); } int _tmain(int argc, _TCHAR* argv[]) { //mycall(); Test3(); Test4(); return 0; } //作业 //1、练习跨进程注入DLL //2、跨进程分配的内存内存 使用完后 用VirtualFreeEx释放掉 //3、进程句柄使用完后用CloseHandle释放句柄资源

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值