咳咳,各位观众老爷,晚上好!欢迎来到今天的“懒人逆向福音:Objection + Frida 自动化 Hooking” 讲座。我是你们的老朋友,今晚负责带大家偷懒的讲师。 咱们今天的主题,就是如何用 Objection 这个好东西,结合 Frida 的强大能力,让逆向工程变得更轻松、更自动化。说白了,就是教大家怎么“优雅”地偷懒! 第一部分:啥是 Objection?为啥要用它? 首先,咱们得明白 Objection 是个啥玩意儿。简单来说,Objection 就是 Frida 的一个“高级”封装。Frida 就像一个强大的底层工具库,啥都能干,但用起来稍微有点麻烦。而 Objection,就像一个已经帮你组装好的工具箱,里面放着常用的 Frida 脚本,可以直接拿来用,大大简化了操作。 为什么要用 Objection 呢?理由很简单: 省时间! 很多常用的 Hooking 操作,Objection 都已经帮你封装好了,一行命令搞定,不用自己写 Frida 脚本。 更简单! Objection 的命令更简洁易懂,上手更快,即使你对 Frida 不太熟悉,也能快速入门。 更安全?(这个存 …
JS `Frida` (`Dynamic Instrumentation Toolkit`):Hooking Native/JS 函数与内存修改
Alright, alright, settle down folks! Welcome, welcome! Glad to see so many eager faces ready to dive into the wild world of Frida. Today, we’re going to wrangle this beast and learn how to hook native and JS functions, and even mess around with memory, all while keeping it (relatively) legal and ethical. Think of Frida as your digital scalpel – powerful, precise, but requiring a steady hand and a healthy dose of respect. So, what is Frida? Simply put, it’s a dynamic instrumentation t …
继续阅读“JS `Frida` (`Dynamic Instrumentation Toolkit`):Hooking Native/JS 函数与内存修改”
JS `WebAssembly` `Debug Info` (`DWARF`) 与调试器集成
各位同学,早上好!或者晚上好!取决于你们在哪儿,以及什么时候看的这段文字。 今天咱们来聊聊一个有点“高冷”,但又非常重要的东西:WebAssembly的调试信息,也就是DWARF,以及它如何与调试器“眉来眼去”。 放心,我会尽量用大白话,把这个技术啃下来。 开场:WebAssembly的“灵魂” WebAssembly,简称Wasm,是一种为现代Web应用设计的新型二进制指令格式。它的目标是提供接近原生的性能,并且安全、高效。 但是,如果我们写了一堆Wasm代码,结果发现跑起来不对劲,怎么办? 总不能对着一堆十六进制的机器码抓瞎吧? 这时候,调试信息就派上用场了。 调试信息,就像是程序的“灵魂”,它告诉调试器: 源代码和Wasm代码之间的对应关系。 变量的名称、类型和存储位置。 函数的名称、参数和局部变量。 代码的行号和文件信息。 有了这些信息,我们就可以像调试普通代码一样,单步执行Wasm代码,查看变量的值,设置断点等等。 主角登场:DWARF (Debugging With Attributed Record Formats) DWARF,是一种广泛使用的调试信息格式。它最初是为U …
JS `Runtime Patching`:在运行时修改 JavaScript 函数或对象
各位观众,晚上好! 今天咱要聊点刺激的——JavaScript 运行时补丁! 听着就跟特工电影似的,对不对?但别紧张,这玩意儿其实没那么神秘,掌握了它,你也能在代码世界里玩一把“碟中谍”。 什么是运行时补丁? 简单来说,运行时补丁就是在程序运行的时候,动态地修改现有的 JavaScript 函数或者对象。 这就像给正在飞行的飞机换引擎,听着就刺激! 为什么要用运行时补丁? 你可能会问,好好的代码,为什么要搞这些花里胡哨的? 别急,听我给你举几个栗子: Bug 修复: 线上环境发现了一个紧急 Bug,但又不能立即发布新版本,这时候运行时补丁就能救急,先临时修复,避免更大的损失。 A/B 测试: 你想测试两种不同的功能实现,但不想修改源代码,运行时补丁可以让你动态地切换不同的实现。 功能增强: 在不改变原有代码的情况下,给现有的函数添加一些额外的功能,比如日志记录、性能监控等等。 兼容性处理: 针对不同的浏览器或环境,动态地修改一些函数的行为,解决兼容性问题。 调试和分析: 在运行时修改代码,插入一些调试语句,帮助你更好地理解程序的运行过程。 运行时补丁的实现方式 好了,说了这么多,咱们来 …
JS `Hooking Browser APIs` (`XMLHttpRequest`, `fetch`, `localStorage`) 监听行为
各位靓仔靓女,今天咱们来聊点刺激的:JS Hooking Browser APIs,也就是“扒浏览器API的底裤”。放心,咱们不违法犯罪,只是为了更好地理解和控制我们的代码。 先来个友好的提醒:Hooking 是一把双刃剑,用好了可以降妖除魔,用不好可能引火烧身。所以,务必遵守法律法规,尊重他人隐私,仅用于学习和安全研究目的。 一、为什么要Hook? 想象一下,你正在做一个安全审计工具,需要监控网站的所有网络请求,或者你想调试一个第三方库,看看它到底往 localStorage 里塞了什么乱七八糟的东西。这时候,Hooking 就派上用场了。 简单来说,Hooking 就是在函数调用前后插入我们的代码,就像在高速公路上设置一个检查站,拦截每一辆经过的车,检查乘客信息。 二、Hooking 的几种姿势 咱们主要关注 XMLHttpRequest、fetch 和 localStorage 这三大金刚。 XMLHttpRequest (XHR) XMLHttpRequest 可是个老家伙了,但依然活跃在前端舞台上。Hooking 它,可以监控所有的 AJAX 请求。 原理: 替换原生的 XM …
继续阅读“JS `Hooking Browser APIs` (`XMLHttpRequest`, `fetch`, `localStorage`) 监听行为”
JS `Decompiler` (反编译器) 对 JavaScript `Bytecode` 的还原
各位靓仔靓女,晚上好!我是今晚的主讲人,很高兴能和大家一起聊聊JS Decompiler这个有点神秘,但又超级实用的工具。今天咱们就来扒一扒它的底裤,看看它到底是怎么把JavaScript Bytecode“复原”成我们能看懂的JavaScript代码的。 啥是JavaScript Bytecode? 在深入Decompiler之前,咱得先弄明白JavaScript Bytecode到底是何方神圣。简单来说,它就是JavaScript引擎(比如V8、SpiderMonkey)在执行JavaScript代码之前,先把代码编译成的一种中间表示形式。你可以把它想象成一种机器更能理解的“暗号”,但又不是直接的机器码。 为什么要搞这么个东西呢?原因很简单,效率!直接执行JavaScript源码太慢了,编译成Bytecode之后,引擎可以更快地执行,优化也更容易。 源代码: const sum = (a, b) => a + b; console.log(sum(1, 2)); 简化版Bytecode (V8为例,实际更复杂): LdaSmi 1 // Load Small Integer …
JS `Source Map` `Deobfuscation`:从压缩代码还原原始代码
各位靓仔靓女,欢迎来到今天的“代码还原术:Source Map Deobfuscation解密”讲座!我是你们今天的导游,将带大家一起探索如何将那些让人头大的压缩代码,变回我们熟悉的原始代码。准备好了吗?Let’s roll! 第一站:代码压缩与混淆——为什么要搞事情? 在正式开始解密之前,我们先来聊聊为什么要对代码进行压缩和混淆。简单来说,主要有以下几个目的: 减少文件大小: 压缩可以减少 JavaScript 文件的大小,从而加快页面加载速度,提升用户体验。想象一下,如果你的网站加载速度慢如蜗牛,用户早就跑去竞争对手那里了。 保护代码: 混淆可以使代码更难被理解,增加破解和逆向工程的难度,保护你的知识产权。虽然不能完全阻止,但至少可以提高门槛,让那些心怀不轨的人望而却步。 优化性能: 一些压缩工具还可以优化代码结构,删除不必要的空格和注释,进一步提升性能。 常见的压缩和混淆工具包括: UglifyJS: 一个流行的 JavaScript 压缩工具,可以删除空格、注释,缩短变量名等。 Terser: UglifyJS 的一个分支,修复了 UglifyJS 的一些问题,并增 …
JS `Heap Snapshots` (`Chrome DevTools`) 分析与内存泄漏导致的敏感信息泄露
大家好,今天咱们聊聊JS堆快照这玩意儿,以及它背后隐藏的内存泄漏和敏感信息泄露危机 各位观众老爷,咱们今天不开车,聊点硬核的。主题就是JS堆快照(Heap Snapshots),这名字听起来就有点让人打怵,但其实它是个好东西,能帮咱们揪出内存泄漏这只烦人的小虫子,还能顺带发现一些敏感信息泄露的蛛丝马迹。但是,用不好,也可能反过来变成泄露敏感信息的帮凶。所以,今天咱们就来扒一扒它的底裤,看看它到底是个什么玩意儿,以及怎么用好它。 什么是堆快照? 简单来说,堆快照就是给你的JS堆内存拍张照片。这张照片记录了当前时刻,你的JavaScript程序里所有对象的状态。包括: 对象类型: 比如是数组、字符串、函数、DOM节点等等。 对象大小: 每个对象占用了多少内存。 对象之间的引用关系: 哪些对象引用了哪些对象。 想象一下,你的程序是一个拥挤的房间,堆快照就是从上帝视角俯瞰整个房间,记录了每个人(对象)的位置、大小,以及他们之间手拉手的关系。 为什么要用堆快照? 主要有两个目的: 排查内存泄漏: JS的垃圾回收机制理论上应该自动回收不再使用的内存。但有时候,由于一些错误的代码逻辑,导致某些对象即 …
继续阅读“JS `Heap Snapshots` (`Chrome DevTools`) 分析与内存泄漏导致的敏感信息泄露”
JS `Concolic Testing`:混合符号执行与具体执行
各位朋友,早上好/下午好/晚上好!(取决于你们看到这段文字的时间)今天咱们来聊聊一个听起来有点玄乎,但实际上很有意思的技术——Concolic Testing,也就是混合符号执行与具体执行。准备好,咱们要开始一场“代码侦探”之旅了! 第一幕:啥是Concolic Testing? 想象一下,你是一个侦探,手里有一份代码,目标是找出里面的Bug。传统的测试方法就像你拿着各种各样的线索(测试用例)去验证代码是否按照预期运行。但有些Bug藏得很深,需要你像福尔摩斯一样,既要根据已有的线索(具体执行),又要进行逻辑推理(符号执行)。 Concolic Testing就像一个同时拥有福尔摩斯和华生的侦探组合。华生负责拿着具体线索(具体值)跑代码,福尔摩斯负责根据华生的观察结果(代码执行路径)进行逻辑推理,找出新的线索(新的测试用例),然后让华生继续验证。 简单来说,Concolic Testing就是混合(Con)具体(Concrete)执行和符号(Symbolic)执行的一种测试技术。 具体执行(Concrete Execution): 用实际的输入值运行代码,观察代码的执行路径和结果。 符号 …
JS `Symbolic Execution` (符号执行) 理论与实践:探索程序路径
各位老铁,早上好/中午好/晚上好! 今天咱们来聊聊一个听起来很高大上,但其实也挺有趣的玩意儿:JS 符号执行。 别害怕,虽然名字带“符号”,但它不是什么神秘的炼金术。 简单来说,它是一种分析程序的技术,能够帮你找出代码中隐藏的路径,发现一些你可能没想到的Bug。 一、 什么是符号执行?(别被名字吓到!) 想象一下,你写了一个函数,需要输入一些参数。通常情况下,你会用一些具体的数值来测试它,比如: function abs(x) { if (x < 0) { return -x; } else { return x; } } console.log(abs(5)); // 输出 5 console.log(abs(-3)); // 输出 3 这没毛病,但问题是,你不可能测试所有可能的输入值。如果 abs 函数里面藏着一个只有在 x 是某个特定值的时候才会触发的Bug呢? 你很可能就错过了! 符号执行就厉害了。它不是用具体的数值来运行你的代码,而是用 符号! 比如,把 x 变成一个符号变量,比如 x_symbol。 然后,它会分析你的代码,找出所有可能的执行路径,并且用 x_symb …