友链

_imp_IoAllocateWorkItem接收一个参数   来自于caller函数中的第一个参数  deviceobjectfffff880`05ce812c 488b8c24d0000000 mov     rcx,qword ptr [rsp+0D0h]通过rcx寄存器传入kd> uf nt!IoAllocateWorkItem
nt!IoAllocateWorkItem:
fffff803`67c32898 53              push    rbx
fffff803`67c32899 4883ec20        sub     rsp,20h
;判断这个链表的flink是不是空的,不太理解这个操作,如果是想要判断链表是不是空的话,不应该是判断Flink是否是自己嘛?    实际情况是 这个值确实就是0
fffff803`67c3289d 48833d4bce260000 cmp     qword ptr [nt!ViVerifierDriverAddedThunkListHead (fffff803`67e9f6f0)],0
fffff803`67c328a5 488bd9          mov     rbx,rcx这几个寄存器是不是给ExAllocatePoolWithTag传参的呀
fffff803`67c328a8 ba50000000      mov     edx,50h
fffff803`67c328ad b900020000      mov     ecx,200h
fffff803`67c328b2 41b8496f2020    mov     r8d,20206F49h
该函数的原型可以在微软官方文档上找到
PVOID ExAllocatePoolWithTag([in] __drv_strictTypeMatch(__drv_typeExpr)POOL_TYPE PoolType   ecx      200h对应512 NonPagedPoolNx[in] SIZE_T                                         NumberOfBytes,  edx  0x50[in] ULONG                                          Tag  r8d   就i是一个长度为4的字符串,具体是干啥的我也不太清楚  范围是 0x20 (space) to 0x7E
);
fffff803`67c328b8 0f853e671a00    jne     nt! ?? ::FNODOBFM::`string'+0xb656 (fffff803`67dd8ffc)  Branchnt!IoAllocateWorkItem+0x27:
fffff803`67c328be e87d672400      call    nt!ExAllocatePoolWithTag (fffff803`67e79040)nt!IoAllocateWorkItem+0x2c:
然后判断返回胡来的地址是否为空
fffff803`67c328c3 4885c0          test    rax,rax
fffff803`67c328c6 741e            je      nt!IoAllocateWorkItem+0x4f (fffff803`67c328e6)  Branchnt!IoAllocateWorkItem+0x31:
把刚分配来的地址的第一个8字节给清0
fffff803`67c328c8 48832000        and     qword ptr [rax],0
然后获取到变量nt!IopProcessWorkItem 的地址
fffff803`67c328cc 488d0d29db0300  lea     rcx,[nt!IopProcessWorkItem (fffff803`67c703fc)]
往rax这个地址里面放一堆数,然后清除栈空间,返回
rbx一开始来自于rcx,rcx是caller里面的寄存器,让我看看里面存的是啥  rcx是device object
这样的话,那rax前16个字节放了啥?前八个字节被清空,那前16个字节中的后八个字节是什么玩意
8-》0 8-》?        根据_IO_WORKITEM的结构,这块应该是listentry
8-》nt!IopProcessWorkItem地址  这块应该是workerroutine8-》分配的内存地址    这块应该是parameter8-》?   这块是routine8-》deviceobject  这块是IoObject
8-》? 这块是context4-》1  这块是Type最后还有一个GUID,这里并没有体现刚才看了一下rax的内存,和我上面的分析是一至的的
kd> dq /c 1 rax L 10
DBGHELP: SharedUserData - virtual symbol module
fffffa80`19f82b10  00000000`00000000
fffffa80`19f82b18  0057005c`003a0043
fffffa80`19f82b20  fffff803`67c703fc
fffffa80`19f82b28  fffffa80`19f82b10
fffffa80`19f82b30  00650074`00730079
fffffa80`19f82b38  fffffa80`190a9e40
fffffa80`19f82b40  00740068`00630073
fffffa80`19f82b48  00000000`00000001
fffffa80`19f82b50  fffffa80`1a6948d0
fffffa80`19f82b58  00000000`00000001
fffffa80`19f82b60  20646156`02090006
fffffa80`19f82b68  fffff803`67e94c10
fffffa80`19f82b70  fffffa80`1c0b7650
fffffa80`19f82b78  fffffa80`1b3629f0
fffffa80`19f82b80  fffffa80`190520d0
fffffa80`19f82b88  08ce4acf`08ce3e20fffff803`67c328d3 48895828        mov     qword ptr [rax+28h],rbx
fffff803`67c328d7 48894810        mov     qword ptr [rax+10h],rcx
fffff803`67c328db c7403801000000  mov     dword ptr [rax+38h],1
fffff803`67c328e2 48894018        mov     qword ptr [rax+18h],raxnt!IoAllocateWorkItem+0x4f:
fffff803`67c328e6 4883c420        add     rsp,20h
fffff803`67c328ea 5b              pop     rbx
fffff803`67c328eb c3              retnt! ?? ::FNODOBFM::`string'+0xb656:
fffff803`67dd8ffc 440fb60dbcbd0f00 movzx   r9d,byte ptr [nt!MmVerifierData (fffff803`67ed4dc0)]
fffff803`67dd9004 4183e110        and     r9d,10h
fffff803`67dd9008 4183c940        or      r9d,40h
fffff803`67dd900c 41d1e9          shr     r9d,1
fffff803`67dd900f e83cb5e9ff      call    nt!ExAllocatePoolWithTagPriority (fffff803`67c74550)
fffff803`67dd9014 90              nop
fffff803`67dd9015 e9a998e5ff      jmp     nt!IoAllocateWorkItem+0x2c (fffff803`67c328c3)  Branch

