-
-
[原创]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
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!