1. void APCKernelRoutine(PKAPC pKAPC,
  2. PKNORMAL_ROUTINE pUserAPC,
  3. PVOID pContext,
  4. PVOID pSysArg1,
  5. PVOID pSysArg2)
  6. {
  7. DbgPrint("APCKernelRoutine Entered\n");
  8. ExFreePool(pKAPC);
  9. }
  10. NTSTATUS InjectDllByAPC(ULONG TargetPid, ULONG TargetTid, PUNICODE_STRING usDllPath, ULONG LdrMethodAddress)
  11. {
  12. ULONG size;
  13. PKTHREAD TargetThread;
  14. PEPROCESS TargetProcess;
  15. KAPC_STATE ApcState; ULONG arg1 = 0;
  16. ULONG arg2 = 0;
  17. ULONG arg3 = 0;
  18. DbgPrint("Inside InjectDllByAPC...\n");  size = (unsigned char*)APCMdlCodeEnd - (unsigned char*)APCMdlCode;
  19. DbgPrint("Allocating MDL (1)...\n"); pMDLApcCode = IoAllocateMdl(APCMdlCode, size, FALSE, FALSE, NULL);
  20. if (!pMDLApcCode)
  21. {
  22. return(STATUS_UNSUCCESSFUL);
  23. }
  24. MmProbeAndLockPages(pMDLApcCode, KernelMode, IoWriteAccess);
  25. RtlZeroMemory(pAPCData, sizeof( pAPCData));
  26. memcpy( (char*) pAPCData, usDllPath->Buffer, usDllPath->Length);
  27. unicodeLengthInfo = *(ULONG*) usDllPath;
  28. pMDLApcData = IoAllocateMdl (pAPCData, sizeof(pAPCData), FALSE,FALSE,NULL);
  29. if (!pMDLApcData)
  30. {
  31. return STATUS_UNSUCCESSFUL;
  32. }
  33. MmProbeAndLockPages(pMDLApcData, KernelMode, IoWriteAccess);    PsLookupProcessByProcessId((HANDLE)TargetPid, &TargetProcess);
  34. DbgPrint("Pid: %d, PEPROCESS: 0X%X\n", TargetPid, TargetProcess);
  35. PsLookupThreadByThreadId ((PVOID) TargetTid, &TargetThread);
  36. DbgPrint("Tid: %d, PKTHREAD: 0X%X\n", TargetTid, TargetThread);  KeStackAttachProcess((PKPROCESS) TargetProcess, &ApcState);
  37. pMappedCode = (PVOID*) MmMapLockedPagesSpecifyCache(pMDLApcCode, UserMode, MmCached, NULL, FALSE, NormalPagePriority);
  38. pMappedData = (PVOID*) MmMapLockedPagesSpecifyCache(pMDLApcData, UserMode, MmCached, NULL, FALSE, NormalPagePriority);  KeUnstackDetachProcess (&ApcState);
  39. arg1 = (ULONG) LdrMethodAddress;
  40. arg2 = (ULONG) pMappedData;
  41. arg3 = (ULONG) unicodeLengthInfo;
  42. pKAPC = (PKAPC) ExAllocatePool( NonPagedPool, sizeof(KAPC) );
  43. RtlZeroMemory(pKAPC, sizeof(KAPC));
  44. KeInitializeApc(pKAPC, TargetThread, OriginalApcEnvironment,
  45. (PKKERNEL_ROUTINE)APCKernelRoutine, NULL,
  46. (PKNORMAL_ROUTINE) pMappedCode,
  47. UserMode, (PVOID)arg1);  KeInsertQueueApc(pKAPC, (PVOID)arg2, (PVOID)arg3, 0);
  48. //KETHREAD.ApcState.UserApcPending = 1
  49. //*((unsigned char *)TargetThread + 0x4a) = 1; //XP, 2K3 RTM
  50. //*((unsigned char *)TargetThread + 0x3e) = 1; //2K3 SP1, SP2
  51. //*((unsigned char *)TargetThread + 0x4e) = 1; //Vista
  52. *((unsigned char *)TargetThread + 0x56) = 1; //Win 7
  53. if (pMDLApcCode)
  54. {
  55. MmUnlockPages(pMDLApcCode);
  56. IoFreeMdl(pMDLApcCode);
  57. }   if (pMDLApcData)
  58. {
  59. MmUnlockPages(pMDLApcData);
  60. IoFreeMdl(pMDLApcData);
  61. }
  62. ObDereferenceObject(TargetProcess);
  63. ObDereferenceObject(TargetThread);  return STATUS_SUCCESS;
  64. }
  65. void APCMdlCode(PVOID lpLdrLoadDll, PVOID pwsDllPath, PVOID pwsDllPathLength)
  66. {
  67. UNICODE_STRING usDllName;
  68. ULONG DllCharacteristics = 0;
  69. PVOID DllHandle = 0;
  70. usDllName.Length = (USHORT) pwsDllPathLength;
  71. usDllName.MaximumLength = usDllName.Length + 2;
  72. usDllName.Buffer = (WCHAR*) pwsDllPath;
  73. __asm
  74. {
  75. pushad      lea eax, DllHandle
  76. push eax
  77. lea eax, usDllName
  78. push eax
  79. lea eax, DllCharacteristics
  80. push eax
  81. push 0
  82. call [lpLdrLoadDll]   nop
  83. nop
  84. popad   }
  85. }
  86. void APCMdlCodeEnd()
  87. {
  88. }

