某Delphi软件逆向记录
一、背景
最近逆向分析某个工具类软件,拖进die里分析结果如下:
居然是加了上古的ASPack壳,并且是Delphi编写的,估计维护这个软件的公司10年以内没有重构过了。从网上随便找了个脚本把ASPack的壳脱了,但是Delphi编译后乍看一片混乱,俗话说工欲善其事必先利其器,需要找一套合适的工具先还原一下符号信息。
二、还原符号信息
从github上找到了一个神器IDR(链接),把脱壳后的二进制文件直接拖到里面,软件会自动分析出是Delphi 7编写的。然后把(可能)含有Delphi 7的符号信息kb7.7z解压后放在IDR运行的目录下,软件便可以自动分析并还原符号信息。
还原完毕后,可以点击 Tools -> IDC Generator 导出idc脚本给IDA使用。然而,在ida中运行导出的idc脚本后,会发现很多函数虽然起始地址和结束地址是对的,但是内部的汇编代码全被误识别成了二进制的数据(如db dd dw)。需要再写一个python脚本,遍历还原出的函数,让IDA对其进行重新分析
from idc import *
first_addr = 0x401000
current_func = get_next_fchunk(first_addr)
while (current_func != BADADDR):
end = find_func_end(current_func)
plan_and_wait(current_func,end)
print(f'analyzing from {hex(current_func)} to {hex(end)}')
current_func = get_next_fchunk(current_func)
三、愉快的逆向
此处自行脑补
有一个比较坑的地方是Delphi中的字符串通常不是以\0结尾,而直接在字符串首部用1位的信息记录整个字符串的长度