首页
论坛
课程
招聘
[分享]SDTrestore Version 0.2 学习注释存档
2008-1-12 10:42 12569

[分享]SDTrestore Version 0.2 学习注释存档

2008-1-12 10:42
12569
/********************************************************************************************
* Name   : SDTrestore Version 0.2
* Author : Coded by Chew Keong TAN
* Learner: sudami [[email]xiao_rui_119@163.com[/email]]
* Time   : 08/01/12
*
* Comment:
*  
*  适用 XP 和 WIN2K
*  SDT恢复是一个古老的技术了,这些天复习以前的知识,发现东西都忘了.正好找到了这份源码.
*  于是开始边注释边复习起来. 现在终于又把RING3下恢复SSDT的东西温习了一下,感觉很充实.
*  偶很菜,一开始看代码的时候,不知道如何下手,因为原作者的代码风格很乱,看得糊涂.于是偶
*  按照M$ 的代码风格重新注释了一遍,方便以后温习. 如果你还木有看过这份源码的话,在偶注释
*  的基础上应该会理解的更快些了.
*  
*  搜索了下坛子,发现没有关于这份源码的相关细节.于是偶来补充下.
*  存档的主要目的是方便以后学习这些知识的同学更快的找到资源,少走弯路. 老鸟飘过~
*
* Description:
*  
*  在RING3获得\device\physicalmemory 的读写权限(前提必须是Administrator). 从磁盘读取
*  ntoskrnl.exe,对齐后映射进内存(这需要我们自己来做),在其EAT中得到KeServiceDescriptorTable
*  相对于ntoskrnl.exe的偏移.把系统高端加载的ntoskrnl.exe 的SSDT地址映射到进程的虚拟地址空间里
*  推算出ServiseTable的地址后,把其所有内容映射到进程的虚拟地址空间里. 得到了ServiseTable的地址
*  但它里面的函数是否被HOOK过,并不知道.所以需要参照我们自己映射的ntoskrnl.exe中的ServiseTable
*  里函数的偏移来作比较.不相同,则被HOOK了,然后恢复之.
*  
*  btw: 90210 的那个搜索SSDT的方法好像不行.得到的地址不正确.而且导致系统直接重启
*
*********************************************************************************************/


注释风格类似如下:


BOOL
LoadPE (
char *exePtr,
MZHeader *inMZ,
PE_Header *inPE,
PE_ExtHeader *inpeXH,
SectionHeader *inSecHdr,
LPVOID ptrLoc
)

/*++

学习者: sudami [[email]xiao_rui_119@163.com[/email]]
时间 : 08/01/11

功能:
加载从磁盘读取的文件到内存,需要自己对齐

<PE加载到内存对齐后的示意图>
所有文件头 节 节 ... 节N
------------------------------------------------
|aa...aa######| a...a##| a...a###| ... | a...a##|
------------------------------------------------
注: a 表示实际数据; # 表示空隙,是内存中对齐后留出的空隙

参数:
exePtr - PE文件在磁盘中时起始的地址.还没有经过对齐.所以需要把它映射到内存

modulePos - [IN] 将磁盘上的文件读出来后,映射到进程的虚拟地址空间中,对齐后得到其起始地址.

outMZ - [OUT] 保存MZ头 IMAGE_DOS_HEADER

outPE - [OUT] 保存PE头 IMAGE_FILE_HEADER

outpeXH - [OUT] 保存扩展PE头 IMAGE_OPTIONAL_HEADER

outSecHdr - [OUT] 2级指针,保存Section头 IMAGE_SECTION_HEADER

ptrLoc - 根据内存中PE的大小调用HeapAlloc而分配的一块空闲内存区域.

返回: TRUE

--*/

{
char *outPtr = (char *)ptrLoc;

// 把所有文件头的数据全部拷贝到ptrLoc指向的地址处
// 然后地址按照PE在内存中的对齐方式往后挪
memcpy (outPtr, exePtr, inpeXH->sizeOfHeaders);
outPtr += GetAlignedSize (inpeXH->sizeOfHeaders, inpeXH->sectionAlignment);

// 拷贝所有的节数据到新的地址处. 复制的时候要知道每个节在文件中的实际大小.而不是在内存在对齐后的大小
for (int i = 0; i < inPE->numSections; i++) {

if (inSecHdr.sizeOfRawData > 0) { // sizeOfRawData 是节对齐后的长度
ULONG toRead = inSecHdr.sizeOfRawData;

if (toRead > inSecHdr.virtualSize) {
toRead = inSecHdr.virtualSize;
}

// 拷贝没个节的实际数据,然后把指针挪到每个节在内存中对齐后的位置处
memcpy (outPtr, exePtr + inSecHdr.pointerToRawData, toRead);

outPtr += GetAlignedSize (inSecHdr.virtualSize, inpeXH->sectionAlignment);
}
}

return true;
}


希望偶们这样的菜鸟能一起共同成长~