IoAllocateWorkItem函数分析相关推荐

  1. linux C函数之strdup函数分析【转】

    本文转载自:http://blog.csdn.net/tigerjibo/article/details/12784823 linux C函数之strdup函数分析 一.函数分析 1.函数原型: [c ...

  2. 【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | Class.cpp#findClassNoInit 函数 | DexFile.cpp#dexFindClass 函数分析 )

    文章目录 前言 一.Class.cpp#dvmDefineClass 函数分析 二.Class.cpp#findClassNoInit 函数分析 三.DexFile.cpp#dexFindClass ...

  3. 【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | DexPathList#findClass 函数分析 | DexFile#loadClassBinaryName 函数 )

    文章目录 前言 一.DexPathList.java#findClass 类加载函数源码分析 二.DexFile.java#loadClassBinaryName 函数源码分析 前言 上一篇博客 [A ...

  4. 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | DexPathList 构造函数分析 | makeDexElements 函数分析 )

    文章目录 前言 一.DexPathList 构造函数分析 二.DexPathList.makeDexElements 函数分析 三.Element 类分析 前言 上一篇博客 [Android 逆向]整 ...

  5. 【Android 逆向】Android 逆向通用工具开发 ( adb forward 网络端口重定向命令 | PC 端逆向程序主函数分析 )

    文章目录 前言 一.adb forward 网络端口重定向命令 二.PC 端逆向程序主函数分析 前言 本篇博客重点分析 PC 端 hacktool 模块 ; 一.adb forward 网络端口重定向 ...

  6. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 注入工具的 main 函数分析 )

    文章目录 一.注入流程 二.注入工具的 main 函数分析 一.注入流程 开始分析 [Android 逆向]Android 进程注入工具开发 ( 编译注入工具 | 编译结果文件说明 | 注入过程说明 ...

  7. 继承关系中的拷贝构造函数和赋值操作重载函数分析

    文章目录 1 继承关系中的拷贝构造函数和赋值操作重载函数分析 1 继承关系中的拷贝构造函数和赋值操作重载函数分析 在继承关系中,如果子类未实现拷贝构造函数,那么在子类进行拷贝构造操作时,会直接调用父类 ...

  8. Windows事件等待学习笔记(三)—— WaitForSingleObject函数分析

    Windows事件等待学习笔记(三)-- WaitForSingleObject函数分析 要点回顾 WaitForSingleObject NtWaitForSingleObject KeWaitFo ...

  9. fprintf/fscanf函数分析

    fprintf/fscanf函数分析 宗旨:技术的学习是有限的,分享的精神是无限的. fprintf/fscanf函数与printf/scanf区别:printf/scanf专门针对标准输入输出流,f ...

最新文章

  1. unigui中弹出对话框原窗体是没有了_最前线 | 微信对话框“搜一搜”功能上线,独辟蹊径的腾讯打着什么算盘?...
  2. 除了腾讯阿里,中国最牛的风投机构,其实是合肥市政府!
  3. mxGraph破解说明
  4. zookeeper的设计猜想-关于 2PC 提交
  5. Python 中的模块和包
  6. 线性链表java实现_java实现线性单链表
  7. 高二学生学习计算机软件,精选高二信息技术教学计划三篇
  8. 携程初赛 携程全球数据中心建设 球面上两点的最短距离 + 最小生成树
  9. java编写的爬虫demo_我用Java写的第一个爬虫Demo-爬图片
  10. HTML:canvas画圆形加矩形组合
  11. Golang高效实践之array、slice、map实践
  12. Springboot毕设项目眼镜店管理系统1m12ajava+VUE+Mybatis+Maven+Mysql+sprnig)
  13. Delphi键盘键值
  14. win10安装配置JDK11
  15. 天清江月白,心静海鸥知
  16. 【工业4.0】第四次工业革命潜在的市场变化,随之萌生的机遇,以及构建企业敏捷能力的实践方法。...
  17. 连接不上oracle数据库
  18. 459. Repeated Substring Pattern
  19. 拨开云雾synchronized使用五种方式介绍
  20. 单片机入门级视频教程

热门文章

  1. npm、cnpm、yarn、pnpm、npx、nvm的区别:
  2. 我的大学——记大学的生活
  3. PDCA与PDSA哪一个比较优胜?
  4. 选机器学习还是计算机视觉,当机器学习遇到计算机视觉--上篇
  5. 移动硬盘linux逻辑分区的区别,主磁盘分区、扩展磁盘分区、逻辑分区的区别
  6. 最值问题—粒子群算法(PSO)python实现
  7. 加拿大FBA海运专线需要多少时间
  8. 大白话DDD-领域驱动设计实战教程
  9. i5八代低压跑matlab,8代低压处理器发布,7700HQ竟不敌低压i5?
  10. 【Jenkins学习 】解决Jenkins节点断开不可用,报错:Disk space is too low. Only 0.803GB left on /tmp.