首页
社区
课程
招聘
[求助]一个关于内存映像的小问题
发表于: 2014-10-24 23:15 6601

[求助]一个关于内存映像的小问题

2014-10-24 23:15
6601
请问在OD中查看到内存映像的一个区段无属主,类型为Priv 00021004,但是程序会往里面写数据,也有跳转跳入去执行代码,这是一个什么样的区段呢?

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 7068
活跃值: (3517)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
2
无属主仅表示该区域不是映像文件或文件映射的段,这种段一般是堆、VirtualAlloc申请的、线程栈的区域。
2014-10-25 00:08
0
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
那么请问有可能在堆中执行一段代码么?前几天也碰到了这样一个问题,是一个call之后才出现的区段,按您这么说的话确实就很可能是堆栈区段了,那么这样的程序有没有可能是在call里面将一段原本加密或者存放成了数据的代码放在了堆中然后跳转过去执行呢?现在想想这种可能蛮大的。但是这个程序的关键call就在这个堆的可执行代码中,没法进行直接的爆破,这样的程序是不是只能找到存放代码数据的地方直接二进制修改、或者追码或注册机了呢?
还有就是想问一下同样是上面提到的那个程序,有人提出的破解方法是将线程内的代码提取到线程外去执行,请问这是什么意思?
2014-10-25 00:39
0
雪    币: 126
活跃值: (169)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
VirtualAlloc一块可以读写可以执行的内存块,是很常见的
2014-10-25 00:52
0
雪    币: 7068
活跃值: (3517)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
5
参考MSDN:http://msdn.microsoft.com/en-us/library/aa366599(VS.85).aspx
如果在创建堆(HeapCreate)时启用了HEAP_CREATE_ENABLE_EXECUTE标志,则可以在堆中执行代码。
另外堆是堆,栈是栈,两者不是一个东西。一般说的堆栈是指的栈。

但是就算该区域不能执行代码的话,也可以使用VirtualProtect函数修改内存页的属性。
2014-10-25 01:25
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
遇到了和楼主一样的问题,关键代码在一个无属主区段,想把这段代码提取出来在自己的程序中调用,bxc大神给个思路
2014-10-25 14:52
0
雪    币: 7068
活跃值: (3517)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
7
一般无属主的内存块里的代码都不会有重定位的,直接copy出来即可。
但是需要处理一些call和jmp,因为这种地方的代码很有可能是shellcode(不知道这样说合不合适)。
call(E8)的偏移都是临时计算的。毕竟call dword ptr需要一个绝对地址,而绝对地址一般又需要一个重定位。
2014-10-25 14:57
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
不是shellcode,是一段加密算法
这段代码本身没有重定位功能,call、jump地址大部分都是直接地址(如00401000)
我猜测执行流程应该是这样:读取EXE中加密压缩存放的数据,经过解压解密重定位,放入新申请的堆中,最后跳过去执行
提取的常规方法是copy,只是具体到这个例子有个小问题:od不能正确反汇编,也就是说代码中加入了花指令(猜的,我对花指令不了解)这种情况下直接copy有没有问题?
2014-10-26 10:54
0
雪    币: 7068
活跃值: (3517)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
9
OD的复制就是2进制复制,跟花指令无关。花指令是干扰反汇编器的。
2014-10-26 12:36
0
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
刚刚成功搞定了这个程序,但是还是碰到了一个不懂的问题,请问下这样分配出来的堆区域属性为RW,是不是只是对这一个分配函数以及后面紧跟着往里面释放代码的地方可写呢?因为我开始尝试着在最后一个关键call之前用SMC补丁,但是提示的是od无法处理的异常,应该是无法写入的问题,所以最后我是在这块堆区刚刚分配好并且让程序往里面添加了代码之后还没返回之前就使用SMC最后才成功的。请问这块堆是不是并非全局可写的?
2014-10-26 14:52
0
雪    币: 7068
活跃值: (3517)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
11
虚拟地址空间是进程私有的,你不管在哪里申请的内存块。
就算是在别的进程里用VirtualAllocEx申请。如果是可写的,那在哪里都是可以写入的。
2014-10-26 14:55
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我以前的做法是复制反汇编代码,然后masm重新汇编
直接复制二进制,重定位问题怎么解决?
2014-10-27 09:36
0
雪    币: 7068
活跃值: (3517)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
13
一般重定位只会在映像文件里出现。其他地方不会有的。。
2014-10-27 11:46
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
你说的映像是指内存还是磁盘
内存映像必然存在重定位问题
磁盘映像无法直接复制,要经过一堆处理,因为最终运行的代码是动态生成的,更麻烦了
2014-10-27 15:10
0
雪    币: 7068
活跃值: (3517)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
15
我说的映像就是指一段内存是从PE文件里映射来的。。。
就是说内存属性是MEM_IMAGE
2014-10-27 15:18
0
游客
登录 | 注册 方可回帖
返回
//