Cerbero Suite是为x86/x64设计方案的一款互动式反汇编专用工具。最开始的目地是为了更好地使我们的客户可以查验运行内存转储中的编码及其shellcode。现如今,目前市面上现有十分优秀的反汇编专用工具,如IDA和Ghidra,我认为试着效仿在其中的一种专用工具是没有意义的。这也就是我设计方案该反汇编专用工具的缘故,另外因为我考虑到了顾客怎么使用Cerbero Suite的难题。
Cerbero Suite被很多做为文件原始归类的专用工具应用。我依旧还记得应用W33Dasm的快乐时光,并从这当中获得了非常大的设计灵感。自然,W33Dasm已没法解决愈来愈繁杂的状况。这就是为啥Carbon的设计方案中,我尝试将W33Dasm等专用工具的及时性与更高級专用工具的协调能力融合起來的缘故。
特点详细介绍
Flat 反汇编视图
Carbon含有一个表明文件中全部命令的Flat 反汇编视图。我不会清除未来很有可能会出现数据图表视图,但它并不是我优先选择考虑到的事儿。
递归反汇编
递归反汇编程序流程是处理编码被数据信息终断的状况所必不可少的。Carbon将尽量的在较短期内内进行disassemble,并另外开展基础的剖析工作中。
速率
Carbon是线程同步的,能够十分迅速地解决大中型的文件。这针对文件的原始归类十分有效。
之上是大概十分钟内对60 MB chrome DLL实行的剖析。它是在vm虚拟机中运作的。将来的挑戰将是维持速率,另外提升大量的剖析文章段落。
x86/x64 适用
Carbon另外适用x86和x64编码。未来会适用大量构架。
事实上,Carbon的设计方案容许在同样的反汇编视图中混和构架。
不受到限制的数据库
一个新项目在Carbon中能够包括无尽个Carbon数据库。这代表着假如你已经剖析包括10个可实行文件的Zip文件,那麼这种文件中的每一个都能够有着自身的数据库。
值得一提的是:单独文件还可以有好几个数据库,只需点击Carbon菜单栏按键或按“Ctrl Alt C”就可以加上新的Carbon数据库。
假如你对剖析不满意,那麼你能根据右键单击有关的引言内容或挑选它并按“Del”轻轻松松删掉它。
脚本制作
你只需两行Python编码就可以加载和disassemble一个文件。
s=createContainerFromFile(a)
obj=PEObject()
obj.Load(s)
c=Carbon()
c.setObject(obj, True)
if c.createDB(dbname) !=CARBON_OK:
print("error: couldn't create DB")
return False
if c.load() !=CARBON_OK:
print("error: couldn't load file")
return False
c.resumeAnalysis()
# wait for the analysis to finish...
剖析进行后,我们可以改动和访问其內部数据库的每个一部分,或是我们可以建立一个视图并表明反汇编:
ctx=proContext()
v=ctx.createView(ProView.Type_Carbon, "test")
ctx.addView(v, True)
v.setCarbon(c)
內部数据库应用SQLite,即便 不应用SDK还可以轻轻松松访问和改动它。
Python 加载程序流程
在很早以前以前我也决策应用Python撰写全部的文件加载程序流程。尽管这很有可能会使文件的加载速率偏慢(虽然不显著),但它容许客户自定加载程序流程并加上作用,进而出示了巨大的协调能力。加上新的文件加载程序流程也比较简单。
PE文件的全部加载程序流程大概有350行编码。它是初始文件的加载程序流程:
from Pro.Carbon import *
class RawLoader(CarbonLoader):
def __init__(self):
super(RawLoader, self).__init__()
def load(self):
# get parameters
p=self.carbon().getParameters()
try:
arch=int(p.value("arch", str(CarbonType_I_x86)), 16)
except:
print("carbon error: invalid arch")
arch=CarbonType_I_x86
try:
base=int(p.value("base", "0"), 16)
except:
print("carbon error: invalid base address")
base=0
# load
db=self.carbon().getDB()
obj=self.carbon().getObject()
# add region
e=caRegion()
e.def_type_id=arch
e.flags=caRegion.READ | caRegion.WRITE | caRegion.EXEC