LLM4Decompile icon indicating copy to clipboard operation
LLM4Decompile copied to clipboard

关于ghidra的decompile.py文件的问题

Open chenkai1999 opened this issue 1 year ago • 15 comments

作者您好,我想试着您v2模型方案尝试逆向c代码。按照流程,操作如下cd LLM4Decompile/ghidra wget https://github.com/NationalSecurityAgency/ghidra/releases/download/Ghidra_11.0.3_build/ghidra_11.0.3_PUBLIC_20240410.zip unzip ghidra_11.0.3_PUBLIC_20240410.zip。 然后decompile.py里面from ghidra.app.decompiler import DecompInterface、from ghidra.util.task import ConsoleTaskMonitor没有app和util。运行demo.py后报错如下: D:\Code\LLM4Decompile\venv\Scripts\python.exe D:\Code\LLM4Decompile\ghidra\demo.py Traceback (most recent call last): File "D:\Code\LLM4Decompile\ghidra\demo.py", line 40, in result = subprocess.run(command, text=True, capture_output=True, check=True) File "C:\Python310\lib\subprocess.py", line 501, in run with Popen(*popenargs, **kwargs) as process: File "C:\Python310\lib\subprocess.py", line 966, in init self._execute_child(args, executable, preexec_fn, close_fds, File "C:\Python310\lib\subprocess.py", line 1435, in _execute_child hp, ht, pid, tid = _winapi.CreateProcess(executable, args, OSError: [WinError 193] %1 不是有效的 Win32 应用程序 是需要额外安装操作吗?

chenkai1999 avatar Oct 09 '24 07:10 chenkai1999

模型只训练了x64-linux,不建议尝试使用这个模型反编译windows平台软件~ 另外这个报错看起来像是ghidra的问题,可以对应平台版本问题:机器平台(win/linux/mac),二进制文件格式(pe/elf/mahco)

albertan017 avatar Oct 09 '24 07:10 albertan017

作者您好。是的,主要是ghidra的问题,项目ghidra目录下的decompile.py没有对应的from ghidra.app.decompiler import DecompInterface、from ghidra.util.task import ConsoleTaskMonitor。这个是按照readme里面安装就行了吗?还是有其他额外操作?

chenkai1999 avatar Oct 09 '24 07:10 chenkai1999

linux下按照文档步骤操作就可以了,这个import是ghidra调用这个script的时候内部环境import的,不是用户额外安装的。windows平台没有尝试过,手头上没有window环境,不太确定问题在哪里。可以试试使用windows的wsl: https://learn.microsoft.com/en-us/windows/wsl/install 安装个linux在这个里面操作,很方便的

albertan017 avatar Oct 09 '24 07:10 albertan017

我这边windows平台测试了一下1.5v模型逆向效果,就是对稍长一些的代码进行逆向时间比较长;如果c运算复杂或者代码冗长一些,比如汇编代码400多行,可能就没办法逆向出来。

chenkai1999 avatar Oct 09 '24 08:10 chenkai1999

是的,长度越长效果越差(本身长函数也比较困难)。另外v1.5训练数据偏短,asm平均200个token(估计一百行以内),我们正在重新采集数据,希望下一个版本可以更加实用~

albertan017 avatar Oct 09 '24 08:10 albertan017

作者您好,我在另外一台mac电脑上成功跑通了v2的代码。安卓的.so也是属于elf文件,也是咱们工程可以逆向范围吗?有没有demo可以直接逆向整个elf文件?

chenkai1999 avatar Oct 09 '24 08:10 chenkai1999

项目只训练了x64-linux,安卓属于arm64-android,指令集和平台差异都很大。整个文件不太可行,长度一般超限。常见的做法是把函数切分出来,逐个函数反编译

albertan017 avatar Oct 09 '24 09:10 albertan017

咱们v2逆向模型有没有长度限制,目前我测试了个200行的函数,也能逆向出来

chenkai1999 avatar Oct 09 '24 10:10 chenkai1999

作者您好,还有一个问题,使用v2模型尝试逆向main函数的时候,我_fun0换成_main、main、__main,均显示 raise ValueError('bad case no function found') ValueError: bad case no function found,这个是什么原因?

chenkai1999 avatar Oct 09 '24 11:10 chenkai1999

v1.5/v2训练最大长度4096,不过训练数据主要是2000以内。

使用文档里面提示了, Note: Replace func0 with the function name you want to decompile. 我将这句话再强调一下吧

albertan017 avatar Oct 09 '24 11:10 albertan017

是的,我是将所有的func0给替换成需要逆向的函数了。之前若干函数也成功测试过了。然后我想使用v2模型逆向一个main函数,就报如上错误(将demo里面的func0给替换成main了)。

chenkai1999 avatar Oct 09 '24 11:10 chenkai1999

~~objdump -d binary > binary.asm 然后直接手动把函数复制出来吧。demo里面本质上只是自动把函数切割,估计你的main名字被换了~~

可以用ghidra的图形界面看看main变成什么名字了,在图形界面里面直接把ghidra反编译结果复制出来

albertan017 avatar Oct 09 '24 11:10 albertan017

项目只训练了x64-linux,安卓属于arm64-android,指令集和平台差异都很大。整个文件不太可行,长度一般超限。常见的做法是把函数切分出来,逐个函数反编译

@albertan017 非常感谢提供的反编译思路,有两个问题想请教下: 1、对于一个可执行程序,是否可以完整的反编译出所有的代码,除了函数外,其它的全局变量定义这类的,是否也能逆向 2、因为有4096的token限制,对于有一些程序,单个函数也是有可能超4096,是否有其它方法可以绕过此限制

期待你的回复,非常感谢!

qepwq365 avatar Feb 10 '25 11:02 qepwq365

1.基于ghidra/ida优化确实有可能反编译出不错的结果,但肯定需要大量人工介入,毕竟llm本身并不具备判断反编译结果对错的能力。llm本质上还是概率模型,看得足够多可能猜出来全局变量甚至宏定义,但需要针对多函数优化训练了。

2.最有效的方法还是增加训练长度。4096的限制并不是硬限制,模型本身支持16k的,推理数据长于4k也可以继续使用。只是训练数据截断成了4k减少计算消耗。

albertan017 avatar Feb 10 '25 11:02 albertan017

了解啦,非常感谢

1.基于ghidra/ida优化确实有可能反编译出不错的结果,但肯定需要大量人工介入,毕竟llm本身并不具备判断反编译结果对错的能力。llm本质上还是概率模型,看得足够多可能猜出来全局变量甚至宏定义,但需要针对多函数优化训练了。

2.最有效的方法还是增加训练长度。4096的限制并不是硬限制,模型本身支持16k的,推理数据长于4k也可以继续使用。只是训练数据截断成了4k减少计算消耗。

qepwq365 avatar Feb 10 '25 12:02 qepwq365