在进行一些反编译时,我有时需要比较2个MC68000反汇编的可执行文件(游戏是使用不同的语言发布或稍作修改)。
代码大致相同,但全局标签由于先前的代码更改而被移位(或者错误地将数据解释为分支,这些分支会生成或多或少的伪标签,具体取决于数据)所以我可以拥有第一个文件:
LAB_0012:
MOVE #0,D0
MOVE #2,D2
LAB_0013:
RTS
和第二个文件:
LAB_0015:
MOVE #0,D0
SUB #3,D1
MOVE #2,D2
LAB_0016:
RTS
如果我对两个文件执行差异,标签会加密/污染所需的结果,我希望在文件2中添加SUB #3,D1
。
所以我使用正则表达式进行了预处理,将所有标签更改为LAB_XXXX
,如下所示:
def readlines(filepath):
with open(filepath) as f:
lines = list(f)
return [x.rstrip() for x in lines],[r.sub("LAB_XXXX",l).partition(";")[0] for l in lines]
并使用difflib
来打印差异,它有点有效,但当然不会恢复原始标签值。所以我保留原始数据,并解析difflib输出以尝试打印原始数据,但这是蹩脚的,并且不能很好地工作。
lines1,filtered_lines1 = readlines(file1)
lines2,filtered_lines2 = readlines(file2)
for line in difflib.unified_diff(filtered_lines1, filtered_lines2, fromfile=file1, tofile=file2, lineterm=''):
m = re.match(r"@@..(\d+),(\d+).*(\d+),(\d+)",line)
if m:
start,end,start2,end2 = [int(x) for x in m.groups()]
print(line)
for i in range(start,start+end):
print("{} <=> {}".format(lines1[i],lines2[i-start2+start]))
我已经检查了这个答案Fuzzy file diff,但这并不能解决这个问题:预处理这两个文件已经是我正在做的事情。
我想在比较时指示difflib(或任何其他diff意思)忽略此LAB_....
正则表达式(有点像你可以比较数据忽略空格或不区分大小写),所以原始文件内容是在显示差异时打印(任何一方都会这样做)。对于我上面的例子,我想:
LAB_0015:
MOVE #0,D0
@@added:235,1@@ <== this is just an example: 1 line added at line 235
> SUB #3,D1
MOVE #2,D2
LAB_0016:
RTS
我更喜欢将它保留在python中,但如果我必须对外部命令执行系统调用,那也没关系。