标题: 让AI协助阅读代码 创建: 2025-03-10 10:24 更新: 2025-04-27 14:47 链接: https://scz.617.cn/misc/202503101024.txt -------------------------------------------------------------------------- 目录: ☆ 背景介绍 ☆ 基本思路 ☆ MergeFile.py ☆ Repomix ☆ gitseek.dev ☆ Gemini 2.0 Pro Experimental ☆ 讨论 ☆ 网友互动 1) Gemini 2.0 Flash Thinking Experimental 2) Temperature及Top P 3) aistudio批量上传文件 4) LLM4Decompile ☆ deepwiki -------------------------------------------------------------------------- ☆ 背景介绍 目前这些AI,总觉得差点意思,解决不了我的问题。非常小的问题可以,稍微难点的, 不行。比如搞wasm、jsc反编译,让它读v8源码,理解具体的序列化/反序列化过程, 给它一个binary,希望它返回手工反序列化解读,类似010 Editor模板那样的解析效 果,等等。不指望它直接给010 Editor模板,或者反编译器,就逐字节解码给我看看。 像这些需求,目前这些AI做不到。 目前能做一件事,让AI协助阅读代码,大致了解每个文件主要在干啥,并在此基础上 与之讨论一二。 ☆ 基本思路 思路是从「0x指纹」和「黄健楸」那来的,我只是记一笔。 从github拖项目到本地,用程序将目标项目源代码Merge到单个TXT中,TXT中含有项 目的目录结构,人类或AI能识别出TXT各段内容分别属于哪个文件、哪级目录。 上传单个TXT到AI,让AI阅读,在TXT基础上与AI讨论。他们的经验是,用aistudio中 的Gemini 2.0 Pro Experimental。首先,免费。其次,每个会话有两百万的token。 我们需要超长上下文窗口,毕竟光上传单个TXT就会消耗大量token。土豪会考虑付费 AI,我没测试过。 ☆ MergeFile.py 0x指纹写了一个程序,对指定目录抽取源代码并Merge到单个TXT中。我做了点小修改, 遍历目录树时,允许指定扩展名集合。 -------------------------------------------------------------------------- #!/usr/bin/env python # -*- encoding: utf-8 -*- # # python3 MergeFile.py [ext] # import sys, os def get_canonical_path ( path ) : abs_path = os.path.abspath( path ) canonical_path = os.path.realpath( abs_path ) return canonical_path def find_files ( path, ext=None ) : if ext : if isinstance( ext, ( list, tuple ) ) : ext = [ e if e.startswith( '.' ) else f'.{e}' for e in ext ] else : ext = [ ext if ext.startswith( '.' ) else f'.{ext}' ] for root, dirs, files in os.walk( path ) : for file in files : if ext is None or any( file.endswith( e ) for e in ext ) : yield os.path.join( root, file ) def MergeFile ( indir, outfile, ext=None ) : ret = False while ( True ) : try : with open( outfile, 'w', encoding='utf-8' ) as out_f : for fpath in find_files( indir, ext ) : rpath = os.path.relpath( fpath, indir ) try : if not os.path.getsize( fpath ) : continue with open( fpath, 'r', encoding='utf-8' ) as in_f : content = in_f.read() out_f.write( f"\n==== BEGIN {rpath} ====\n```\n" ) out_f.write( content ) out_f.write( f"\n```\n==== END {rpath} ====\n" ) print( f'{rpath}' ) except Exception as e : print( f"{rpath}: {str(e)}", file=sys.stderr ) ret = True except Exception as e : print( f"Exception: {str(e)}", file=sys.stderr ) break return ret def main ( argv ) : ret = False while True : if len( argv ) < 3 : print( f"Usage: python3 {argv[0]} [ext]" ) break indir = argv[1] if not os.path.isdir( indir ) : print( f"Error: {indir} does not exist (maybe a regular file or have no access)", file=sys.stderr ) break indir = get_canonical_path( indir ) outfile = argv[2] if len( argv ) >= 4 : ext = argv[3].split( ',' ) else : ext = None ret = MergeFile( indir, outfile, ext ) break sys.exit( 0 if ret else -1 ) if "__main__" == __name__ : main( sys.argv ) -------------------------------------------------------------------------- ☆ Repomix -------------------------------------------------------------------------- 大模型协助分析大型代码仓库(Zed为例子) - 黄健楸 [2025-02-19] https://www.gantrol.com/software/code/zed/crate-analyse Repomix (Pack your codebase into AI-friendly formats) https://github.com/yamadashy/repomix Repomix online https://repomix.com/ -------------------------------------------------------------------------- Repomix有在线版本,向它提供github链接,它替你生成单个文件,有XML、Markdown、 TXT三种格式,可下载到本地。 ☆ gitseek.dev https://gitseek.dev/zh 这也是从黄健楸那儿看到的,其他网友提供的github项目抽取服务,与在线Repomix 类似。 ☆ Gemini 2.0 Pro Experimental 以View8项目为例 https://github.com/suleram/View8 假设已获取项目的单个TXT,去aistudio选Gemini 2.0 Pro Experimental,以附件形 式上传单个TXT,不要打开TXT复制内容直接粘贴到Gemini对话框中,不要这么干。 MergeFile.py生成的View8.merge.txt约66.8KB,上传TXT消耗token约21777。上传结 束时,直接在AI对话框中与之讨论,比如 「先看一下这个TXT,这是View8项目源码,请介绍每个文件的主要功能」 AI介绍View8项目概况,(略) 「若想增加对StaCurrentScriptContextSlot指令的支持,应该修改哪些文件」 AI说 a. Translate/translate_table.py中operands字典 b. Parser/sfi_file_parser.py中parse_bytecode_line函数 (可选) c. Simplify/simplify.py中SimplifyCode类 (可选) AI给出具体修改建议,看了一下,还算靠谱。 「举例说明jump_blocks.py如何将字节码中的跳转指令转换为结构化的控制流」 AI给了几种示例 a. JumpLoop (循环) b. JumpIfTrue/JumpIfFalse (if-else) c. Exception/Catch (try-catch) d. Switch 「就说示例1吧,translate.py中没有你说的这种代码啊 self.jump_table["Loop"][8] = Jump(jump_type="Loop", start=8, end=14)」 AI进一步解释,「我之前的描述中,为了简化说明,直接给出了translate.py中添加 跳转表条目的结果,省略了中间步骤。实际上,translate.py中并没有直接使用 self.jump_table["Loop"][8] = ...这样的代码。更准确地说,这个跳转表条目的添 加是通过translate_table.py中的add_jump_blocks函数间接完成的。下面是更详细、 更准确的解释,对应于示例1(JumpLoop),(略)。虽然translate.py中没有直接的赋 值语句,但通过operands字典、add_jump_blocks函数和add_jump_to_table方法,最 终实现了向跳转表中添加JumpLoop条目的目的。我的初始描述省略了这个调用链,直 接给出了结果,导致了误解。」 与Gemini对话至此,token共消耗29219,已算上TXT本身的消耗,离两百万的上限远 得很,在单个会话中,足够讨论许多技术细节。 TXT上传成功后保存在Google Drive中,aistudio能看到 aistudio->Library->Drive Folder https://drive.google.com/ 可在此处删除自己上传的文件。Google Drive给了15GB的空间,够用。 ☆ 讨论 有相关技术背景的,可用View8项目测试前述方案。这里有些微妙,我对View8项目有 过研读,AI回答我能判断一二,知道哪些是胡诌、哪些可参考;若初次接触View8项 目,很难说AI的回答如何看待。 有个笑话,没用AI前,花一小时写代码、十分钟调试;用AI后,花十分钟写代码、一 小时调试。没有相应技术背景时,AI替你"开发"的应用对你就是个黑盒,效果如何实 际是赌大运。省却了设计时的思考过程,代价就是调试时补习整体。 除此之外,还有安全问题。宝玉发过一条,「友情提醒一下,虽然现在AI极大地降低 了做网站、APP的门槛,给人谁都可以快速上网站、发布APP的幻觉,但是不要忽视安 全问题。前些天使用过一个网红宣传的跟Cursor结对写出来的应用,访问OpenAI的 Key就写在网页脚本中,看一下网络请求就能看到明文的API Key……你的API Key、 核心数据、提示词等隐私信息,不要轻易地暴露在客户端或者数据包中,这些对于专 业人士来说都是透明的,如果搞不清楚就请专业人士(不要问我,我不专业)把关看看。 」 和云海、0x指纹等人讨论过现有AI在逆向工程中的辅助效果,离心理预期还差很远, 暂寄希望于未来的技术进步吧。 和云海、0x指纹等人讨论过现有AI在逆向工程中的辅助效果,离心理预期还差很远, 暂寄希望于未来的技术进步吧。 ☆ 网友互动 我们关注二进制逆向工程,希望解决反汇编、反编译、未知格式字节流解码等痛点问 题,对白盒代码审计、正向开发等问题不感兴趣。本地客户端配合,这种方案,黄健 楸等人对比测试过,记得结果是不如单TXT,但我自己没有对比测试过,直接用他们 的工程经验了。无论如何,都受制于上下文窗口。提本地客户端配合的,可以试试让 它读v8源码,对二进制jsc进行字节流解码,不要求完成反序列化,只要求最初级的 解码。我们在各种现实世界的二进制逆向工程中,感觉目前这些AI解决不了真正的问 题,做个小小小助手凑合,属于半吊子百科全书。 1) Gemini 2.0 Flash Thinking Experimental From 山大王 用Gemini 2.0 Flash Thinking Experimental,然后Temperature调到0.5至0.6,效 果更好,温度一定要调低。整个文件夹上传到Google Drive,上传内容尽量控制SNR (信噪比),减少无关、无意义内容。尽量用TXT或Markdown,避免PDF之类的格式。 2) Temperature及Top P From 黄健楸 喜欢把推理模型的Temperature设为0.618,主要是格式转换、翻译转写类工作,0.6 到0.7即可。若想加大输出稳定性,调低Top P或Temperature都行。Top P=0.4只从前 40%潜在答案挑结果,温度会调节选择倾向,0度只挑最可能的那个。 3) aistudio批量上传文件 From 0x指纹 aistudio对话框 -> 右侧+号 -> Upload File 可在文件对话框中多选文件,并非只能选单个文件,但不能选中子目录。此处上传文 件,对扩展名或文件格式限制较多,比如选py、docx时,提示 The current model doesn't support files of this type. 绕过办法是,批量上传文件/目录至Google Drive https://drive.google.com/drive/my-drive 一般对aistudio上传过文件,上述位置会自动创建"Google AI Studio"子目录,建议 继续使用之。先切换到某个目录,再点击左上角的"+ New",那里有 New folder File upload Folder upload 从Google Drive向aistudio导入文件 aistudio对话框 -> 右侧+号 -> My Drive -> Google AI Studio 此处可选子目录,也可用Ctrl、Shift配合鼠标选多个文件,选中后点击Insert向 aistudio批量导入。先上传py、docx等文件至Google Drive,再导入至aistudio,成 功。 参看 -------------------------------------------------------------------------- Upload & analyze files in Gemini Apps https://support.google.com/gemini/answer/14903178?hl=en&co=GENIE.Platform%3DDesktop 在Gemini应用中上传和分析文件 https://support.google.com/gemini/answer/14903178?hl=zh-Hans&co=GENIE.Platform%3DDesktop -------------------------------------------------------------------------- 上文提及部分受支持的文件类型,比如 txt c cpp py java php sql html doc docx pdf rtf dot dotx pptx xls xlsx csv tsv hwp hwpx 某些类型要求Gemini Advanced。没必要自限于上述名单,上传至Google Drive,再 向aistudio导入,实测为准。 从Google Drive向aistudio导入7z、zip,提示 Failed to convert file 实测aistudio不支持云解压。从Google Drive向aistudio导入Folder,若Folder中只 有md、py、pdf,则全部导入成功,但丢失目录结构(路径信息)。自己Merge单个TXT 时,可提供目录结构。 这些工程细节坑太多,需不断迭代总结,才能避坑。 4) LLM4Decompile -------------------------------------------------------------------------- https://github.com/albertan017/LLM4Decompile Reverse Engineering: Decompiling Binary Code with Large Language Models Hacker News上关于LLM4Decompile的讨论 - [2024-03-17] https://news.ycombinator.com/item?id=39733275 0x指纹关于LLM4Decompile的讨论 - [2024-06-18] https://weibo.com/5845952017/OjwVV3jXG -------------------------------------------------------------------------- ☆ deepwiki https://deepwiki.com/ 向它提交github链接,帮你分析项目。比如 -------------------------------------------------------------------------- https://github.com/suleram/View8 https://deepwiki.com/suleram/View8 https://github.com/Pr0214/findhash/ https://deepwiki.com/Pr0214/findhash --------------------------------------------------------------------------