推荐国内外十五款最佳AI代码助手工具
1. 腾讯云AI代码助手
腾讯云AI代码助手是一款定位代码智能补全和生成的数字化工具,是辅助编码工具,基于腾讯混元代码大模型,可以为开发者、开发团队及企业客户提供安全合规、高粘度体验的编码场景AIGC服务。
主要功能:包括代码补全、技术对话、代码诊断、单元测试等,支持Python、Java、C/C++、Go等数十种编程语言或框架,以及VS Code、JetBrains等主流集成开发环境。
优点:
提升研发效率:通过技术对话与代码补全,辅助生成业务代码、注释、单元测试等内容,大幅提高开发效率。
支持多种语言和框架:支持Python, JavaScript/TypeScript, Java, C/C++, Go, C#, Rust, Swift, Lua, Kotlin, TSX/JSX, Vue, Proto, PHP等语言/框架。
支持主流IDE:VSCode和JetBrains全家桶,加速开发流程。
安全合规:符合国内安全合规要求,保障代码信息安全。
缺点:
错误检测的全面性:虽然能够检测代码中的语法错误和逻辑错误,但在复杂场景下,可能无法完全覆盖所有潜在问题。
价格:目前全部免费使用。
2. MarsCode
MarsCode是由字节跳动公司推出的一款AI编程助手,旨在为开发者提供智能化的代码补全、生成、优化等功能。该工具支持多种编程语言和主流集成开发环境(IDE),帮助开发者提高代码编写效率,减少常见错误。
特色功能
多语言支持:支持Python、JavaScript、Java、C++等多种编程语言。
代码优化:不仅能自动补全代码,还能智能地优化代码结构,减少冗余和错误。
跨IDE兼容:支持主流开发工具如VS Code、JetBrains系列。
实时错误检测:在你编写代码的过程中,MarsCode能够实时分析并指出潜在错误。
产品价格
目前MarsCode提供基础免费版本,适用于个人开发者;企业版则可能需订购收费服务,提供更强大的功能和技术支持。
优点:
代码补全和优化功能强大,减少重复性劳动。
支持多种编程语言和IDE,适用范围广。
由大厂支持,技术能力和未来发展有保障。
缺点:
目前市场推广有限,用户数量较少。
需要与更成熟的工具竞争,部分功能可能尚待完善。
3. GitHub Copilot
GitHub Copilot是由GitHub、OpenAI和微软Azure团队联合推出的AI编程助手,能够为开发者提供智能代码建议和自动补全功能,适用于多种编程语言和IDE,是目前市场上最受欢迎的AI编程工具之一。
特色功能
深度学习支持:基于OpenAI的Codex模型,Copilot能够根据上下文生成高质量代码建议。
广泛支持:支持Python、JavaScript、TypeScript、Ruby、Go等多种语言,并能在VS Code、JetBrains等主流IDE中使用。
协作功能:帮助开发者实时补全代码、生成函数和模块,极大提升开发效率。
产品价格
GitHub Copilot目前提供30天免费试用期,个人开发者订阅费用约为10美元/月,企业版订阅则根据使用人数和规模定价。
优点:
提供高质量的代码建议,代码补全功能极其强大。
由GitHub和微软支持,未来发展有保障。
社区资源丰富,用户数量庞大,支持快速技术交流。
缺点:
部分生成的代码可能不符合项目最佳实践,需谨慎审查。
对隐私敏感项目不太友好,因为需要依赖云端处理。
4. 通义灵码
通义灵码是阿里巴巴推出的AI编程助手,基于通义大模型,支持多种编程语言和开发环境,特别适用于企业级项目的代码生成和优化。
特色功能
强大的续写功能:基于通义大模型,能够生成符合上下文的代码续写,减少开发者重复性劳动。
企业级支持:特别针对大型企业和复杂项目,提供定制化的解决方案。
安全性高:具备本地化部署能力,适合对数据安全要求高的项目。
产品价格
通义灵码提供基础免费版,并为企业客户提供定制化的高级版本,价格因需求和项目规模而异。
优点:
强大的代码续写和优化功能。
适合企业级项目,提供高级安全解决方案。
支持多种编程语言,涵盖广泛开发需求。
缺点:
对个人开发者不太友好,产品偏向企业客户。
需要学习曲线,初次上手较为复杂。
5. 代码小浣熊 (Raccoon)
代码小浣熊是商汤科技推出的AI编程助手,特别针对初学者和中级开发者,提供智能代码生成和辅助工具。凭借商汤科技的人工智能技术背景,代码小浣熊旨在为用户提供流畅、高效的代码编写体验。
特色功能
智能代码生成:根据用户需求自动生成常见代码片段,减少重复劳动。
支持多语言:支持包括Python、JavaScript等多种编程语言,适应广泛的开发场景。
代码分析:智能分析代码,给出优化建议,并帮助开发者提升代码质量。
产品价格
代码小浣熊目前免费提供基础功能,但企业版或高级版本可能会收取一定费用。
优点:
界面友好,适合初学者和中级开发者使用。
代码分析功能帮助开发者提升代码质量。
基于商汤的AI技术,产品背后的算法性能强大。
缺点:
目前功能较为基础,高级功能可能不如其他竞争产品。
仅支持主流编程语言,未见对更复杂场景的深度支持。
6. 文心快码
文心快码是由百度推出的AI编程助手,基于文心大模型(ERNIE),支持超过100种编程语言,能够帮助开发者在多种语言环境下实现实时代码补全、生成和优化。
特色功能
广泛的语言支持:支持超过100种编程语言,是市场上语言覆盖最广的工具之一。
实时续写功能:文心快码能够基于用户输入的上下文实时续写代码,减少开发者的编写工作量。
强大的算法支持:基于百度的文心大模型,提供智能化的代码生成和优化。
产品价格
目前文心快码提供免费基础版,同时也有企业版和高级版本,具体价格需根据用户需求和使用规模确定。
优点:
支持语言数量多,几乎涵盖所有常见编程语言。
文心大模型的智能化程度高,代码生成和续写功能表现出色。
适合大规模、多语言开发团队使用。
缺点:
高级功能可能收费,对于个人开发者的成本较高。
虽然支持多种语言,但在某些冷门语言中的表现尚待提升。
7. iflycode
iflycode是科大讯飞推出的一款智能编程助手,结合了其在自然语言处理和语音识别方面的技术优势,为开发者提供流畅、直观的代码生成和补全功能。
特色功能
智能代码生成:基于用户需求,自动生成代码片段。
语音输入支持:科大讯飞特有的语音识别技术,可以让开发者通过语音编写代码,解放双手。
自然语言解释:支持通过自然语言描述需求,AI会自动转换为代码。
产品价格
iflycode目前提供免费版本,同时也为企业用户提供定制化的高级版本,收费标准根据需求灵活定价。
优点:
支持语音输入,提供独特的编程体验。
语音识别和自然语言处理技术领先,便于非程序员快速上手。
适合初学者和需要快捷编程的开发者。
缺点:
功能相对有限,复杂场景下可能表现不够稳定。
语音编程在一些编程语言中可能不太适用。
8. 华为CodeArts Snap
华为CodeArts Snap是华为云基于盘古研发大模型开发的智能开发助手,旨在提升开发者的编程效率和质量。以下是关于CodeArts Snap的详细介绍:
CodeArts Snap的主要功能
代码生成:根据自然语言生成完整代码逻辑,实现编码效率的大幅提升。
研发知识问答:对话框内进行任意研发相关的知识提问,提高研发问题的解决效率。
单元测试用例生成:自动创建单元测试用例,提高测试覆盖率,确保每个功能和场景都被测试到。
代码解释:快速分析代码并自动生成文档,提高阅读代码的速度和效率。
代码注释:快速分析代码,自动生成有意义的完整注释,增加代码可读性。
代码调试:可根据运行代码报错时提示的错误日志一键修复代码;对代码进行检视,挖掘潜在编译问题。
代码翻译:快速分析代码并自动完成迁移和翻译,提高开发者工作效率。
代码检查:快速分析代码,提供错误发生的详细信息和修复建议,缩短了错误定位时间
优点
高效提升编码效率和质量:能够将自然语言转化为规范可阅读、无开源漏洞的安全编程语言。
功能强大且全面:覆盖代码生成、研发知识问答、单元测试用例生成、代码解释、代码注释、代码翻译、代码调试、代码检查八大功能。
智能生成和问答:具备智能生成和智能问答的核心功能,可以根据中英文描述生成完整的函数级代码,同时提供代码的自动检查和修复
缺点
依赖高质量数据:CodeArts Snap的性能高度依赖于高质量的训练数据。如果数据质量不高,可能会影响其提供的代码生成和代码检查的准确性。
特定场景适用性:虽然CodeArts Snap功能全面,但在某些特定的开发场景或技术栈中,可能需要用户进行额外的配置或调整,以达到最佳使用效果。
9. Cursor.so
Cursor.so是一款新兴的AI编程助手工具,特别注重用户体验和效率提升,旨在为开发者提供简单、直观的代码补全、生成和优化服务。
特色功能
极简设计:界面简洁明了,开发者可以快速上手。
多语言支持:支持常见编程语言,适应不同的开发场景。
高效补全:基于AI算法的代码补全功能,可以有效减少开发者的手动输入工作。
产品价格
Cursor.so提供免费基础版和付费高级版,具体价格信息需访问官网获取。
优点:
界面极简,用户上手非常快。
高效的代码补全功能显著提升工作效率。
多语言支持,适应多种开发需求。
缺点:
功能较为基础,对于复杂代码生成和优化的支持有限。
社区支持尚在发展中,资源相对较少。
10. CodeWhisperer
CodeWhisperer是由亚马逊AWS团队推出的AI编程助手,旨在为AWS开发者提供智能化的代码建议和补全功能。该工具深度集成了AWS的服务和API,特别适合云开发者使用。
特色功能
AWS服务集成:针对AWS开发场景,能够自动补全和优化与AWS服务相关的代码。
多语言支持:支持Java、Python、JavaScript等常见语言。
安全代码检测:内置安全检测功能,帮助开发者避免常见的安全漏洞。
产品价格
CodeWhisperer目前为AWS用户提供基础版免费服务,企业版则按使用量或用户数收费。
优点:
AWS开发者的首选,深度集成AWS服务和API。
提供安全代码检测功能,减少安全风险。
免费基础版对于AWS开发者非常实惠。
缺点:
非AWS用户使用价值不高,限制了其通用性。
某些编程语言支持较弱,适用场景有限。
11. CodeGeeX
CodeGeeX是由智谱AI推出的开源AI编程助手,支持多种编程语言,能够为开发者提供代码自动生成、补全和优化等功能。作为开源工具,CodeGeeX的可定制性和灵活性较强,适合开发者进行二次开发和深度集成。
特色功能
开源灵活:CodeGeeX完全开源,开发者可以根据项目需求进行定制化调整。
多语言支持:支持Python、Java、C++等多种编程语言,覆盖常见开发需求。
社区驱动:由社区维护和发展,用户可以参与贡献代码和功能改进。
产品价格
CodeGeeX作为开源工具,免费提供全部功能,开发者可以自由下载使用,并根据需要进行修改和二次开发。
优点:
开源工具,具有极高的灵活性和可定制性。
支持多种编程语言,适用广泛的开发场景。
社区活跃,开发者可以参与工具的改进和优化。
缺点:
作为开源工具,可能缺乏一些商业化产品的技术支持和文档。
高度依赖社区,更新频率和功能发展受限于社区活跃度。
12. CodeFuse
CodeFuse是蚂蚁集团自研的代码生成专属大模型,旨在通过人工智能技术提升编程效率和代码质量。CodeFuse是一款为国内开发者提供智能研发服务的产品,基于蚂蚁集团自研的基础大模型进行微调,旨在辅助开发者提高编码效率和代码质量。
主要功能:包括代码补全、添加注释、解释代码、生成单测,以及代码优化等,支持多种编程语言和IDE。
发展历史:CodeFuse于2023年9月首次开源,经过一年的发展,已经在多个行业会议上展示分享,并在蚂蚁集团内部广泛应用。
CodeFuse的优缺点
优点:
提升研发效率:通过技术对话与代码补全,辅助生成业务代码、注释、单元测试等内容,大幅提高开发效率。
支持多种语言和框架:支持Python, JavaScript/TypeScript, Java, C/C++, Go等多种编程语言或框架。
支持主流IDE:支持在Visual Studio Code, IntelliJ IDEA等主流集成开发环境中使用。
创新功能:“图生代码”功能允许开发人员使用产品设计图一键生成代码,大幅提升前端页面的开发效率。
缺点:
代码补全的准确性:虽然CodeFuse能够提供精准的代码补全,但在某些情况下,生成的代码可能不符合开发者的风格和习惯,需要手动调整。
错误检测的全面性:虽然能够检测代码中的语法错误和逻辑错误,但在复杂场景下,可能无法完全覆盖所有潜在问题。
13. Tabnine
Tabnine是一款由Codota公司开发的AI代码补全插件,支持多种编程语言,通过深度学习技术提供智能代码补全建议,以提高编程效率。
功能亮点
本地运行支持:Tabnine支持本地AI模型,开发者可以在本地运行代码生成功能,避免将代码上传至云端,保障数据隐私。
强大的补全功能:通过深度学习算法,Tabnine能够提供精准的代码补全建议,适用于多种语言和框架。
自定义模型:开发者可以通过配置Tabnine来定制符合项目或团队需求的代码生成模型,增强代码风格的一致性。
使用体验
Tabnine的代码补全体验非常出色,它能够基于当前上下文提供智能且高效的代码建议,尤其是在处理大型项目或长代码段时,补全的准确性尤为明显。它支持多种常见编程语言,包括Python、Java、JavaScript等,且在不同IDE中均有良好的表现。
Tabnine的本地运行选项为那些对隐私和数据安全有严格要求的用户提供了便利,尤其是在企业级项目中表现突出。此外,它的可定制性较强,允许用户根据项目需求进行调整,这一点在团队协作中尤为实用。
优点:
支持本地运行,保障数据隐私和安全。
代码补全功能强大,适用于多种语言和IDE。
可定制性高,能够适应团队或项目的需求。
缺点:
某些语言的代码生成质量较为基础,不如其他工具丰富。
高级功能需付费订阅,对个人开发者成本较高。
14. Replit Ghostwriter
功能亮点
实时代码补全:Replit Ghostwriter可以在开发者编写代码时提供实时的代码补全和建议,帮助加快开发速度。
支持多种语言:该工具支持Python、JavaScript、HTML、CSS等多种语言,尤其适用于全栈开发者。
集成Replit平台:Ghostwriter与Replit平台深度集成,适用于那些习惯在线开发的开发者,可以在浏览器中轻松使用。
使用体验
Replit Ghostwriter的使用体验非常轻便,尤其适合那些喜欢在线编程的开发者。它能够提供实时的代码建议,并且与Replit平台的其他工具无缝协作,帮助开发者快速实现代码的编写、运行和测试。
不过,由于Ghostwriter主要面向Replit用户,因此在桌面IDE中的功能有限。如果你习惯使用VS Code或JetBrains等桌面环境,可能会发现其功能不如其他工具全面。此外,它的代码生成在某些复杂场景中不如Codex或Copilot灵活。
优点:
适用于在线开发,方便快捷。
支持多种语言,适合全栈开发者。
实时代码补全功能提升开发效率。
缺点:
主要面向Replit平台用户,桌面IDE支持有限。
代码生成功能相对基础,复杂项目中表现不如其他工具。
高级功能需订阅,免费版功能较为有限。
15. 谷歌Codey
Codey是谷歌开发的一款AI代码助手,它基于谷歌的下一代大语言模型PaLM 2,旨在通过自然语言处理和代码生成技术,帮助开发者更高效地进行编程工作。
Codey的主要功能
代码补全:提供智能代码补全功能,帮助开发者快速编写代码。
代码生成:根据开发人员的自然语言提示生成代码。
代码聊天:允许开发人员与机器人对话,以获得调试、文档、学习新概念和其他与代码相关问题的帮助。
Codey的使用方式
Codey可以通过多种方式使用,包括作为浏览器插件、IDE插件等,方便开发者在不同的开发环境中使用。
优势
强大的语言理解和编程能力:基于PaLM 2模型,Codey能够理解复杂的编程需求并生成相应的代码。
支持多种编程语言:Codey支持20多种编程语言,包括Go、Java、JavaScript、Python等,满足不同开发者的需求。
与谷歌生态系统集成:Codey与谷歌的云服务和开发工具紧密集成,提供无缝的开发体验。
缺点
对网络连接的依赖:由于Codey是基于云的服务,因此需要稳定的网络连接才能正常使用。
隐私和安全问题:使用Codey可能涉及到代码和数据的上传,需要注意隐私和数据安全问题。
技术揭秘|代码追踪工具分享及应用指南来啦
自从绒绒与大家分享病毒分析报告以来,评论区的相关讨论不仅让绒绒成就感满满,也下定决心(暗暗攥拳)要和大家分享更多有意义的文章。总览评论后,绒绒发现大家不仅对病毒本身充满探究精神,也对工程师是通过什么方式对病毒进行分析以及在分析过程中使用什么工具感到好奇。那么今天就不讲病毒!让我们讲一讲如何“研究”病毒——特别是追踪技术在病毒分析中的应用。
随着网络环境的不断变化,恶意软件与病毒变种开始层出不穷,给安全研究和病毒分析工作带来了不小的挑战。比如在病毒逆向分析过程中,有高效代码保护能力的强壳加密技术,这种技术通常通过加密、压缩和虚拟化等手段隐藏或混淆程序代码,导致分析人员难以获得有效的解密方法,进而使得对病毒样本的调试、分析和修改工作变得复杂。常见的强壳如Themida、VMProtect,以及越来越广泛的自定义混淆壳(代码虚拟化),通常采用多种复杂的保护策略,包括但不限于代码加密、API钩子、反调试、反虚拟机技术等,这些都一定程度上增加了病毒逆向分析的难度。
病毒在升级,但我们的技术手段也在不断升级。比如在病毒逆向分析的过程中,分析者可通过追踪解析被保护程序或加壳程序。通过追踪程序的执行过程,分析者可以观察到程序运行时的行为,逐步揭示其加壳或加密的方式。追踪可通过多种方法进行,例如调试器、动态分析工具、代码注入等,这些方法有助于分析者跟踪程序的调用栈、数据流以及了解加壳后的解密过程,进而破除壳保护,恢复程序的原始功能和代码。
以下分享几种我们常用的代码追踪工具。
Pin 是 Intel 推出的一款适用于 IA-32 和 x86-64 架构的动态二进制插桩框架,支持包括指令级、基本块级、镜像级和函数级插桩在内的多种插桩方式。同时 Pin 拥有丰富的 API,这使得 Pin 能够抽象底层指令集的特性,并允许将上下文信息(如寄存器内容)作为参数传递给注入的代码。Pin 会自动保存和恢复被注入代码覆盖的寄存器内容,从而确保应用程序能够继续正常运行。此外,Pin 还可提供有限的符号及具有调试信息访问功能。作为一种前端工具,Pin 能够有效支持代码逆向分析,尤其在数据提取方面表现出色。
同时,Pin 也可视为一种即时翻译器(JIT),与其他翻译器不同的是,其输入的内容并非是字节码,而是常规的可执行文件,当文件在执行第一条指令时,Pin 会进行拦截控制,并为该指令及其后续代码序列生成新的“翻译”代码。之后,控制权被转交到新生成的中间代码序列,该序列与原始代码几乎一致。每当程序执行到分支退出时,Pin 会重新获得控制权,并为分支目标生成新的代码,继续执行后续操作。通过将所有生成的代码保留在内存中,Pin 提高了执行效率,使得代码可以被重复使用,并允许程序从一个序列直接跳转到另一个序列。
在 JIT 模式下,实际运行的是新生成的中间代码。原始代码仅作为参考,在生成代码时,Pin 给用户提供了注入自己代码(插桩)的机会。
Pin原理
回调函数
Pin 提供了一系列回调函数,用于实现程序的动态插桩。通过这些回调函数,可以对指令级、基本块级和函数级的程序进行插桩分析,并允许通过编写自定义的 Pintool 对程序进行不同程度的干预。这些功能使得 Pin 能够执行多种分析任务,例如代码性能分析、内存访问分析、代码覆盖率评估,以及检测潜在的漏洞或恶意代码。
- INS_AddInstrumentFunction (INSCALLBACK fun, VOID *val) 注册以指令粒度插桩的函数
- TRACE_AddInstrumentFunction (TRACECALLBACK fun, VOID *val) 注册以 trace 粒度插桩的函数 (基本块插桩)
- RTN_AddInstrumentFunction (RTNCALLBACK fun, VOID *val) 注册以 routine 粒度插桩的函数,函数级别的插桩需要符号信息
- IMG_AddInstrumentFunction (IMGCALLBACK fun, VOID *val) 注册以 image 粒度插桩的函数
- PIN_AddFiniFunction (FINICALLBACK fun, VOID *val) 注册在应用程序退出前执行的回调函数
- PIN_AddDetachFunction (DETACHCALLBACK fun, VOID *val) 注册在 Pin 通过PIN_Detach()函数放弃对应用程序的控制权限之前执行的函数,一个进程只调用一次,可以被任何线程调用
BBL(基本块)
BBL(Basic Block)即基本块,是程序执行中最小的执行单元之一。它通常由一系列连续的指令组成,这些指令之间不存在跳转,因此在基本块内程序控制流程是顺序执行的。在动态分析中,基本块被视为程序的一个“原子”执行单元。
Pin_BBL
Pin 保证每个 trace (追踪)只有一个顶部入口点,但可以有多个出口点。如果一个分支指令指向 trace 的中间位置,Pin 会生成一个新的 trace,并以该分支为起点。Pin 将 trace 切分成基本块,每个基本块称为“BBL”,每个 BBL 是一个具有单一入口和单一出口的指令序列。如果有分支指向 BBL 的中间位置,则会定义一个新的 BBL。通常,分析调用会以 BBL 为单位插入,这样可以减少分析调用对性能的影响。
Trace Instrumentation 通过 TRACE_AddInstrumentFunction API 进行注册 Trace 回调。
BBL_InsertCall
- 函数:VOID BBL_InsertCall(BBL bbl, IPOINT ipoint, AFUNPTR fun, …)
- 功能:在基本块插入回调函数
- 说明:允许在指定的基本块中插入回调函数,并在程序执行时触发该回调函数。IOPOINT 可指定回调函数插入位置的枚举类型,可以选择如 IOPOINT_BEFORE 、 IOPOINT_AFTER、IPointAny 等位置进行插桩IPointBefore:在基本块开始执行之前调用回调函数IPointAfter:在基本块执行结束之后调用回调函数IPointAny:在基本块的任何位置都可以调用回调函数
Pintools
基于 Pin 开发的 Pintools 是一种动态二进制插桩工具,也相当于动态程序分析工具,可用于对Linux、Windows 上的用户空间应用程序进行程序分析。因其能够实现无需重新编译源代码,即可在程序运行时进行插桩,所以 Pintools 也支持对动态生成代码进行插桩。Pintools 包括Intel® VTune™ Amplifier、Intel® Inspector、Intel® Advisor以及Intel®软件开发模拟器(Intel® SDE)。
通过编写简单的示例代码,可以对代码覆盖率进行简单分析,但这种方法在处理大量执行流的明文字符串时,会涉及到频繁的 IO 操作,特别是在分析那些被 VMProtect、Themida 等强壳保护的程序时,如果虚拟化的指令数量达到千万条时,追踪效率会大幅降低。为了优化这一过程,我们可以利用 ProtoBuf 库对数据进行序列化,并通过对 BBL 进行白名单标记,取消对重复执行代码块的插桩,从而提高追踪效率。
以样本 c997772c5f498acdc2bc3e94dccc4b76f1bb6c2f 为例,下面是对其进行插桩分析、生成追踪日志以及序列化后的数据情况。
追踪数据
序列化数据
利用 IDA 可以进一步增强代码覆盖率分析的准确性。通过统计每条指令的执行次数,可以计算出每个函数的执行覆盖率。即使在缺乏符号信息的情况下,借助 IDA 的函数识别功能,也能协助逆向分析人员精确分析出每个函数的代码覆盖率。注:绿色表示代码块已被执行。
代码覆盖图
通过代码覆盖率分析,可以看到病毒样本在添加启动项时的程序执行流程。结合 IDA 反编译器生成的伪代码,能够清晰标记出伪代码的覆盖率情况。通过分析伪代码的覆盖率,逆向分析人员可以轻松追踪病毒在执行过程中对注册表的操作过程。
指令代码覆盖率
代码覆盖率
代码覆盖率通过 Pin 对指令进行插桩,从而实现对执行地址的追踪。通过获取 RIP 寄存器的值,Pin 可以记录指令的执行情况,从而分析出哪些指令被执行过,哪些指令没有被执行过。此外,Pin 可通过对事件的监控来检测映像和模块的加载情况,并对相关模块进行追踪。通过对指令的插桩,Pin 可实时 Dump内存,查看内存状态,并对内存修改进行断点分析。同时,它也能对指令执行过程进行详细分析。
代码覆盖率分析通过追踪已执行的指令来判断哪些指令被执行过,哪些未被执行,并将这些信息记录到日志中。这些日志对于逆向分析人员来说非常有用,尤其是在判断 JCC 指令执行情况时,可以更准确的进行静态分析。
回溯分析
通过使用 IDA 插件分析日志中的 RIP 值,可以回溯 JCC 指令的相关执行流程,并实现内存断点执行的效果。
以下以指令粒度插桩进行打印 RIP 的例子:
首先,通过 INS_AddInstrumentFunction(Instruction, 0) 注册一个以指令粒度为单位的回调函数。接着,通过 INS_InsertCall 插入一个 pre 回调,用于在指令执行前记录并打印 RIP 寄存器的值。
采用上述方法,可以进行简单的代码覆盖率分析:通过记录 RIP 寄存器的值,可以追踪程序的指令流。RIP 寄存器的值有助于逆向分析人员分析哪些代码被执行过,以及识别程序中的“死代码”。此外,还可以统计执行的指令总数,为他们提供有价值的参考,帮助他们更高效地进行代码分析。
结合 IDA,可以通过颜色标识代码的执行状态直观展示代码覆盖率。不同的颜色代表指令是否被执行过,使得逆向分析人员能够快速识别区分哪些代码已经被执行,哪些代码未被执行。这种方法可以更高效地分析程序的控制流和潜在的死代码区域。
污点分析
污点分析是一种动态的信息流分析技术,它通过跟踪程序中不可信数据的流动来发现潜在的风险行为。在软件安全领域,有一个普遍认可的原则:“所有用户输入都是不可信的”。在动态污点分析中,用户输入的所有数据被视为“污点”,并对其在程序中的传播过程进行追踪。污点分析在逆向工程中被广泛应用于漏洞挖掘、软件破解等领域。通过动态污点分析,结合程序的执行轨迹和运行时的信息,能够追踪污点数据的传播路径,从而识别程序中的漏洞以及在软件破解中起到关键作用的 JCC (条件跳转指令)。污点分析的输入来源主要包括以下几个方面:
- 本地文件
- 网络报本
- 环境变量
- 程序消息事件响应
- …
污点分析一般原则
- 如果一条指令中至少有一个读操作涉及污染数据,则该指令的所有写操作都视为污染。
- 如果一条指令中的所有读操作均不涉及污染数据,则该指令的所有写操作都视为去污染。
如对程序进行指令级动态插桩,可以在每条指令执行之前分析出污点是否需要传播,以及涉及到的隐式读写过程中的污点是否需要传播。
- 确定污点传播记录数据结构每个线程的污点信息使用 thread_info 结构进行管理,每个寄存器的污点信息使用一个集合
- 污点传播回调函数
- 执行回调函数分析污点传播
通过简单的污点传播,可以找到污点传播过程中涉及到的关键跳转,以及那些被执行过且容易触发缓冲区的漏洞危险函数,这为进一步的 fuzz 执行提供了基础,有助于触发代码逻辑中的缺陷,污点分析详细过程可见下文Unicorn污点分析。
Unicorn 是一种基于动态二进制翻译的开源模拟器,作为 QEMU 的轻量级子集,支持模拟多种架构的指令集,如 x86、ARM、MIPS、SPARC 等。它能够在不同平台上模拟程序执行,是二进制分析、逆向工程、漏洞研究、恶意软件分析等领域的强大工具。
Unicorn 提供了对 CPU 仿真进行细粒度控制的能力,适用于开发自定义的二进制分析工具。借助 x64dbg 的 SDK,用户可以实现调试和模拟执行插件,详细记录指令执行过程中的寄存器状态和内存情况。这一功能为分析控制流、执行流及 JCC 相关代码提供了有力支持。
在强壳虚拟化的条件下,一条指令可能被混淆并扩展为数千万条指令,相比之下,常规调试器,如 x64dbg ,其指令追踪速度通常被限制在每秒 3k 条指令,远远无法满足逆向分析的需求。然而,通过 Unicorn 模拟指令执行,模拟速度能够达到每秒 5w 条指令,并完整记录指令执行过程中的寄存器和内存状态,可为逆向工程提供更高效的支持。
追踪效率
记录完整追踪过程
通过 Unicorn 模拟执行过程时,可以将涉及到的地址、指令、寄存器数据以及状态信息写入日志,进行完整的追踪和执行流记录。为了提高效率,这些日志数据会通过 Protobuf 进行序列化,以减少 I/O 操作,从而优化日志记录和存储过程。
通过SDK填充Map内存
通过 x64dbg SDK 中的 DbgGetRegDumpEx 和 VirtualQueryEx 等内存相关函数,可以将内存中的节区映射到 Unicorn 的内存中,并对堆栈内存进行映射,从而实现对程序的快速跟踪。
在将各个内存区段映射到 Unicorn 内存后,可利用 x64dbg 获取的寄存器状态信息对 Unicorn 进行设置,完成对程序的完整追踪。同时,记录指令执行情况,并将 API 输出结果打印到日志控制台。
API完整跟踪演示
追踪模拟至用户断点
对于用户设置的断点,经过强壳混淆的病毒样本通常会使关键跳转和 API 调用的返回地址不保存在栈中(即便保存了返回地址,也可能无法准确找到调用地址)。这种情况下,回溯关键位置变得十分困难。然而,通过 Unicorn 模拟执行,将相关信息打印到 x64dbg 控制台,以及追踪过程保存到日志文件,可以方便地查看调用地址前三条指令的跳转地址,从而帮助逆向分析。
用户断点演示
追踪模拟至API调用
在没有符号信息的情况下,当模拟执行至 API 调用时,如果程序执行跳转到用户区段之外的地址,模拟会停止。具体来说,一旦检测到程序跳转至不属于用户区段的地址,模拟就会停止,以防止继续执行无效或无法追踪的代码。
对于一个经过 VMP 虚拟化、变异以及导入表保护的 EXE 文件,使用 Unicorn 模拟可以快速定位 API 调用的位置,并有效回溯到 API 调用的源头。这种方法可以绕过强壳混淆,精确追踪程序的执行流,从而帮助分析人员完成逆向分析。
模拟到API调用演示
追踪模拟到跨节区执行
根据获取到的区段大小信息,我们可以定位当前所在节区并获取相关信息。通过调用 x64dbg 的 API ,以及读取 PE 内存中的 PE 节表信息,可获取所在节区的具体数据,并在模拟执行过程中,当程序跳转到下一个节区时停止执行。
根据 Unicorn 模拟执行到节区地址范围,我们可以更精准地确认脱壳过程中的 OEP,dump 出来更好的进行静态分析。
UPX壳跨节区演示
VMP壳虚拟+变异+导入表保护演示
Unicorn 污点分析与 Pin 污染分析的原理相同。Unicorn 可以通过 Capstone 反汇编引擎分析指令中的读写操作以及隐式的读写操作。如果指令中的读地址被标记为污染,那么相应的写操作地址也会被标记为污染;相反,如果读地址标记为非污染,写操作地址则也被标记为非污染。污染的地址会被记录并存储到动态数组中。除了这些基本规则,如有特殊指令涉及的污染地址则需要手动分析,具体包括:
- jmp reg,jmp [mem],call reg,call [mem],ret,Jcc
- 栈指令(push,pop,pushad,popad,pushfd,popfd)
- lea
- xchg,xadd
- 使用被污染的寄存器寻找内存
- 串操作指令(stos *,scas*,…)
- 去污染(xor eax,eax)
- …….
以push为例:
push eax将会读 eax,esp,写 esp,[esp-4]以一般原则中,如果 eax 是被污染的,则将 esp,[esp-4] 都给污染,人为分析可以发现 esp 是不用被污染的,只需要污染[esp – 4]。
以用户的输入为例,进行污点分析:
对用户输入 ESP 寄存器的值进行污点分析,通过污染传播可以清晰的发现用户输入的值经过了哪些处理。同时,通过追踪 EFLAGS ,在输入错误跳转到关键判断点时进行爆破。例如,je 0x4011a6 就是成功与否的关键判断点。
污点分析过程图
污点分析
通过上述污点分析,我们可以发现输入变量经过了哪些修改,以及这些修改是如何影响控制流执行的。
通过追踪输入变量在程序中的传播路径,我们可以观察到指令的变更,并进一步探究这些变更是如何对控制流产生影响的。
1.识别输入点
• 通常是程序接收到外部输入的地方,例如函数参数、文件读取、网络数据包或用户输入。
• [EBP + 8] 和 [EBP + 0xC] 可以视为两个输入点。
2.追踪变量的传播
• 分析输入数据在寄存器、内存和栈之间的流动,记录其影响的范围。
• mov eax, dword ptr [ebp + 8]:输入被加载到 EAX。
• mov ecx, byte ptr [eax]:EAX 的内容被用作指针,提取字节加载到 ECX。
• and ecx, eax:输入数据间接修改了 ECX 的值。
• 每一步都标记污点,并评估可能出现的影响。
3.识别控制流相关操作
• 条件跳转(如 je、jne)等指令是控制流的核心。
• and ecx, eax 的结果可能影响后续的跳转指令,从而影响决定程序的执行路径。
4.记录修改和分支点
• 通过寄存器和内存值的变化,构建数据依赖关系图。
• 确定哪些修改会影响到关键路径,评估是否可能被恶意输入利用。
英特尔处理器跟踪(Intel PT)是一种高性能的调试和性能分析工具,具备最新的英特尔 CPU 硬件辅助跟踪技术,旨在提供对程序执行行为的详细跟踪信息,广泛应用于调试、性能分析、安全研究等领域。目前,Intel Skylake 及更高版本的 CPU 均已配置此工具。Intel PT 能够在指令级别上触发和过滤代码执行的跟踪,通过仅存储以后重构程序控制流所必需的数据,用户可以根据需求选择需要跟踪的内容,例如特定线程、地址范围等,从而减少不必要的数据记录。对于病毒分析,通常使用 Filtering by CR3 对指定进程进行追踪,使用 Intel PT 进行追踪的效率以及内存的消耗可成指数级的加快。
Intel PT(Processor Trace)通过生成多种数据包记录控制流信息,这些数据包与程序的二进制代码结合使用,可以通过后处理工具生成精确的执行跟踪。数据包中包含的信息包括指令指针(IP)、间接分支的目标地址,以及基本块中条件分支的执行方向等。
Intel PT 的工作原理在于记录处理器执行过程中发生的分支指令。当 CPU 遇到分支指令(如je、call、ret等)时,会记录相应的执行情况:
- 条件跳转:用一位表示分支是否被执行(\”Taken\” 或 \”Not Taken\”)
- 间接调用和跳转:记录目标地址
- 无条件跳转:不会记录变化,因为目标地址可以从指令本身推断出
Intel PT 记录的指令指针(IP)会与之前的记录进行比较,并生成相关的数据包(如FUP、TIP、TIP.PGE或TIP.PGD)。如果地址的高位字节重叠,匹配的部分将被压缩存储。此外,对于\”近返回\”指令,如果返回目标正好是调用指令的下一条指令,则不会记录这一跳转,因为它可以根据控制流推断出来。
这种高效的记录机制使得 Intel PT 能够在消耗较少资源的情况下记录复杂的执行流程,同时为调试和性能分析提供了强有力的支持。
Intel Processor Trace Components
Trace Check
- 检测是否支持 Intel Processor Trace (PT)。 通过执行 CPUID 指令来检查 Intel 处理器是否支持 Intel Processor Trace (PT)。将 EAX 寄存器设置为 07H,将 ECX 寄存器设置为 0H,然后检查返回结果中的 EBX 寄存器的第25位(从0开始计数)。如果该位的值为1,表示处理器支持 Intel 处理器跟踪。
- 检测是否支持 Filtering by CR3。
check Filtering by CR3
Filtering by CR3
Intel Processor Trace (Intel PT) 提供了一种基于 CR3 寄存器值的精确跟踪过滤机制,允许开发者通过选择性地启用或禁用数据包生成,实现对特定内存上下文的细粒度性能分析和代码执行追踪。
其核心过滤原理如下:
- 实时监控 CR3 寄存器的值
- 仅在 CR3 值与预设条件匹配时生成体系结构状态数据包
- 显著减少跟踪数据量,专注于特定进程或内存上下文
实现机制包括:
- 将目标 CR3 值写入 IA32_RTIT_CR3_MATCH MSR
- 设置 IA32_RTIT_CTL.CR3Filter 控制位
- 当 CR3 值不匹配时,强制将 ContextEn 设置为 0,以阻止状态数据包的生成
关键特性:
- 精确过滤单一进程的执行轨迹
- 最小化性能开销
- 灵活的内存上下文追踪
通过精确配置 MSR 寄存器标志,Intel PT 实现了对单个进程执行可控且高效的追踪。
数据包解包
Intel PT 在追踪过程中生成的记录数据包需要使用官方的 Intel libipt 库来进行解包和分析。libipt 是解码 Intel PT 数据包的标准库,提供了如 ptdump 和 ptexd 等基本工具。通过对生成的 PSB 数据包进行解码,开发者可以分析关键跳转指令及其相关数据,从而获得更深入的执行过程理解和性能分析。
以下是使用Libipt库 API 实现对 PSB 进行解包的操作:
以下是《Intel® 64 and IA-32 Architectures Software Developer Manuals》中的一些常用数据字段解析:
PSB(数据包流边界)
PSB 数据包作为追踪包解码的同步标志,定义了追踪日志中的一个边界。在此处,解压缩过程可以独立进行,不会产生其他影响。在 libipt 库中,这个偏移量被称为“同步偏移量”(sync offset),因为它标志着追踪文件中的一个位置,从这个位置开始可以安全地解码后续的数据包。
TIP(目标 IP)
TIP 数据包表示目标 IP 地址。????????压缩省略地址高四字节。
TNT(条件分支执行状态)
TNT 数据包用于指示某个条件分支是否被执行。无条件跳转的分支不会被记录,因为这些流程控制可以从程序的状态中推导出来。
解包数据如下:
解包数据
通过解包数据,可以发现程序在执行过程中的 TIP 跳转到 7FFFFFFFF0a26c90 以及 0x405e0 偏移处存在的 TNT 跳转,这些信息有助于我们进一步借助代码实现更深入的分析。
数据包分析
解包后的数据包通过 IDA 进行分析,可使我们更方便地分析代码的执行流程及计算代码覆盖率。
虚拟沙盒
火绒虚拟沙盒实现了对超过数万个 API 的模拟,覆盖了绝大多数操作系统的核心机制,并支持多个操作系统平台:
- Windows x86/x64
- Linux x86/x64
- MacOS x86/x64
虚拟沙盒支持病毒查杀并对病毒进行追踪。通过虚拟化执行引擎,能够为目标代码划分独立的地址空间,并通过接管中断和异常为目标代码分配私有时间片,从而使目标代码得以受控制,执行效率几乎可以达到与真实机相当,且通过模拟目标代码的执行,可以快速进行通用脱壳和dump区段,免去了对强壳外壳的复杂分析工作。
火绒查杀引擎与调试器集合实现了对病毒的追踪,脱壳并自动修复 IAT,自动运行到调用 API,单步步过显示调用的 API。
模拟输出调用API演示
引擎追踪至跨节区演示
Dump 脱壳内存映像自动修复IAT演示
今天的技术分享到这里就结束啦,希望本篇文章,可以对大家探索病毒分析领域起到一定帮助。绒绒相信,这些工具和技术不仅仅是我们对抗恶意软件的利器,更是我们解码溯源、守卫网络安全的法宝。
在这个信息安全越来越被重视的时代,每一次技术的进步和应用都显得尤为重要,网络安全也不仅仅是专业人士的责任,更是与我们每个人的生活都息息相关。让我们一起筑起防护之盾,为整个网络空间的和谐与安全贡献力量。
最后,绒绒也要感谢大家的陪伴和支持,正是因为有了你们的好奇心和探索欲,我们的分享才更有意义。未来,绒绒会继续为大家挖掘更多网络安全的“宝藏”,分享更多有价值的技术知识,敬请期待吧~
你的代码助手已上线!Cline:让AI帮你搞定一切,不只是代码补全
还在为繁琐的编码任务头疼?还在为bug抓狂?别担心,你的救星来了!今天要给大家介绍的是一款名为 Cline(前称 Claude Dev)的开源项目,它可不是简单的代码补全工具,而是一个能够与你的命令行界面(CLI)和编辑器无缝协作的 AI 助手,让你体验真正的“解放双手”式编程。
Cline 就像一个拥有超能力的程序员同事,它基于强大的 Claude 3.5 Sonnet 模型,可以逐步处理复杂的软件开发任务。它不仅能创建和编辑文件,还能探索大型项目,甚至可以使用浏览器和执行终端命令(当然,是在你的授权下)。更厉害的是,它还能利用模型上下文协议 (MCP) 创建新工具,扩展自身的功能,简直是“自我进化”的典范!
与那些在沙箱环境中运行的自主 AI 脚本不同,Cline 采用了一种更安全、更易于访问的方式。它通过图形用户界面(GUI)展示每一个文件更改和终端命令,让你在充分了解的情况下进行操作,真正实现“人在回路”的自主 AI。
Cline 的功能可不是“花拳绣腿”,而是实打实的硬实力:
- 代码界的“神笔马良”: Cline 可以创建和编辑文件,并监控 linter/编译器错误,主动修复诸如缺少导入和语法错误等问题,简直是强迫症患者的福音!
- 终端的“老司机”: Cline 可以在你的终端中执行命令,并监控输出,比如在编辑文件后,它可以对开发服务器问题做出反应,简直是“未卜先知”!
- 浏览器的“操控者”: 针对 Web 开发任务,Cline 可以在无头浏览器中启动网站,进行点击、输入、滚动等操作,并捕获截图和控制台日志,让你轻松修复运行时错误和视觉 bug,简直是“火眼金睛”!
- “私人订制”工具: 通过模型上下文协议,你可以让 Cline 创建和安装针对你特定工作流程定制的工具,比如获取 Jira 任务、管理 AWS EC2 或拉取 PagerDuty 事件,简直是“私人管家”!
Cline 的部署和使用也相当简单:
- 安装扩展: 在你的 VSCode 中搜索并安装 Cline 扩展。
- 配置 API: Cline 支持 OpenRouter、Anthropic、OpenAI、Google Gemini 等多种 API 提供商,甚至可以使用本地模型(通过 LM Studio/Ollama)。选择你喜欢的 API 并进行配置。
- 开始使用: 使用 CMD/CTRL + Shift + P 快捷键打开命令面板,输入“Cline: Open In New Tab”即可在编辑器中打开 Cline。
- 输入任务: 将你的任务输入 Cline,并添加必要的上下文(如文件、文件夹、URL、问题等),然后就可以让 Cline 开始工作了!
小提示: Cline 会跟踪整个任务循环和 API 使用成本,让你对费用一目了然。
- 时间线(Timeline): Cline 对文件所做的所有更改都会记录在文件的时间线中,方便你跟踪和撤销更改。
- @指令: 使用 @url、@problems、@file、@folder 等指令,可以快速添加上下文信息,让 Cline 更快地理解你的需求。
- “在运行时继续”: 对于长时间运行的进程,可以使用“在运行时继续”按钮,让 Cline 在命令在后台运行时继续任务。
Cline 不仅仅是一个 AI 助手,更是一个能够真正提升你开发效率的强大工具。它能帮你处理繁琐的任务,让你专注于更具创造性的工作。如果你还在为编码而苦恼,不妨试试 Cline,相信它会给你带来惊喜!
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。