首页
社区
课程
招聘
[原创]AppInit注入的那些事
发表于: 2016-5-20 10:07 5921

[原创]AppInit注入的那些事

2016-5-20 10:07
5921

记得以前在哪里(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


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 3
支持
分享
最新回复 (7)
雪    币: 3407
活跃值: (1242)
能力值: ( LV13,RANK:335 )
在线值:
发帖
回帖
粉丝
2
有个现象,之前那样把MessageBoxA写在dllmain里面并不是所有的进程都加载不上,比如我自己写的控制台程序load_dll_test.exe就可以成功加载dll,调试了一下,在注入的dll调用dllmain之前,USP10!csCache已经被初始化了。

是什么原因导致了不同的进程里面USP10!csCache初始化有的在AppInit注入的DllMain之前有的之后,这个还没探究明白。写在这里备忘,有空再跟进。
2016-5-20 10:13
0
雪    币: 78
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
好~~刨根究底
2016-5-20 10:28
0
雪    币: 22
活跃值: (458)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
good!
2016-5-20 10:43
0
雪    币: 284
活跃值: (250)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
5
6666,很屌
2016-5-20 12:32
0
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
dllmain 应该避免使用LoadLibrary,几年前的大量资料都研究过这点。加载DLL会用到一个锁,所以在递归加载DLL时会导致死锁。
2016-5-20 16:05
0
雪    币: 110
活跃值: (204)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
顶一个,也应该避免使用WaitForSingleObject等待类的函数,也容易造成死锁
2016-5-20 16:37
0
雪    币: 3407
活跃值: (1242)
能力值: ( LV13,RANK:335 )
在线值:
发帖
回帖
粉丝
8
你这个说法不准确哈。LoaderLock这个锁是可以递归锁住的。也就是说同一个线程里面可以多次对这个锁加锁,DllMain里面调用LoadLibrary是没有问题的。
2016-5-20 16:57
0
游客
登录 | 注册 方可回帖
返回
//