[公告]《安卓APP加固攻与防》训练营!Android逆向分析技能,干货满满,报名免费赠送一部手机!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (40)
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
colboy 活跃值 2008-1-12 12:51
2
0
[QUOTE=;]...[/QUOTE]
好东西!!!!!!!!!!
雪    币: 292
活跃值: 活跃值 (11)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
liuzewei 活跃值 3 2008-1-12 13:14
3
0
sudami~~~```排版很好!呵呵!
雪    币: 38
活跃值: 活跃值 (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
炉子 活跃值 3 2008-1-12 19:04
4
0
注释的不错 .
雪    币: 2071
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
Aker 活跃值 4 2008-1-12 22:44
5
0
支持,要是有兄弟们有时间把好代码都这样学习一遍并重构水平一定会大增
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
loien 活跃值 2008-1-12 23:19
6
0
爱死你了
雪    币: 108
活跃值: 活跃值 (61)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
combojiang 活跃值 26 2008-1-12 23:37
7
0
好,学习。。。
雪    币: 207
活跃值: 活跃值 (18)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
sislcb 活跃值 7 2008-1-13 09:17
8
0
呵呵,大米很强!
雪    币: 212
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wping 活跃值 2008-1-13 09:23
9
0
收了,原来RING3下也可以恢复SSDT
以前一直以为需要写驱动呢
雪    币: 212
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wping 活跃值 2008-1-13 09:44
10
0
DWORD myStrlenA (char *ptr)
{
        DWORD len = 0;
        while(*ptr) {
                len++;
                ptr++;
        }

        return len;
}
这个函数不就是获取字符串的长度,为什么不用MS的呢,要自己写一个????
雪    币: 496
活跃值: 活跃值 (208)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 活跃值 25 2008-1-13 09:53
11
0
这个。。。
呵呵,如果函数能尽量自己实现就自己实现.
老Y大牛那个驱动感染里面也是这样的.根本没用M$ SDK里面提供的那些字符串比较函数,都是自己写的,然后调用. 偶觉得这样比较好~
雪    币: 212
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wping 活跃值 2008-1-13 09:57
12
0
俺想问楼主一个和这个主题无关的问题:

如果一个磁盘物理文件无法删除,我想如何能知道无法删除的原因
如果是注入,那么它究竟注入到哪些进程当中了
(有点类似UNLOCKER的实现原理)
雪    币: 496
活跃值: 活跃值 (208)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 活跃值 25 2008-1-13 10:12
13
0
占炕啦.

要删除正在运行的文件,网上方法很多.

1.你可以使用自己给fsd发送irp请求来删除文件,或者用HOOK MmFlushImageSection等方法,详细见xikug等人逆向的360FileKill的驱动代码

2.使用DeviceIoControl调用驱动文件,或使用事件、共享内存等方法亦可

3. 关闭所有被打开的句柄,参见"被占用文件操作三法"

...


google啊google~
雪    币: 212
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wping 活跃值 2008-1-13 10:20
14
0
还 想问个问题

你提供下载的目录里的RELEASE里的EXE文件在我的XP下无法运行
雪    币: 212
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wping 活跃值 2008-1-13 10:25
15
0
非常感谢

虽然知道放狗,可是有些时候 关键词找不准,很多时候,搜不到点子上
雪    币: 496
活跃值: 活跃值 (208)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 活跃值 25 2008-1-13 10:29
16
0
好奇怪啊.偶在自己的虚拟机上也不能运行,但在自己电脑上可以运行.

上传的附件:
雪    币: 38
活跃值: 活跃值 (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
炉子 活跃值 3 2008-1-13 13:08
17
0
hips,2k3 sp1之类的都封了PhysicalMemory
雪    币: 212
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wping 活跃值 2008-1-13 13:25
18
0
搭车问一下,HIPS是什么,总是能看到这个单词
雪    币: 496
活跃值: 活跃值 (208)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 活跃值 25 2008-1-13 13:45
19
0
哎,典型的被动学习型。

google是最好的老师。

不能太懒啊
--------------------------------------

Host Intrusion Prevent System
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jdcgzb 活跃值 2008-1-15 13:59
20
0
看了楼主的这份讲解,对rootkit似乎了解得更深一层了。
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sysnotdown 活跃值 2008-6-8 14:54
21
0
对vista没有用, 各位别浪费时间了. XP迟早淘汰
雪    币: 204
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Tesla 活跃值 2009-5-4 14:51
22
0
哪位仁兄解释哈这段嘛
else if(gWinVersion == 1 &&
                                *((unsigned char *)apiAddr) == 0xB8 &&
                                *((unsigned char *)apiAddr + 5) == 0xBA &&
                                *((unsigned char *)apiAddr + 6) == 0x00 &&
                                *((unsigned char *)apiAddr + 7) == 0x03 &&
                                *((unsigned char *)apiAddr + 8) == 0xFE &&
                                *((unsigned char *)apiAddr + 9) == 0x7F)
雪    币: 7483
活跃值: 活跃值 (85)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
achillis 活跃值 15 2009-5-4 17:19
23
0
暴搜时的特征码匹配
雪    币: 0
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zhangkexie 活跃值 2009-5-4 17:45
24
0
认真看看 学习下
雪    币: 204
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Tesla 活跃值 2009-5-7 17:00
25
0
achillis 能说一下这些特征码是从哪来的,怎么知道用这特征码来搜索
游客
登录 | 注册 方可回帖
返回