APC注入DLL(win7下有问题)的更多相关文章

  1. 分析恶意驱动(进程启动apc注入dll)

    一.前言  用IDA也有好些时间了,以前就只会用F5功能玩无壳无保护的裸驱动,感觉太坑了,这两天就开始看网上大牛的逆向. 今天记录一下sudami曾经逆向过的fuck.sys.第一遍自己走的时候漏掉了 ...

  2. Dll注入:Ring3 层 APC注入

    APC,即Asynchronous procedure call,异步程序调用APC注入的原理是:在一个进程中,当一个执行到SleepEx()或者WaitForSingleObjectEx()时,系统 ...

  3. Dll注入技术之APC注入

    APC注入的原理是利用当线程被唤醒时APC中的注册函数会被执行的机制,并以此去执行我们的DLL加载代码,进而完成DLL注入的目的,其具体流程如下:     1)当EXE里某个线程执行到SleepEx( ...

  4. DLL注入-APC注入

    APC注入 APC注入的原理是利用当线程被唤醒时APC中的注册函数会被执行的机制,并以此去执行我们的DLL加载代码,进而完成DLL注入的目的,其具体流程如下:     1)当EXE里某个线程执行到Sl ...

  5. win7下的PHP+IIS配置,找不到php5isapi.dll的问题,版本5.4.9

    原文:win7下的PHP+IIS配置,找不到php5isapi.dll的问题,版本5.4.9 问题:PHP新手配置,在官网上下载的压缩包.按网上的找的教程配置IIS时发现,在解压包里找不到php5is ...

  6. win8和win7下解决php5.3和5.4、5.5等不能加载php_curl.dll的终极解决办法 收藏

    win8和win7下解决php5.3和5.4.5.5等不能加载php_curl.dll的终极解决办法 收藏2015年01月11日 最近分别在WIN7和Windows8 上分别安装php 高版本!都遇到 ...

  7. win7 下注册dll文件失败

    1.win7 下注册dll文件失败,提示模块“xx.dll”已加载,但找不到入口点DllRegisterServer 原因:该dll文件非可注册组件,没有包含DllRegisterServer函数,可 ...

  8. D2007在win7下bordbk105N.dll 莫名其妙的问题。

    已经装过一次win7下d2007.再装一次就出现许多莫名其妙的问题.其中之一: Windows 7 64bit Delphi Debugger Fix / Workaround 2013-08-28 ...

  9. Windows x86/ x64 Ring3层注入Dll总结

    欢迎转载,转载请注明出处:http://www.cnblogs.com/uAreKongqi/p/6012353.html 0x00.前言 提到Dll的注入,立马能够想到的方法就有很多,比如利用远程线 ...

随机推荐

  1. 操作系统之IO管理

    IO系统结构 设备的分类 按数据组织分 块设备: 信息的存取总是以数据块为单位. 它属于有结构设备,如磁盘等. 磁盘设备的基本特征是传输速率较高,以及可寻址,即对它可随机地读/写任一块. 字符设备: ...

  2. 每天一个Linux命令:cd(2)

    cd cd命令用来切换工作目录至dirname. 其中dirName表示法可为绝对路径或相对路径.若目录名称省略,则变换至使用者的home directory(也就是刚login时所在的目录).另外, ...

  3. js手机滚屏效果

    原文地址:https://github.com/yanhaijing/zepto.fullpage 第一步:基于移动端的浏览体验,在头部添加浏览器渲染的分辨率 <meta name=" ...

  4. NX二次开发-Block UI C++界面Face Collector(面收集器)控件的获取(持续补充 )

    Face Collector(面收集器)控件的获取 NX9+VS2012 #include <uf.h> #include <uf_obj.h> UF_initialize() ...

  5. es批量索引

    使用Python操作Elasticsearch数据索引的教程 这篇文章主要介绍了使用Python操作Elasticsearch数据索引的教程,Elasticsearch处理数据索引非常高效,要的朋友可 ...

  6. AntiPlug

    反插件工程 #pragma once #ifndef __ENHANFUNC_H__ #define __ENHANFUNC_H__ #include <iostream> #includ ...

  7. Java数据结构----集合

    Java的集合可以分为两类, 第一类是以数组为代表,这类集合可以描述线性表类型的数据结构,以Collection为基类,其中自己用过或者了解的有 实现List接口的类:LinkedList,Array ...

  8. 如何上传代码至GitHub

    环境准备: git GitHub账号 步骤: 1.登录github创建一个新的项目  参数说明: Repository name: 仓库名称 Description(可选): 仓库描述介绍 Publi ...

  9. Java内存通道

    对文件执行I/O的另一种方法是将文件的一个区域映射到物理内存,并将其作为内存数组.可以使用MappedByteBuffer来执行内存映射文件I/O. 要使用内存映射文件I/O,请为文件获取FileCh ...

  10. Java并发主要操作

    核心Java提供对多线程程序的完全控制. 也可以开发一个可以根据您的要求完全暂停,恢复或停止的多线程程序. 有各种静态方法可以用于线程对象来控制它们的行为. 下表列出了这些方法 - 编号 方法 说明描 ...