欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]AppInit注入的那些事

[原创]AppInit注入的那些事

记得以前在哪里(windows核心编程?)看见过一句话,AppInit注入的dll由于注入的时机较早,其他的一些系统dll还没有初始化,这个时候调用API要小心,可能会触发意想不到的异常。
见过这句话,没有遇见过,那就呵呵吧,早忘在脑后了。
直到我写出了这样的代码,

用AppInit注入的时候,notepad++.exe打开MessageBoxA并没有弹出对话框,还抛出了异常,见下图

结合汇编和ReacOS的代码,

RtlpWaitForCriticalSection(CriticalSection);参数CriticalSection全为0,
CriticalSection的类型为
typedef struct _RTL_CRITICAL_SECTION
{
    PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
    LONG LockCount;
    LONG RecursionCount;
    HANDLE OwningThread;
    HANDLE LockSemaphore;
    ULONG_PTR SpinCount;
} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;
typedef struct _RTL_CRITICAL_SECTION_DEBUG
{
    USHORT Type;
    USHORT CreatorBackTraceIndex;
    struct _RTL_CRITICAL_SECTION *CriticalSection;
    LIST_ENTRY ProcessLocksList;
    ULONG EntryCount;
    ULONG ContentionCount;
    ULONG Spare[2];
} RTL_CRITICAL_SECTION_DEBUG, *PRTL_CRITICAL_SECTION_DEBUG, RTL_RESOURCE_DEBUG, *PRTL_RESOURCE_DEBUG;
其中DebugInfo是一个指针(值为0),在访问这个指针0x14偏移的变量的时候报错了。
这个锁是什么锁呢,
windbg跟踪发现是USP10!csCache,并不知道是干什么用的。
在注入的dll的dllmain里面断点,查看USP10!csCache内存,发现全是0.
于是得出了结论:
在AppInit注入的Dll运行DllMain的时候USP10.dll已经加载,但是USP10!csCache这个锁并没有初始化,DllMain里面调用的MessgeBoxA会操作这个锁,所以抛异常,导致Dll加载不上。
如何解决:
代码写成这样吧。

coolboy4me
646535763@qq.com

上传的附件 QQ图片20160520095245.png
异常.png
ReactOS.png
ok.png

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功