sce module补丁丁是怎么回事

求解 巨人那个 sce module补丁怎么用= =_psv破解吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:55,104贴子:
求解 巨人那个 sce module补丁怎么用= =
首先,巨人没有制造能力...
你们都说改版后,巨人简...
二楼贴卡组
楼主今天无聊,打巨人碰...
表示之前漫画已全部看了...
新人玩了一个月了,目前...
近日这款游戏在朋友圈被传疯了
直接改后缀zip覆盖可以,直接上传也可以
楼主后来解决了吗
贴吧热议榜
使用签名档&&
保存至快速回贴2014年6月 Linux/Unix社区大版内专家分月排行榜第二2014年1月 Linux/Unix社区大版内专家分月排行榜第二2013年11月 Linux/Unix社区大版内专家分月排行榜第二2010年6月 Windows专区大版内专家分月排行榜第二2010年4月 Windows专区大版内专家分月排行榜第二2010年3月 Windows专区大版内专家分月排行榜第二2009年12月 Windows专区大版内专家分月排行榜第二2009年11月 Windows专区大版内专家分月排行榜第二2008年7月 Windows专区大版内专家分月排行榜第二2008年1月 Windows专区大版内专家分月排行榜第二2007年12月 Windows专区大版内专家分月排行榜第二2007年11月 Windows专区大版内专家分月排行榜第二2007年10月 Windows专区大版内专家分月排行榜第二2007年6月 Windows专区大版内专家分月排行榜第二
2014年7月 Linux/Unix社区大版内专家分月排行榜第三2014年4月 Linux/Unix社区大版内专家分月排行榜第三2013年1月 Linux/Unix社区大版内专家分月排行榜第三2010年5月 Windows专区大版内专家分月排行榜第三2009年9月 Windows专区大版内专家分月排行榜第三2009年8月 Windows专区大版内专家分月排行榜第三2008年8月 Windows专区大版内专家分月排行榜第三2008年6月 Windows专区大版内专家分月排行榜第三2007年9月 Windows专区大版内专家分月排行榜第三2007年7月 Windows专区大版内专家分月排行榜第三2007年4月 Windows专区大版内专家分月排行榜第三
2013年9月 Windows专区大版内专家分月排行榜第一
2013年1月 Windows专区大版内专家分月排行榜第二2012年4月 Windows专区大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。Windows Modules Installer Worker是什么进程?硬盘占用100%的原因分析
作者:佚名
字体:[ ] 来源:互联网 时间:10-09 10:25:57
Windows Modules Installer Worker是什么进程?很多朋友都不是很清楚,下面脚本之家小编就为大家介绍一下,以及向大家分析硬盘占用100%的原因,一起来看看吧!
&  Windows Modules Installer Worker是什么进程?很多人都不是很清楚,下面就让小编为大家详细介绍一下吧!~
  禁用Windows Modules Installer Worker进程用于保证系统正常运行涉及到系统的安全和稳定,禁用该进程弊大于利,不建议朋友禁用。
  Windows Modules Installer Worker是什么进程
  Windows Modules Installer Worker是一个系统后台进程,文件名称为tiworker,是微软Windows操作系统的一部分。用于Windows Update(自动更新),用于安装某些微软发布的安装包,进行系统文件的修改或替换;
  Windows Modules Installer Worker是Windows正常进程,会按照设定的时间,定时维护系统。通常Win8安装后一段时间或者系统刚启动时,用时较长,导致Windows开机和运行变慢。该进程维护系统的作用表现在:删除临时文件,整理系统盘碎片,会进行全盘杀毒,自动安装补丁等等,以及一些其他优化。
  Windows Modules Installer Worker进程硬盘占用100%的原因分析
  系统在安装一些系统模块,或者Windows Update正在自动下载安装安全更新,或者当一个更新安装失败时,Windows Modules Installer Worker会不断访问硬盘驱动器,造成硬盘占用100%的情况发生。
  以上就是Windows Modules Installer Worker是什么进程以及硬盘占用100%的原因分析,希望能帮到大家!谢谢阅读!
