首页
社区
课程
招聘
[求助]抓取内存映像存放至磁盘的疑问
发表于: 2015-5-19 19:22 17208

[求助]抓取内存映像存放至磁盘的疑问

2015-5-19 19:22
17208
LoadPe的一个功能,网上没有类似的源码 自己写了半天 有些地方解决不了故来提问

这些是某个游戏的PE信息

OEP:4AD04C1
基地址:400000
文件总长:46D1000
代码起始RVA:1000
数据起始RVA:2131000
内存块对齐:1000
文件块对齐:1000
区段数量:A
DOS-PE-区块总大小:1000
.tp3 RVA:1000 Size:212F856  磁盘RVA:1000
.tp3 RVA:2131000 Size:732000  磁盘RVA:DEC000
.tp3 RVA:2863000 Size:144C184  磁盘RVA:151E000
.tp3 RVA:3CB0000 Size:33000  磁盘RVA:1555000
.tp3 RVA:3CE3000 Size:F2000  磁盘RVA:1588000
.tp3 RVA:3DD5000 Size:10000  磁盘RVA:167A000
.tp3 RVA:3DE5000 Size:1C0000  磁盘RVA:167C000
.tvm1 RVA:3FA5000 Size:4000  磁盘RVA:1744000
.tvm0 RVA:3FA9000 Size:71F000  磁盘RVA:1747000
.tp3 RVA:46C8000 Size:9000  磁盘RVA:1B25000

我拷贝区块是这样写的,lpbuf是即将被WriteFile进去的数据,MemBuf是ReadProcessMemory的数据

pImageSectionHeader = GetFirstSectionHeader(pImageNtHeader);
        for (DWORD i = 0; i < pImageFileHeader->NumberOfSections; i++)
        {
                DWORD RealSize = _Max(pImageSectionHeader->Misc.VirtualSize, pImageSectionHeader->SizeOfRawData);
               
                SafeCopyMemory((PVOID)((DWORD)lpbuf + pImageSectionHeader->PointerToRawData), (PVOID)((DWORD)MemBuf + pImageSectionHeader->VirtualAddress), RealSize);

                pImageSectionHeader++;
        }

那么问题来了

.tp3 RVA:1000 Size:212F856  磁盘RVA:1000
.tp3 RVA:2131000 Size:732000  磁盘RVA:DEC000

磁盘RVA:1000  磁盘RVA:DEC000      两个磁盘文件储存地址相离那么近,而第一个区段的大小是 0x212F856 如何把这个区段完整地放入磁盘文件中呢?

望各位高手帮助下本菜鸟

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费
支持
分享
最新回复 (10)
雪    币: 41
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
OEP:4AD04C1
基地址:400000
文件总长:46D1000
代码起始RVA:1000
数据起始RVA:2131000
内存块对齐:1000
文件块对齐:1000
区段数量:A
DOS-PE-区块总大小:1000
.tp3 RVA:1000 Size:212F856  磁盘RVA:1000 Size:DEB000
.tp3 RVA:2131000 Size:731AF8  磁盘RVA:DEC000 Size:732000
.tp3 RVA:2863000 Size:144C184  磁盘RVA:151E000 Size:37000
.tp3 RVA:3CB0000 Size:32C81  磁盘RVA:1555000 Size:33000
.tp3 RVA:3CE3000 Size:F13B0  磁盘RVA:1588000 Size:F2000
.tp3 RVA:3DD5000 Size:10000  磁盘RVA:167A000 Size:2000
.tp3 RVA:3DE5000 Size:1C0000  磁盘RVA:167C000 Size:C8000
.tvm1 RVA:3FA5000 Size:4000  磁盘RVA:1744000 Size:3000
.tvm0 RVA:3FA9000 Size:71F000  磁盘RVA:1747000 Size:3DE000
.tp3 RVA:46C8000 Size:9000  磁盘RVA:1B25000 Size:9000

内存区段映像居然比磁盘映像大那么多
2015-5-19 19:37
0
雪    币: 73
活跃值: (923)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
没有看懂楼主的疑问。既然在内存中的其实地址有了,内存中文件的大小也有了,直接把这块内存读取出来,写入到文件,不就行了吗?
2015-5-19 19:44
0
雪    币: 41
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
但是内存和磁盘 存储的方式不一样的。比如有些程序 磁盘代码段RVA是0x400  加载到内存中RVA是0x1000。直接ReadProcessMemory写进去不对的
2015-5-19 19:50
0
雪    币: 41
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
是不是要改下读取的原PE头的 区块数据 调整大小 地址 试试看 哎 没人指点
2015-5-19 20:28
0
雪    币: 41
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
成功了 和LoadPe Dump出来的一模一样 ...我发现自己解决问题  只要一提问 马上就能自己解决 ...太神奇了
2015-5-19 20:55
0
雪    币: 11396
活跃值: (4289)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
既然解决,为何不分享一下方法呢?
2015-5-20 07:39
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
哎,我也有时也这样,你这不就是dump么?
2015-5-20 07:44
0
雪    币: 41
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
修改原pe头每个区块的磁盘rva和磁盘大小变成内存rva和内存大小。readprocessmemory读取进程从modbase开始大小为modsize的内存,然后修改这片内存的pe信息,就是一开始说的磁盘rva,大小变内存rva大小
2015-5-20 10:35
0
雪    币: 41
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
然后writefile写进修改成的内存就ok了,
2015-5-20 10:36
0
雪    币: 73
活跃值: (923)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
那你按照对应的计算方式,转换下就可以了(如果是PE文件的话)
2015-6-5 18:33
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册