【angr源码分析】4. SimOS

SimOS

在factory中,使用self.project.simos.state_entry(**kwargs)等方法来获得一个SimState。

这里研究simos的返回SimState的方法

在Project类的__init__方法中,使用self.simos = os_mapping[self.loader.main_object.os](self)来为project添加simos属性。在project.py中,有from angr.simos import SimOS, os_mapping,所以研究SimOS类,以及os_mapping。(***找不到os_mapping)

SimOS类

用于描述操作系统以及架构等。

def init(self, project, name=None)

***参数都不认识

1
2
3
4
5
6
def __init__(self, project, name=None):
self.arch = project.arch
self.project = project
self.name = name
self.return_deadend = None
self.unresolvable_target = None
1
2
3
4
5
def state_entry(self, **kwargs):
return self.state_blank(**kwargs)

def state_full_init(self, **kwargs):
return self.state_entry(**kwargs)

state_entry和state_full_init实际上都是在调用state_blank,所以只研究state_blank

def state_blank():

个人理解:生成一个状态可能和操作系统的状态有关。单纯地生成一个状态是没有意义的,需要考虑到文件的权限,系统的架构等信息。在生成状态后,为其处理输入输出流,初始化一些信息。所以把SimState的生成放在simos中实现。

核心:state = SimState(self.project, **kwargs)

其他的操作目前觉得不重要

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def state_blank(self, 
addr=None, #执行的起始地址
initial_prefix=None, #不知道在干啥
stack_size=1024*1024*8, #分配的栈空间
stdin=None,
**kwargs):
#其他的参数都会送入 SimState constructor
kwargs += ... ...各种奇怪的操作

#!!!!!!!! 直接实例化一个SimState对象
state = SimState(self.project, **kwargs)

... ...大多是参数处理

#注册posix插件,处理输入输出
state.register_plugin('posix', SimSystemPosix(stdin=stdin, brk=brk))

return state