大家感兴趣的内容
12345678910
最近更新的内容查看: 3976|回复: 11
win7调试机制之七:DbgkpPostFakeModuleMessages分析
阅读权限200
在线时间3644 小时
当前用户组为 坛主当前积分为 1433, 该用户为特殊用户。
主题精华积分
梦织未来()
作者:mengwuji
根据前面的分析,我们知晓了DbgkpPostFakeThreadMessages函数的定义与实现。DbgkpPostFakeModuleMessages函数之前第二个参数之前没分析出来,但是它的第二个参数恰好是DbgkpPostFakeThreadMessages第四个参数指针里面的值;所以DbgkpPostFakeModuleMessages函数定义如下:
DbgkpPostFakeModuleMessages (
& & IN PEPROCESS Process,& && && && && & //被调试进程& && && && && & 寄存器ecx传参
& & IN PETHREAD Thread,& && && && && && && && &//应该是被调试进程的第一个线程
& & IN PDEBUG_OBJECT DebugObject& && &&&//调试对象
& & );
820b5c9c& && &&&push& & 0E8h
820b5ca1& && &&&push& & offset nt! ?? ::FNODOBFM::`string'+0xc2d8)
820b5ca6& && &&&call& & nt!_SEH_prolog4 (81e86240)
820b5cab& && &&&mov& &&&edi,ecx& && && && && && && && && && && && && & //edi = Process
820b5cad& && &&&mov& &&&eax,dword ptr [edi+1A8h]& && && && && & //eax = Process-&Peb
820b5cb3& && &&&xor& &&&esi,esi
820b5cb5& && &&&mov& &&&dword ptr [ebp-4],esi
820b5cb8& && &&&mov& &&&eax,dword ptr [eax+0Ch]& && && && && && && && &//eax = Process-&Peb-&Ldr
820b5cbb& && &&&lea& &&&ecx,[eax+0Ch]& && && && && && && && && && &&&//&eax = Process-&Peb-&Ldr-&InLoadOrderModuleList
820b5cbe& && &&&mov& &&&dword ptr [ebp-24h],ecx& && && && && && && && &//[ebp-0x24]是储存链表头节点
820b5cc1& && &&&mov& &&&eax,dword ptr [nt!MmUserProbeAddress (81f70850)]
820b5cc6& && &&&cmp& &&&ecx,eax& && && && && && && && && && && && && & //低于跳转,说明是用户层地址
820b5cc8& && &&&jb& && &nt!DbgkpPostModuleMessages+0x30 (820b5ccc)
820b5cca& && &&&mov& &&&ecx,eax
820b5ccc& && &&&mov& &&&al,byte ptr [ecx]& && && && && && && && &//可读检测,相当于执行ProbeForReadSmallStructure
820b5cce& && &&&mov& &&&eax,dword ptr [ebp-24h]& && && && && && && && &//eax是链表节点头
820b5cd1& && &&&mov& &&&ebx,dword ptr [eax]& && && && && && && && &//eax-&Flink
820b5cd3& && &&&mov& &&&dword ptr [ebp-20h],ebx& && && && && && && && &//[ebp-20h]保存eax-&Flink
820b5cd6& && &&&mov& &&&dword ptr [ebp-1Ch],esi
820b5cd9& && &&&cmp& &&&ebx,dword ptr [ebp-24h]& && && && && && && && &//这里开始比较,也是循环的开始
820b5cdc& && &&&je& && &nt!DbgkpPostModuleMessages+0x18a (820b5e26)//遍历结束了,退出
820b5ce2& && &&&mov& &&&eax,dword ptr [ebp-1Ch]& && && && && && && && &//这个应该是一个计数,表示已经发送多少个模块的消息
820b5ce5& && &&&cmp& &&&eax,dword ptr [nt!DbgkpMaxModuleMsgs (81f70ccc)]
820b5ceb& && &&&jae& &&&nt!DbgkpPostModuleMessages+0x18a (820b5e26)& && &&&//消息数不能大于DbgkpMaxModuleMsgs的值,否则退出
820b5cf1& && &&&cmp& &&&eax,1
820b5cf4& && &&&jbe& &&&nt!DbgkpPostModuleMessages+0x163 (820b5dff)& && &&&//eax&=1跳转。。。为什么要小于等于1呢....
820b5cfa& && &&&push& & 0A8h& && && && && && && && && && && && && & //0xA8大小前面出现过,这种结构分析过应该是DBGKM_DEBUG
820b5cff& && &&&push& & esi
820b5d00& && &&&lea& &&&eax,[ebp-0F8h]
820b5d06& && &&&push& & eax
820b5d07& && &&&call& & nt!memset (81e404c0)& && && && && && && && &//这个是对DBGKM_APIMSG结构清零操作,假设此结构为ApiMsg
820b5d0c& && &&&add& &&&esp,0Ch
820b5d0f& && &&&mov& &&&ecx,ebx
820b5d11& && &&&mov& &&&eax,dword ptr [nt!MmUserProbeAddress (81f70850)]
820b5d16& && &&&cmp& &&&ebx,eax
820b5d18& && &&&jb& && &nt!DbgkpPostModuleMessages+0x80 (820b5d1c)
820b5d1a& && &&&mov& &&&ecx,eax
820b5d1c& && &&&mov& &&&al,byte ptr [ecx]
//以上几句相当于执行ProbeForReadSmallStructure函数,对链表的安全检查
820b5d1e& && &&&mov dword ptr [ebp-0E0h],5& && && && && && && && &//ApiMsg.ApiNumber = DbgKmLoadDllA
820b5d28& && &&&mov& &&&eax,dword ptr [ebp-20h]& && && && && && && && &//链表节点,每个链表是LDR_DATA_TABLE_ENTRY结构
820b5d2b& && &&&mov& &&&ecx,dword ptr [eax+18h]& && && && && && && && &//ecx = DllBase
820b5d2e& && &&&mov& &&&dword ptr [ebp-0D4h],ecx& && && && && & //ApiMsg.u.LoadDll.BaseOfDll = DllBase
820b5d34& && &&&mov& &&&eax,dword ptr [nt!MmUserProbeAddress (81f70850)]
820b5d39& && &&&cmp& &&&ecx,eax
820b5d3b& && &&&jb& && &nt!DbgkpPostModuleMessages+0xa3 (820b5d3f)
820b5d3d& && &&&mov& &&&ecx,eax
820b5d3f& && &&&mov& &&&al,byte ptr [ecx]
//以上几句相当于调用ProbeForReadSmallStructure函数
820b5d41& && &&&push& & dword ptr [ebp-0D4h]& && && && && && && && &//push DllBase
820b5d47& && &&&call& & nt!RtlImageNtHeader (81eaed7d)& && && && && & //call RtlImageNtHeader
820b5d4c& && &&&cmp& &&&eax,esi& && && && && && && && && && && && && & //调用失败的话跳转
820b5d4e& && &&&je& && &nt!DbgkpPostModuleMessages+0xc6 (820b5d62)
820b5d50& && &&&mov& &&&ecx,dword ptr [eax+0Ch]
820b5d53& && &&&mov& &&&dword ptr [ebp-0D0h],ecx& && && && && &
//ApiMsg.u.LoadDll.DebugInfoFileOffset = NtHeaders-&FileHeader.PointerToSymbolT
820b5d59& && &&&mov& &&&ecx,dword ptr [eax+10h]
820b5d5c& && &&&mov& &&&dword ptr [ebp-0CCh],ecx
//ApiMsg.u.LoadDll.DebugInfoSize = NtHeaders-&FileHeader.NumberOfS
820b5d62& && &&&lea& &&&ecx,[ebp-2Ch]
820b5d65& && &&&push& & ecx& && && && && && && && && && && && && & //FileName
820b5d66& && &&&push& & eax& && && && && && && && && && && && && & //模块nt头部
820b5d67& && &&&call& & nt!MmGetFileNameForAddress (820d4a08)& && &&&//通过进程模块地址得到模块名
820b5d6c& && &&&cmp& &&&eax,esi& && && && && && && && && && && && && & //如果失败跳转
820b5d6e& && &&&jl& && &nt!DbgkpPostModuleMessages+0x121 (820b5dbd)
820b5d70& && &&&mov& &&&dword ptr [ebp-44h],18h
820b5d77& && &&&mov& &&&dword ptr [ebp-40h],esi
820b5d7a& && &&&mov& &&&dword ptr [ebp-38h],640h
820b5d81& && &&&lea& &&&eax,[ebp-2Ch]
820b5d84& && &&&mov& &&&dword ptr [ebp-3Ch],eax
820b5d87& && &&&mov& &&&dword ptr [ebp-34h],esi
820b5d8a& && &&&mov& &&&dword ptr [ebp-30h],esi
//因为下面要调用ZwOpenFile函数,所以上面操作实际是调用InitializeObjectAttributes 函数
820b5d8d& && &&&push& & 20h
820b5d8f& && &&&push& & 7
820b5d91& && &&&lea& &&&eax,[ebp-4Ch]
820b5d94& && &&&push& & eax
820b5d95& && &&&lea& &&&eax,[ebp-44h]
820b5d98& && &&&push& & eax
820b5d99& && &&&push& & h
820b5d9e& && &&&lea& &&&eax,[ebp-0D8h]& && && && && && && && && && &&&//&ApiMsg.u.LoadDll.FileHandle
820b5da4& && &&&push& & eax
820b5da5& && &&&call& & nt!ZwOpenFile (81e42bfc)& && && && && & //打开模块文件
820b5daa& && &&&cmp& &&&eax,esi& && && && && && && && && && && && && & //成功跳转
820b5dac& && &&&jge& &&&nt!DbgkpPostModuleMessages+0x118 (820b5db4)
820b5dae& && &&&mov& &&&dword ptr [ebp-0D8h],esi& && && && && & //失败的话:ApiMsg.u.LoadDll.FileHandle = 0;
820b5db4& && &&&push& & esi
820b5db5& && &&&push& & dword ptr [ebp-28h]
820b5db8& && &&&call& & nt!ExFreePoolWithTag (81f27aba)& && && && && &
//上面调用MmGetFileNameForAddress申请内存存放了模块名,所以这里释放
820b5dbd& && &&&lea& &&&eax,[ebp-0F8h]& && && && && && && && && && &&&//eax = &ApiMsg
820b5dc3& && &&&cmp& &&&dword ptr [ebp+0Ch],esi& && && && && && && && &//DebugObject==0 ?
820b5dc6& && &&&je& && &nt!DbgkpPostModuleMessages+0x13d (820b5dd9)& && &&&//DebugObject为零跳转
820b5dc8& && &&&push& & dword ptr [ebp+0Ch]
820b5dcb& && &&&push& & 2
820b5dcd& && &&&push& & eax
820b5dce& && &&&push& & dword ptr [ebp+8]
820b5dd1& && &&&push& & edi
820b5dd2& && &&&call& & nt!DbgkpQueueMessage (820b5156)& && && && && & //调试消息插入队列
820b5dd7& && &&&jmp& &&&nt!DbgkpPostModuleMessages+0x14b (820b5de7)
820b5dd9& && &&&push& & eax
820b5dda& && &&&push& & 3
820b5ddc& && &&&pop& &&&eax
820b5ddd& && &&&call& & nt!DbgkpSendApiMessage (820b68cb)& && &&&//也是消息插入队列,不过和DbgkpQueueMessage有点区别
820b5de2& && &&&mov& &&&eax,0C0000001h& && && && && && && && && && &&&//设置错误码
820b5de7& && &&&cmp& &&&eax,esi& && && && && && && && && && && && && & //有错误的话跳转
820b5de9& && &&&jge& &&&nt!DbgkpPostModuleMessages+0x163 (820b5dff)
820b5deb& && &&&cmp& &&&dword ptr [ebp-0D8h],esi& && && && && & //ApiMsg.u.LoadDll.FileHandle==0 ?
820b5df1& && &&&je& && &nt!DbgkpPostModuleMessages+0x163 (820b5dff)
820b5df3& && &&&push& & esi
820b5df4& && &&&push& & dword ptr [ebp-0D8h]
820b5dfa& && &&&call& & nt!ObCloseHandle (82048b62)& && && && && & //如果打开模块成功的话,在这里关闭句柄
820b5dff& && &&&mov& &&&ecx,dword ptr [ebp-20h]
820b5e02& && &&&mov& &&&eax,dword ptr [nt!MmUserProbeAddress (81f70850)]
820b5e07& && &&&cmp& &&&ecx,eax
820b5e09& && &&&jb& && &nt!DbgkpPostModuleMessages+0x171 (820b5e0d)
820b5e0b& && &&&mov& &&&ecx,eax
820b5e0d& && &&&mov& &&&al,byte ptr [ecx]
//上面几句调用ProbeForReadSmallStructure函数
820b5e0f& && &&&mov& &&&eax,dword ptr [ebp-20h]
820b5e12& && &&&mov& &&&ebx,dword ptr [eax]& && && && && && && && &//当前节点的前一个节点
820b5e14& && &&&mov& &&&dword ptr [ebp-20h],ebx& && && && && && && && &//赋值为当前节点
820b5e17& && &&&inc& &&&dword ptr [ebp-1Ch]& && && && && && && && &//模块计数+1
820b5e1a& && &&&jmp& &&&nt!DbgkpPostModuleMessages+0x3d (820b5cd9)
820b5e1f& && &&&xor& &&&eax,eax
820b5e21& && &&&inc& &&&eax
820b5e22& && &&&ret
820b5e23& && &&&mov& &&&esp,dword ptr [ebp-18h]
820b5e26& && &&&mov& &&&dword ptr [ebp-4],0FFFFFFFEh
820b5e2d& && &&&call& & nt!_SEH_epilog4 (81e86285)
820b5e32& && &&&ret& &&&8
复制代码下面还原成c代码看看,看了汇编后对着wrk也看了一遍,发现相似度极高,所以下面直接抄袭wrk的代码,然后稍微改动了点儿。
NTSTATUS
DbgkpPostFakeModuleMessages (
& & IN PEPROCESS Process,
& & IN PETHREAD Thread,
& & IN PDEBUG_OBJECT DebugObject)
{
& && &&&PPEB Peb = Process-&P
& && &&&PPEB_LDR_DATA L
& && &&&PLIST_ENTRY LdrHead, LdrN
& && &&&PLDR_DATA_TABLE_ENTRY LdrE
& && &&&DBGKM_APIMSG ApiM
& && &&&ULONG
& && &&&OBJECT_ATTRIBUTES
& && &&&UNICODE_STRING N
& && &&&PIMAGE_NT_HEADERS NtH
& && &&&NTSTATUS S
& && &&&IO_STATUS_BLOCK
& && &&&if (Peb == NULL) {
& && && && && & return STATUS_SUCCESS;
& && &&&}
& && &&&try {
& && && && && & Ldr = Peb-&L
& && && && && & LdrHead = &Ldr-&InLoadOrderModuleL
& && && && && & ProbeForReadSmallStructure (LdrHead, sizeof (LIST_ENTRY), sizeof (UCHAR));
& && && && && & for (LdrNext = LdrHead-&Flink, i = 0;
& && && && && && && && &LdrNext != LdrHead && i & 500;
& && && && && && && && &LdrNext = LdrNext-&Flink, i++) {
& && && && && && && && &//这里不晓得为什么要大于1....跳过前两个模块?
& && && && && && && && &if (i & 1) {
& && && && && && && && && && &&&//准备好消息DBGKM_APIMSG消息数据包
& && && && && && && && && && &&&RtlZeroMemory (&ApiMsg, sizeof (ApiMsg));
& && && && && && && && && && &&&//实际没有下面一句也行,因为LdrNext也是LdrEntry
& && && && && && && && && && &&&LdrEntry = CONTAINING_RECORD (LdrNext, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
& && && && && && && && && && &&&ProbeForReadSmallStructure (LdrEntry, sizeof (LDR_DATA_TABLE_ENTRY), sizeof (UCHAR));
& && && && && && && && && && &&&//说明是加载模块的消息
& && && && && && && && && && &&&ApiMsg.ApiNumber = DbgKmLoadDllA
& && && && && && && && && && &&&ApiMsg.u.LoadDll.BaseOfDll = LdrEntry-&DllB
& && && && && && && && && && &&&ProbeForReadSmallStructure (ApiMsg.u.LoadDll.BaseOfDll, sizeof (IMAGE_DOS_HEADER), sizeof (UCHAR));
& && && && && && && && && && &&&//得到模块的nt头
& && && && && && && && && && &&&NtHeaders = RtlImageNtHeader (ApiMsg.u.LoadDll.BaseOfDll);
& && && && && && && && && && &&&if (NtHeaders) {
& && && && && && && && && && && && && & //设置模块的符号链接
& && && && && && && && && && && && && & ApiMsg.u.LoadDll.DebugInfoFileOffset = NtHeaders-&FileHeader.PointerToSymbolT
& && && && && && && && && && && && && & ApiMsg.u.LoadDll.DebugInfoSize = NtHeaders-&FileHeader.NumberOfS
& && && && && && && && && && &&&}
& && && && && && && && && && &&&//MmGetFileNameForAddress函数是通过一个地址获取一个模块的名字。内部实现是先获取一个vad结构,实际就是遍历进程模块的那个平衡二叉树。然后在把模块的名字返回到第二个参数
& && && && && && && && && && &&&Status = MmGetFileNameForAddress (NtHeaders, &Name);
& && && && && && && && && && &&&if (NT_SUCCESS (Status)) {
& && && && && && && && && && && && && & //成功得到模块名字的话,那么就获取此模块的句柄
& && && && && && && && && && && && && & InitializeObjectAttributes (&oa,
& && && && && && && && && && && && && && && && &&Name,
& && && && && && && && && && && && && && && && &OBJ_FORCE_ACCESS_CHECK|OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,
& && && && && && && && && && && && && && && && &NULL,
& && && && && && && && && && && && && && && && &NULL);
& && && && && && && && && && && && && & Status = ZwOpenFile (&ApiMsg.u.LoadDll.FileHandle,
& && && && && && && && && && && && && && && && &GENERIC_READ|SYNCHRONIZE,
& && && && && && && && && && && && && && && && &&oa,
& && && && && && && && && && && && && && && && &&iosb,
& && && && && && && && && && && && && && && && &FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
& && && && && && && && && && && && && && && && &FILE_SYNCHRONOUS_IO_NONALERT);
& && && && && && && && && && && && && & if (!NT_SUCCESS (Status)) {
& && && && && && && && && && && && && && && && &ApiMsg.u.LoadDll.FileHandle = NULL;
& && && && && && && && && && && && && & }
& && && && && && && && && && && && && & //因为MmGetFileNameForAddress函数内部会为存放名字的缓冲区申请内存,所以在这里要释放掉,不然会造成内存泄露
& && && && && && && && && && && && && & ExFreePool (Name.Buffer);
& && && && && && && && && && &&&}
& && && && && && && && && && &&&//这里来判断是否有调试对象存在
& && && && && && && && && && &&&if(DebugObject)
& && && && && && && && && && &&&{
& && && && && && && && && && && && && & //存在的话就直接调用DbgkpQueueMessage把调试消息插入调试对象的队列,并且该消息是不阻塞的(就是说不等到完成后才返回)
& && && && && && && && && && && && && & Status = DbgkpQueueMessage (Process,
& && && && && && && && && && && && && && && && &Thread,
& && && && && && && && && && && && && && && && &&ApiMsg,
& && && && && && && && && && && && && && && && &DEBUG_EVENT_NOWAIT,
& && && && && && && && && && && && && && && && &DebugObject);
& && && && && && && && && && &&&}else{
& && && && && && && && && && && && && & //这个函数也可以发送调试消息。原型我分析了下可能如下:
& && && && && && && && && && && && && & /*
& && && && && && && && && && && && && & NTSTATUS DbgkpSendApiMessage(
& && && && && && && && && && && && && && && && &IN ULONG Flags,& && && && && && && && && && &&&//一个标记
& && && && && && && && && && && && && && && && &IN DBGKM_APIMSG *ApiMsg& && && && && & //消息包
& && && && && && && && && && && && && && && && &);
& && && && && && && && && && && && && & */
& && && && && && && && && && && && && & //从这个函数的内部实现上看,它所发送的消息是阻塞的
& && && && && && && && && && && && && & DbgkpSendApiMessage(0x3,&ApiMsg);
& && && && && && && && && && && && && & //在这里设置下错误码,为了后面关闭模块句柄
& && && && && && && && && && && && && & Status = STATUS_UNSUCCESSFUL;
& && && && && && && && && && &&&}
& && && && && && && && && && &&&
& && && && && && && && && && &&&if (!NT_SUCCESS (Status) && ApiMsg.u.LoadDll.FileHandle != NULL) {
& && && && && && && && && && && && && & //这里关闭句柄可能是在阻塞模式下要手动关闭句柄.....这个只是猜测,要等到后面看接收调试消息的函数时才晓得是怎么回事儿
& && && && && && && && && && && && && & ObCloseHandle (ApiMsg.u.LoadDll.FileHandle, KernelMode);
& && && && && && && && && && &&&}
& && && && && && && && &}
& && && && && && && && &ProbeForReadSmallStructure (LdrNext, sizeof (LIST_ENTRY), sizeof (UCHAR));
& && && && && & }
& & } except (EXCEPTION_EXECUTE_HANDLER) {
& & }
& & return STATUS_SUCCESS;
}
复制代码这个函数也十分简单,它的工作可以概括如下:
1,遍历被调试进程所有模块,并得到每个模块的句柄。
2,为每个模块构造DBGKM_APIMSG结构,并发送调试消息;根据DebugObject是否存在来决定发送的消息是阻塞的还是非阻塞的。
大概就是这样吧,DbgkpSendApiMessage函数内部比较简单这里也分析一下吧。它的汇编代码如下:
NTSTATUS DbgkpSendApiMessage(
& && &&&IN ULONG Flags,& && && && && && && && && && &&&//一个标记& && &&&eax传参
& && &&&IN DBGKM_APIMSG *ApiMsg& && && && && & //消息包
& && &&&);
820b68cb& && &&&mov& &&&edi,edi
820b68cd& && &&&push& & ebp
820b68ce& && &&&mov& &&&ebp,esp
820b68d0& && &&&push& & ebx
820b68d1& && &&&mov& &&&ebx,dword ptr [ebp+8]& && && && && && && && && && && && && & //ApiMsg
820b68d4& && &&&push& & esi
820b68d5& && &&&push& & edi
820b68d6& && &&&mov& &&&esi,eax
820b68d8& && &&&mov& &&&edi,esi
820b68da& && &&&and& &&&edi,1& && && && && && && && && && && && && && && && && && && && && && && && &//Flags&0x1==0 ?
820b68dd& && &&&je& && &nt!DbgkpSendApiMessage+0x1c (820b68e7)& && &&&//上面结果为零跳转
820b68df& && &&&call& & nt!DbgkpSuspendProcess (820b6965)& && && && && & //暂停进程
820b68e4& && &&&movzx& &edi,al
820b68e7& && &&&mov& &&&eax,dword ptr fs:[h]& && && && && && && && &//得到当前线程
820b68ed& && &&&mov& &&&ecx,dword ptr fs:[124h]& && && && && && && && && && && && && & //得到当前线程
820b68f4& && &&&push& & 0
820b68f6& && &&&and& &&&esi,2
820b68f9& && &&&shl& &&&esi,5
820b68fc& && &&&push& & esi& && && && && && && && && && && && && && && && && && && && && && && && && && &&&//这里得出来的esi要么是0,要么是0x40
820b68fd& && &&&push& & ebx
820b68fe& && &&&mov& &&&dword ptr [ebx+1Ch],103h& && && && && && && && && && &&&//ApiMsg.ReturnedStatus = 0x103h
820b6905& && &&&mov& &&&eax,dword ptr [eax+50h]& && && && && && && && && && && && && & //得到当前进程
820b6908& && &&&push& & ecx
820b6909& && &&&push& & eax
820b690a& && &&&call& & nt!DbgkpQueueMessage (820b5156)& && && && && && && && &//发送消息,这里的消息明显发送阻塞的消息
820b690f& && &&&push& & 0
820b6911& && &&&push& & 0
820b6913& && &&&push& & 0FFFFFFFFh
820b6915& && &&&mov& &&&esi,eax
820b6917& && &&&call& & nt!ZwFlushInstructionCache (81e427c4)& && &&&//刷新缓存?
820b691c& && &&&cmp& &&&edi,1
820b691f& && &&&jne& &&&nt!DbgkpSendApiMessage+0x5b (820b6926)
820b6921& && &&&call& & nt!KeThawAllThreads (81ee4f7b)& && && && && && && && &//如果暂停过进程那么现在就恢复进程
820b6926& && &&&pop& &&&edi
820b6927& && &&&mov& &&&eax,esi
820b6929& && &&&pop& &&&esi
820b692a& && &&&pop& &&&ebx
820b692b& && &&&pop& &&&ebp
820b692c& && &&&ret& &&&4
复制代码函数的c代码如下:
NTSTATUS DbgkpSendApiMessage(
& && &&&IN ULONG Flags,
& && &&&IN DBGKM_APIMSG *ApiMsg
& && &&&)
{
& && &&&BOOLEAN& && &&&bIsS
& && &&&PEPROCESS P
& && &&&PERHREAD T
& && &&&NTSTATUS S
& && &&&if(Flags&0x1)
& && && && && & bIsSuspend = DbgkpSuspendProcess();
& && &&&Process = PsGetCurrentProcess();
& && &&&Thread = PsGetCurrentThread();
& && &&&ApiMsg-&ReturnedStatus = 0x103h;
& && &&&Status = DbgkpQueueMessage(
& && && && && & Process,
& && && && && & Thread,
& && && && && & ApiMsg,
& && && && && & (Flags&0x2)&&0x5,
& && && && && & 0);
& && &&&ZwFlushInstructionCache(-0x1,0,0);
& && &&&if(bIsSuspend)
& && && && && & KeThawAllThreads();
& && &&&return S
}
复制代码此函数十分简单,里面调用了暂停进程的函数DbgkpSuspendProcess,这个函数也一并给出来吧:
BOOLEAN DbgkpSuspendProcess();
820b6965& && &&&mov& &&&edi,edi
820b6967& && &&&push& & ecx
820b6968& && &&&mov& &&&eax,dword ptr fs:[h]
820b696e& && &&&mov& &&&eax,dword ptr [eax+50h]& && && && && && && && && && && && && & //得到当前进程Process
820b6971& && &&&test& & byte ptr [eax+270h],8& && && && && && && && && && && && && & //Process-&ProcessDelete==1 ?
820b6978& && &&&jne& &&&nt!DbgkpSuspendProcess+0x1e (820b6983)
820b697a& && &&&call& & nt!KeFreezeAllThreads (81ee4c03)& && && && && & //暂停进程所有线程
820b697f& && &&&mov& &&&al,1
820b6981& && &&&pop& &&&ecx
820b6982& && &&&ret
820b6983& && &&&xor& &&&al,al
820b6985& && &&&pop& &&&ecx
820b6986& && &&&ret
复制代码它的c代码如下:
BOOLEAN DbgkpSuspendProcess()
{
& && &&&PEPROCESS P
& && &&&Process = PsGetCurrentProcess();
& && &&&if(Process-&ProcessDelete==0)
& && &&&{
& && && && && & KeFreezeAllThreads();
& && && && && & return TRUE;
& && &&&}
& && &&&return FALSE;
}
复制代码好了,几个都分析完了,下一篇看看如何设置DeubgObject给目标进程。
阅读权限10
在线时间147 小时
当前用户组为 梦之起当前积分为 53, 升到下一级还需要 147 点。
主题精华积分
老大厉害啊,给我源码我都编译不出自己的调试子系统.
阅读权限10
在线时间233 小时
当前用户组为 梦之起当前积分为 124, 升到下一级还需要 76 点。
主题精华积分
看来看雪那篇文章 打水漂了。。
阅读权限10
在线时间233 小时
当前用户组为 梦之起当前积分为 124, 升到下一级还需要 76 点。
主题精华积分
无极你打算写内核调试器还是ring3 调试器?
阅读权限10
在线时间147 小时
当前用户组为 梦之起当前积分为 53, 升到下一级还需要 147 点。
主题精华积分
speday 发表于
无极你打算写内核调试器还是ring3 调试器?
od应该是最好的调试器.
调试器是次要,隐藏调试器才是技术
阅读权限200
在线时间3644 小时
当前用户组为 坛主当前积分为 1433, 该用户为特殊用户。
主题精华积分
只要把调试机制搭建好了,都摸透了。想写ring3还是内核调试器都行,而且win2k之后调试机制的变化比较小,所以要想兼容nt系统的话可能没问题。
想隐藏调试器很简单,但是要隐藏od自身就有点麻烦,幸好现在很多都是检测是否有调试器而不是检测是否开启od。
阅读权限10
在线时间75 小时
当前用户组为 梦之起当前积分为 122, 升到下一级还需要 78 点。
主题精华积分
学习下梦大的
我的签到是为了加快人类进化!
阅读权限100
在线时间134 小时
当前用户组为 实习版主当前积分为 99, 该用户为特殊用户。
主题精华积分
学习学习~~~:)
阅读权限10
在线时间84 小时
当前用户组为 梦之起当前积分为 79, 升到下一级还需要 121 点。
主题精华积分
又学到东西咯。。
哎...今天够累的,签到来了...
阅读权限10
在线时间70 小时
当前用户组为 梦之起当前积分为 55, 升到下一级还需要 145 点。
主题精华积分
狂顶老大&&感觉这些才是学习的精髓所在 。。。。。对照着自己在XP上面逆一遍
阅读权限10
在线时间59 小时
当前用户组为 梦之起当前积分为 72, 升到下一级还需要 128 点。
主题精华积分
感谢梦大的付出
阅读权限10
在线时间2 小时
当前用户组为 梦之始当前积分为 2, 升到下一级还需要 48 点。
主题精华积分
顶一个,老梦太给力了,佩服
Powered by}

我要回帖

更多关于 systemmodule.dll补丁 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信