目录:
☆ 背景介绍
☆ 基本思路
☆ MergeFile.py
☆ Repomix
☆ gitseek.dev
☆ Gemini 2.0 Pro Experimental
☆ 讨论
————————————————————————–
☆ 背景介绍
目前这些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 <indir> <outfile> [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( sys.argv ) < 3 :
print( f”Usage: python3 {sys.argv[0]} <indir> <outfile> [ext]” )
break
indir = sys.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 = sys.argv[2]
if len( sys.argv ) >= 4 :
ext = sys.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在逆向工程中的辅助效果,离心理预期还差很远,
暂寄希望于未来的技术进步吧。