首页
社区
课程
招聘
[分享]SDTrestore Version 0.2 学习注释存档
发表于: 2008-1-12 10:42 14699

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

2008-1-12 10:42
14699

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;
}

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

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

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

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

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

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

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

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

...


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

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

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

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

google是最好的老师。

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

Host Intrusion Prevent System
2008-1-13 13:45
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
看了楼主的这份讲解,对rootkit似乎了解得更深一层了。
2008-1-15 13:59
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
对vista没有用, 各位别浪费时间了. XP迟早淘汰
2008-6-8 14:54
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
哪位仁兄解释哈这段嘛
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)
2009-5-4 14:51
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
23
暴搜时的特征码匹配
2009-5-4 17:19
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
认真看看 学习下
2009-5-4 17:45
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
achillis 能说一下这些特征码是从哪来的,怎么知道用这特征码来搜索
2009-5-7 17:00
0
游客
登录 | 注册 方可回帖
返回
//