- Avoid confusions with the name :) --HG-- rename : swig/Makefile => r2-bindings/Makefile rename : swig/README => r2-bindings/README rename : swig/autogen.sh => r2-bindings/autogen.sh rename : swig/check-langs.sh => r2-bindings/check-langs.sh rename : swig/config.mk.acr => r2-bindings/config.mk.acr rename : swig/configure => r2-bindings/configure rename : swig/configure.acr => r2-bindings/configure.acr rename : swig/cxx/Makefile => r2-bindings/cxx/Makefile rename : swig/do-swig.sh => r2-bindings/do-swig.sh rename : swig/do-test.sh => r2-bindings/do-test.sh rename : swig/go/Makefile => r2-bindings/go/Makefile rename : swig/go/fixgoswig.sh => r2-bindings/go/fixgoswig.sh rename : swig/go/test-r_bin.go => r2-bindings/go/test-r_bin.go rename : swig/guile/Makefile => r2-bindings/guile/Makefile rename : swig/guile/test-asm.scm => r2-bindings/guile/test-asm.scm rename : swig/guile/test-util.scm => r2-bindings/guile/test-util.scm rename : swig/guile/vapi.patch => r2-bindings/guile/vapi.patch rename : swig/java/Makefile => r2-bindings/java/Makefile rename : swig/java/TestRBin.java => r2-bindings/java/TestRBin.java rename : swig/lua/Makefile => r2-bindings/lua/Makefile rename : swig/lua/test-r_asm.lua => r2-bindings/lua/test-r_asm.lua rename : swig/lua/test-r_bin.lua => r2-bindings/lua/test-r_bin.lua rename : swig/lua/test-r_bp.lua => r2-bindings/lua/test-r_bp.lua rename : swig/lua/test-r_core.lua => r2-bindings/lua/test-r_core.lua rename : swig/perl/Makefile => r2-bindings/perl/Makefile rename : swig/perl/test-r_asm.pl => r2-bindings/perl/test-r_asm.pl rename : swig/perl/test-r_bin.pl => r2-bindings/perl/test-r_bin.pl rename : swig/perl/test-r_bp.pl => r2-bindings/perl/test-r_bp.pl rename : swig/python-config-wrapper => r2-bindings/python-config-wrapper rename : swig/python/Makefile => r2-bindings/python/Makefile rename : swig/python/r_cons.i.experimental => r2-bindings/python/r_cons.i.experimental rename : swig/python/remote.py => r2-bindings/python/remote.py rename : swig/python/test-r2rc.py => r2-bindings/python/test-r2rc.py rename : swig/python/test-r_asm.py => r2-bindings/python/test-r_asm.py rename : swig/python/test-r_bin.py => r2-bindings/python/test-r_bin.py rename : swig/python/test-r_bp.py => r2-bindings/python/test-r_bp.py rename : swig/python/test-r_bp2.py => r2-bindings/python/test-r_bp2.py rename : swig/python/test-r_cons.py => r2-bindings/python/test-r_cons.py rename : swig/python/test-r_core.py => r2-bindings/python/test-r_core.py rename : swig/python/test-r_flags.py => r2-bindings/python/test-r_flags.py rename : swig/python/test-r_hash.py => r2-bindings/python/test-r_hash.py rename : swig/python/test-r_num.py => r2-bindings/python/test-r_num.py rename : swig/python/test-r_util.py => r2-bindings/python/test-r_util.py rename : swig/python/test-ragdiff2.py => r2-bindings/python/test-ragdiff2.py rename : swig/ruby/Makefile => r2-bindings/ruby/Makefile rename : swig/ruby/test-r_bin.rb => r2-bindings/ruby/test-r_bin.rb rename : swig/ruby/test-r_bp.rb => r2-bindings/ruby/test-r_bp.rb rename : swig/ruby/test-r_core.rb => r2-bindings/ruby/test-r_core.rb rename : swig/rules.mk => r2-bindings/rules.mk rename : swig/vapi/libr.deps => r2-bindings/vapi/libr.deps rename : swig/vapi/libr.vapi => r2-bindings/vapi/libr.vapi rename : swig/vapi/r_anal.deps => r2-bindings/vapi/r_anal.deps rename : swig/vapi/r_anal.vapi => r2-bindings/vapi/r_anal.vapi rename : swig/vapi/r_asm.deps => r2-bindings/vapi/r_asm.deps rename : swig/vapi/r_asm.vapi => r2-bindings/vapi/r_asm.vapi rename : swig/vapi/r_bin.deps => r2-bindings/vapi/r_bin.deps rename : swig/vapi/r_bin.vapi => r2-bindings/vapi/r_bin.vapi rename : swig/vapi/r_bp.deps => r2-bindings/vapi/r_bp.deps rename : swig/vapi/r_bp.vapi => r2-bindings/vapi/r_bp.vapi rename : swig/vapi/r_cmd.deps => r2-bindings/vapi/r_cmd.deps rename : swig/vapi/r_cmd.vapi => r2-bindings/vapi/r_cmd.vapi rename : swig/vapi/r_config.vapi => r2-bindings/vapi/r_config.vapi rename : swig/vapi/r_cons.vapi => r2-bindings/vapi/r_cons.vapi rename : swig/vapi/r_core.deps => r2-bindings/vapi/r_core.deps rename : swig/vapi/r_core.vapi => r2-bindings/vapi/r_core.vapi rename : swig/vapi/r_crypto.vapi => r2-bindings/vapi/r_crypto.vapi rename : swig/vapi/r_db.vapi => r2-bindings/vapi/r_db.vapi rename : swig/vapi/r_debug.deps => r2-bindings/vapi/r_debug.deps rename : swig/vapi/r_debug.vapi => r2-bindings/vapi/r_debug.vapi rename : swig/vapi/r_diff.vapi => r2-bindings/vapi/r_diff.vapi rename : swig/vapi/r_flags.deps => r2-bindings/vapi/r_flags.deps rename : swig/vapi/r_flags.vapi => r2-bindings/vapi/r_flags.vapi rename : swig/vapi/r_fs.deps => r2-bindings/vapi/r_fs.deps rename : swig/vapi/r_fs.vapi => r2-bindings/vapi/r_fs.vapi rename : swig/vapi/r_hash.vapi => r2-bindings/vapi/r_hash.vapi rename : swig/vapi/r_io.deps => r2-bindings/vapi/r_io.deps rename : swig/vapi/r_io.vapi => r2-bindings/vapi/r_io.vapi rename : swig/vapi/r_lang.vapi => r2-bindings/vapi/r_lang.vapi rename : swig/vapi/r_lib.vapi => r2-bindings/vapi/r_lib.vapi rename : swig/vapi/r_line.vapi => r2-bindings/vapi/r_line.vapi rename : swig/vapi/r_parse.deps => r2-bindings/vapi/r_parse.deps rename : swig/vapi/r_parse.vapi => r2-bindings/vapi/r_parse.vapi rename : swig/vapi/r_print.vapi => r2-bindings/vapi/r_print.vapi rename : swig/vapi/r_reg.deps => r2-bindings/vapi/r_reg.deps rename : swig/vapi/r_reg.vapi => r2-bindings/vapi/r_reg.vapi rename : swig/vapi/r_search.deps => r2-bindings/vapi/r_search.deps rename : swig/vapi/r_search.vapi => r2-bindings/vapi/r_search.vapi rename : swig/vapi/r_sign.vapi => r2-bindings/vapi/r_sign.vapi rename : swig/vapi/r_socket.vapi => r2-bindings/vapi/r_socket.vapi rename : swig/vapi/r_syscall.vapi => r2-bindings/vapi/r_syscall.vapi rename : swig/vapi/r_util.vapi => r2-bindings/vapi/r_util.vapi rename : swig/vapi/t/Makefile => r2-bindings/vapi/t/Makefile rename : swig/vapi/t/array.vala => r2-bindings/vapi/t/array.vala rename : swig/vapi/t/asm.gs => r2-bindings/vapi/t/asm.gs rename : swig/vapi/t/asm.vala => r2-bindings/vapi/t/asm.vala rename : swig/vapi/t/asmsearch.vala => r2-bindings/vapi/t/asmsearch.vala rename : swig/vapi/t/bin.vala => r2-bindings/vapi/t/bin.vala rename : swig/vapi/t/bintest.vala => r2-bindings/vapi/t/bintest.vala rename : swig/vapi/t/bwdisassemble.vala => r2-bindings/vapi/t/bwdisassemble.vala rename : swig/vapi/t/core.vala => r2-bindings/vapi/t/core.vala rename : swig/vapi/t/db.vala => r2-bindings/vapi/t/db.vala rename : swig/vapi/t/findops.vala => r2-bindings/vapi/t/findops.vala rename : swig/vapi/t/hash.vala => r2-bindings/vapi/t/hash.vala rename : swig/vapi/t/io.vala => r2-bindings/vapi/t/io.vala rename : swig/vapi/t/lang.vala => r2-bindings/vapi/t/lang.vala rename : swig/vapi/t/list.vala => r2-bindings/vapi/t/list.vala rename : swig/vapi/t/list.vapi => r2-bindings/vapi/t/list.vapi rename : swig/vapi/t/plugin.vala => r2-bindings/vapi/t/plugin.vala rename : swig/vapi/t/pluginwrap.c => r2-bindings/vapi/t/pluginwrap.c rename : swig/vapi/t/regs.vala => r2-bindings/vapi/t/regs.vala rename : swig/vapi/t/reloc.vala => r2-bindings/vapi/t/reloc.vala rename : swig/vapi/t/rgot.vala => r2-bindings/vapi/t/rgot.vala rename : swig/vapi/t/sc.vala => r2-bindings/vapi/t/sc.vala rename : swig/vapi/t/search.gs => r2-bindings/vapi/t/search.gs rename : swig/vapi/t/search.vala => r2-bindings/vapi/t/search.vala rename : swig/vapi/t/socket.vala => r2-bindings/vapi/t/socket.vala
225 lines
6.3 KiB
Python
Executable file
225 lines
6.3 KiB
Python
Executable file
#!/usr/bin/env python
|
|
|
|
# ragdiff2 - Copyright 2010-2011
|
|
# nibble <develsec.org>
|
|
|
|
import sys
|
|
import os
|
|
import gtk
|
|
import gtk.gdk
|
|
import xdot
|
|
import time
|
|
import tempfile
|
|
from r2.r_core import *
|
|
|
|
class ViewWidget(gtk.VBox):
|
|
ui = '''
|
|
<ui>
|
|
<toolbar name="ToolBar">
|
|
<toolitem action="ZoomIn"/>
|
|
<toolitem action="ZoomOut"/>
|
|
<toolitem action="ZoomFit"/>
|
|
<toolitem action="Zoom100"/>
|
|
</toolbar>
|
|
</ui>
|
|
'''
|
|
|
|
def __init__(self):
|
|
gtk.VBox.__init__(self)
|
|
# XDotWidget
|
|
xdotwidget = self.xdotwidget = xdot.DotWidget()
|
|
# Toolbar
|
|
uimanager = gtk.UIManager()
|
|
actiongroup = gtk.ActionGroup('Actions')
|
|
actiongroup.add_actions((
|
|
('ZoomIn', gtk.STOCK_ZOOM_IN, None, None, None, self.xdotwidget.on_zoom_in),
|
|
('ZoomOut', gtk.STOCK_ZOOM_OUT, None, None, None, self.xdotwidget.on_zoom_out),
|
|
('ZoomFit', gtk.STOCK_ZOOM_FIT, None, None, None, self.xdotwidget.on_zoom_fit),
|
|
('Zoom100', gtk.STOCK_ZOOM_100, None, None, None, self.xdotwidget.on_zoom_100),
|
|
))
|
|
uimanager.insert_action_group(actiongroup, 0)
|
|
uimanager.add_ui_from_string(self.ui)
|
|
toolbar = uimanager.get_widget('/ToolBar')
|
|
toolbar.set_icon_size(gtk.ICON_SIZE_SMALL_TOOLBAR)
|
|
toolbar.set_style(gtk.TOOLBAR_ICONS)
|
|
toolbar.set_show_arrow(False)
|
|
label = self.label = gtk.Label()
|
|
hbox = gtk.HBox(False, 5)
|
|
hbox.pack_start(toolbar, False)
|
|
hbox.pack_start(label, False)
|
|
self.pack_start(hbox, False)
|
|
self.pack_start(xdotwidget)
|
|
|
|
def set_filename(self, name):
|
|
self.label.set_text(name)
|
|
|
|
def set_code(self, code, fit):
|
|
self.xdotwidget.set_dotcode(code)
|
|
if (fit):
|
|
self.xdotwidget.zoom_to_fit()
|
|
|
|
class DiffWidget(gtk.VPaned):
|
|
def __init__(self):
|
|
gtk.VPaned.__init__(self)
|
|
self.set_position (500)
|
|
# Graph viewers
|
|
hbox = gtk.HBox(True, 5)
|
|
dw = self.dw = ViewWidget()
|
|
dw2 = self.dw2 = ViewWidget()
|
|
hbox.pack_start(dw)
|
|
hbox.pack_start(dw2)
|
|
self.add(hbox)
|
|
# Function list
|
|
scrolledwin = gtk.ScrolledWindow()
|
|
scrolledwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
|
|
liststore = self.liststore = gtk.ListStore(str, str, str, str, str)
|
|
treeview = gtk.TreeView(liststore)
|
|
# Column Address L
|
|
tvcolumn0 = gtk.TreeViewColumn('Function L')
|
|
treeview.append_column(tvcolumn0)
|
|
cell0 = gtk.CellRendererText()
|
|
tvcolumn0.pack_start(cell0, True)
|
|
tvcolumn0.add_attribute(cell0, 'text', 0)
|
|
tvcolumn0.set_sort_column_id(0)
|
|
# Column Function L
|
|
tvcolumn1 = gtk.TreeViewColumn('Address L')
|
|
treeview.append_column(tvcolumn1)
|
|
cell1 = gtk.CellRendererText()
|
|
tvcolumn1.pack_start(cell1, True)
|
|
tvcolumn1.add_attribute(cell1, 'text', 1)
|
|
tvcolumn1.set_sort_column_id(1)
|
|
# Column Address R
|
|
tvcolumn2 = gtk.TreeViewColumn('Function R')
|
|
treeview.append_column(tvcolumn2)
|
|
cell2 = gtk.CellRendererText()
|
|
tvcolumn2.pack_start(cell2, True)
|
|
tvcolumn2.add_attribute(cell2, 'text', 2)
|
|
tvcolumn2.set_sort_column_id(2)
|
|
# Column Function R
|
|
tvcolumn3 = gtk.TreeViewColumn('Address R')
|
|
treeview.append_column(tvcolumn3)
|
|
cell3 = gtk.CellRendererText()
|
|
tvcolumn3.pack_start(cell3, True)
|
|
tvcolumn3.add_attribute(cell3, 'text', 3)
|
|
tvcolumn3.set_sort_column_id(3)
|
|
# Column Diff
|
|
tvcolumn4 = gtk.TreeViewColumn('Diff')
|
|
treeview.append_column(tvcolumn4)
|
|
cell4 = gtk.CellRendererText()
|
|
tvcolumn4.pack_start(cell4, True)
|
|
tvcolumn4.add_attribute(cell4, 'text', 4)
|
|
tvcolumn4.set_sort_column_id(4)
|
|
# Set treeview options and add it to scrolledwin
|
|
treeview.set_reorderable(True)
|
|
scrolledwin.add(treeview)
|
|
self.add2(scrolledwin)
|
|
treeview.connect('row-activated', self.on_row_activated)
|
|
|
|
def on_row_activated(self, treeview, row, col):
|
|
model = treeview.get_model()
|
|
self.row_handler(self, model[row][1], model[row][3])
|
|
|
|
def set_row_handler(self, handler):
|
|
self.row_handler = handler
|
|
|
|
def set_filename_l(self, name):
|
|
self.dw.set_filename(name)
|
|
|
|
def set_filename_r(self, name):
|
|
self.dw2.set_filename(name)
|
|
|
|
def set_code_l(self, code, fit):
|
|
self.dw.set_code(code, fit)
|
|
|
|
def set_code_r(self, code, fit):
|
|
self.dw2.set_code(code, fit)
|
|
|
|
def add_function(self, row):
|
|
self.liststore.append(row)
|
|
|
|
def clear_functions(self):
|
|
self.liststore.clear()
|
|
|
|
|
|
class RagDiff2(gtk.Window):
|
|
def __init__(self):
|
|
gtk.Window.__init__(self)
|
|
self.c = RCore()
|
|
self.c2 = RCore()
|
|
# Main window
|
|
self.set_title('ragdiff2')
|
|
self.set_default_size(512, 512)
|
|
dw = self.dw = DiffWidget()
|
|
dw.set_row_handler(self.update_graphs)
|
|
self.add(dw)
|
|
self.connect('destroy', gtk.main_quit)
|
|
|
|
def update_graphs(self, dw, addr_l, addr_r):
|
|
if addr_l != '':
|
|
file_l = tempfile.gettempdir()+os.sep+'ragdiff2_l'
|
|
self.c.cmd0('agd %s > %s' % (addr_l, file_l))
|
|
fp = file(file_l)
|
|
dw.set_code_l (fp.read(), True)
|
|
fp.close()
|
|
os.unlink(file_l)
|
|
else:
|
|
dw.set_code_l ('digraph code { }', False)
|
|
if addr_r != '':
|
|
file_r = tempfile.gettempdir()+os.sep+'ragdiff2_r'
|
|
self.c2.cmd0('agd %s > %s' % (addr_r, file_r))
|
|
fp = file(file_r)
|
|
dw.set_code_r (fp.read(), True)
|
|
fp.close()
|
|
os.unlink(file_r)
|
|
else:
|
|
dw.set_code_r ('digraph code { }', False)
|
|
|
|
def set_files(self, file_l, file_r):
|
|
# Init cores
|
|
self.c.config.set_i("io.va", 1)
|
|
self.c.config.set_i("anal.split", 1)
|
|
self.c.file_open(file_l, 0, 0)
|
|
self.c.bin_load(None)
|
|
self.c2.config.set_i("io.va", 1)
|
|
self.c2.config.set_i("anal.split", 1)
|
|
self.c2.file_open(file_r, 0, 0)
|
|
self.c2.bin_load(None)
|
|
# Clear treeview
|
|
self.dw.clear_functions()
|
|
self.dw.set_filename_l(file_l)
|
|
self.dw.set_filename_r(file_r)
|
|
|
|
def diff(self):
|
|
# Diff
|
|
self.c.gdiff(self.c2)
|
|
# Fill treeview
|
|
for fcn in self.c.anal.get_fcns():
|
|
if (fcn.type == FcnType_FCN or fcn.type == FcnType_SYM):
|
|
diffaddr = '0x%08x' % fcn.diff.addr
|
|
if (fcn.diff.type == BlockDiff_MATCH):
|
|
difftype = "MATCH"
|
|
elif (fcn.diff.type == BlockDiff_UNMATCH):
|
|
difftype = "UNMATCH"
|
|
else:
|
|
difftype = "NEW"
|
|
diffaddr = ''
|
|
self.dw.add_function([fcn.name, '0x%08x' % fcn.addr, fcn.diff.name, diffaddr, difftype])
|
|
for fcn in self.c2.anal.get_fcns():
|
|
if ((fcn.type == FcnType_FCN or fcn.type == FcnType_SYM) and fcn.diff.type == BlockDiff_NULL):
|
|
self.dw.add_function(['', '', fcn.name, '0x%08x' % fcn.addr, "NEW"])
|
|
|
|
def main():
|
|
# Check args
|
|
if (len (sys.argv) != 3):
|
|
sys.exit(' usage: %s <file> <file>' % sys.argv[0])
|
|
# Create ragdiff2 win
|
|
rd = RagDiff2()
|
|
rd.show_all()
|
|
# Set and Diff files
|
|
rd.set_files(sys.argv[1], sys.argv[2])
|
|
rd.diff()
|
|
# Gtk main
|
|
gtk.main()
|
|
|
|
if __name__ == '__main__':
|
|
main()
|