├── Article ├── 01第一课、模拟器环境搭建.md ├── 02第二课、初识APK文件结构、双开、汉化、基础修改.md ├── 03第三课、初识smali,vip终结者,一键三连.md ├── 04第四课、恭喜你获得广告&弹窗静默卡.md ├── 05第五课、Jeb动态调试,Log插桩.md ├── 06第六课、校验的N次方-签名校验对抗的多种姿势、PM代理、IO重定向.md ├── 07第七课、Sorry,会Hook真的可以为所欲为-Xposed快速上手(上)模块编写,Api详解.md ├── 08第八课、不好意思,会Hook真的可以为所欲为-xposed快速上手(下)常用Api,免root与快速Hook.md ├── 09第九课、密码学基础、算法自吐、非标准加密对抗.md ├── 10第十课、不是我说,有了IDA还要什么女朋友?.md ├── 12第十二课、大佬帮我分析一下.md ├── 13第十三课、是时候学习一下Frida一把梭了(上).md ├── 14第十四课、是时候学习一下Frida一把梭了(中).md ├── 15第十五课、是时候学习一下Frida一把梭了(下).md ├── 16第十六课、是时候学习一下Frida一把梭了(终).md ├── 17第十七课、你的RPCvs佬的RPC.md ├── 18第十八课、表哥,你也不想你的Frida被检测吧!(上).md ├── 19第十九课、表哥,你也不想你的Frida被检测吧!(下).md ├── 20第二十课、抓包学得好,牢饭吃得饱(上).md ├── 23第二十一课、抓包学得好,牢饭吃得饱(中).md ├── 24第二十二课、抓包抓得好,牢饭吃得饱(下).md ├── 25第二十三课、黑盒魔法之Unidbg.md ├── _assets_00 │ ├── 7462852ab6eb72614bcf04006c7899b8889.webp │ └── 806bdcfee5aaf91ed799d9848e39bc631049.webp ├── _assets_01 │ ├── QQ_cX1PyTDD8C.webp │ ├── QQ_x1fLNSspol.webp │ └── magisk.webp ├── _assets_02 │ ├── 0805127fa851ed69cc1b88602b4e030f.webp │ └── cb35179c3ff8786b19fc1d2d2ecae12e.webp ├── _assets_03 │ ├── 96c49239b5565c8b8e8e55e724a08a79.webp │ └── fe7852e13a354ab54af29ff3a3361b3f.webp ├── _assets_04 │ ├── 095224403891.gif │ ├── 526ed2cdc5a4bd33be2389203d8141d2.webp │ └── d810cf812e87dd8cbbb663cf9b1247a4.webp ├── _assets_05 │ ├── 6662c1557c35c098361cf868274174e5.webp │ ├── aafaf597b418757a41a89c24897606fe.webp │ ├── d0b83f14677ccee75fdeb7891e1886c95009.webp │ └── ff8d9deea26f077ba163581b7baa78e5681.webp ├── _assets_06 │ ├── 103358lyvv78yxjzjvctvb.webp │ ├── 1d7ab639d33cce3e5d833dd68ce90f56.webp │ ├── 2501f84f8f0b1e23adf198e9597429c6.webp │ ├── 4f081fbd5d9cc7007c8e69a30a54066d.webp │ ├── 8b9292b5d889c38f1202491d80ca9a732735.webp │ ├── c43f1a2451e41a9087ae2f383f21f908.gif │ ├── d59a8b67dd64ebaf64c340af074a9ad0.webp │ └── e9ec81f588d2f36b4864db4eb7527eb4.webp ├── _assets_07 │ ├── 04ea10cee93fed63a897374f30454fbc.webp │ ├── 446f8d3dd904807ec67410eb40c0e185.webp │ ├── 7c151d078e0c180a9c51dfd50b26c4d6.webp │ ├── 92d1daf78d96dcb10b3351f808a9021c.webp │ └── ad601470ed9b3277ac4f2921374ee046.webp ├── _assets_08 │ ├── 072712a5b22db342388d6d48c6c04786.webp │ ├── 14fa2f859dff8270661317c87ff31bc5.webp │ ├── 91014da5df72d045bdc9fcc522e8591c.webp │ ├── 9502d04fe683e2e0775f0eea93924366.gif │ └── dee2255c9aee5991068d78d00574c251.webp ├── _assets_09 │ ├── 2115b905b61a6e036f43b84c8bcd545d.webp │ ├── 2f6c631fd006975522c8f28626bcc2d4.webp │ ├── 37f7b824a5b1b89590d1bb77930479ab.webp │ ├── 9728127b75870d2592e42699757952d8.webp │ └── bb79537ec46505e2af3db6ad7d945ef8.webp ├── _assets_10 │ ├── 01f4bf013198aea885d9e513ad5e5eec4798.webp │ ├── 35d0832fb2523805c2a2165ec5458caa.webp │ ├── 666c7661bc9de4a54f730bb789af63f74113.webp │ ├── 7a7ad0ff5b441646156f6116cbcf8e2a610.webp │ └── cc9934d4392e49ed2c51e35cf94ab8e2.webp ├── _assets_12 │ ├── 10237711b2389cc4046111f281e2a5114798.webp │ ├── 2e6d7fec6426ee782c457ef47dc1b6532185.webp │ ├── 3c7df87b5caf4fb8e8eb5a5e6770974c3143.webp │ ├── 4e6ce8bed2fc8fe127883b353d430a3c633.webp │ ├── 5657f2b0cb88f9410b9ec005374483ee4165.webp │ ├── 5fbd65841b315413cbe285ece4abe44a461.webp │ ├── 70e8ece9cfaf25fc157f469ee70bdc276221.webp │ ├── 7dc6951312deb223eacc28000e5a6f555599.webp │ ├── b34cc8827fbdcf1c81e83be078d66ea25457.webp │ ├── bb663034587188a1fa4ebf55789f66542707.webp │ ├── bf90da0211002f1447698023d489397a9710.webp │ ├── c9b8f1571cbb4a08837a2c93193b722f3091.webp │ ├── d69ff8297a12fd1c9fe7ff62fbe5efae4286.webp │ ├── d8f025d0c0cf38b9964e616fe5a642a51839.webp │ └── e966a143f2519a137216d5614e0e2ea36269.webp ├── _assets_13 │ ├── 13975df155153ae785b86e901db44d921765.webp │ ├── 24a6bd098ba2f33600cd53a0aefef3505230.webp │ └── 7db57bb7af605621210756bc21aa9b674367.webp ├── _assets_14 │ ├── 057447279037dfcbc1b27773d51ea7126180.webp │ ├── 13975df155153ae785b86e901db44d921765.webp │ ├── 149aa38a7e5ef7ea0a4f1e2cfa0815a66608.webp │ ├── 6f038189728ce1e3ca2b7a590a4693534680.webp │ ├── a7d36d5536989c6662d83cd3b69fa840277.webp │ └── f45308a95f466b7f2288c9f03aed90bc8183.webp ├── _assets_15 │ ├── 13975df155153ae785b86e901db44d921765.webp │ └── a5da95feb308079617adbee3cfae85357280.webp ├── _assets_16 │ ├── 006f2041e717d32f007ac202d9bd245d4025.webp │ ├── 13975df155153ae785b86e901db44d921765.webp │ ├── 2316edaea1d4685375ef7ecb0104f9196857.webp │ ├── 288c4c7447228d803b9355891be976457415.webp │ ├── 6030c0c3518cca31e9a9651dadc2875f7693.webp │ ├── 9f23f5f8dc5bb2f1c7b14f2ad406c7891341.webp │ ├── bb1e9696cffc6368f24605e2beb99f16502.webp │ └── d3cdcddccaaf1eba5e437f1ea8c458939121.webp ├── _assets_17 │ ├── 0db17e0b880167caae73ae1d053047827157.webp │ ├── 1e77b1180d8562a0eb8017c2d90a818d5780.webp │ ├── 736d19fb6b13e4941e89ff14a865f1dc2087.webp │ ├── 8e23e0092e459ba360f377debbdc0fce4256.webp │ ├── beaaaa5baa4343112edc32e063495a3f1535.webp │ ├── c8871d492cda099d0676d4736744e6c88770.webp │ ├── da9478cb5246e031efadb5715dbfe3d67084.webp │ ├── e6e9f54a157df42bc4dbf4bd5b853a2f1637.webp │ └── e8dd5433c357eda94f0db69d5fc0c9989444.webp ├── _assets_18 │ ├── 25f2a3c1d478357bb60008780a9539bf6487.png │ ├── 4dc9b4a36e937c443bbce777ada6b57e4327.png │ ├── 8d434c16d1a2af86d824723e4525de9e8343.png │ └── c66e1b5d8a9d09e037108b9234450a8b6913.png ├── _assets_19 │ ├── 05021abca85b3171197d0fe3fb67ab6b4981.png │ ├── 12c3c4392e3cbe98d587338ffaa17b958258.png │ ├── 4dc9b4a36e937c443bbce777ada6b57e4327.png │ ├── 5d77cb0275b0416dd9108347d069a6543952.png │ ├── 6083ea10892635db16bebb2051bde8c15922.png │ ├── 95a5834b93e0e9b4656b2ee59d3b03f26690.png │ ├── a706cdbf6ef8fe2814f0db18564378892331.png │ └── e9b4df380b4d463c8071b32d63fd79474022.png ├── _assets_20 │ ├── 037c4aed12239c01c68cd9da85f4d41a770.png │ ├── 080ccff1430b2a09b4843c24f12e1b68918.png │ ├── 2135d73a0203b4c0fda76d1ebbf0e28f6280.png │ ├── 2380a96afbab29c6075f2fa59e9434d75797.png │ ├── 29cff81a83469952c3d4f740070331dd6871.png │ ├── 2cee7f32addd3a3a7a5a252515f830db4663.png │ ├── 2e542318c825d13ce7498dab098840661279.png │ ├── 3e7f8a47c0f69b8da215cae330eab47a5378.png │ ├── 455a205768f13c92aeea2e898158975b8453.png │ ├── 5608695270c253c624622537a8155b381372.png │ ├── 742f6986f3bff27771801393776f76512492.png │ ├── 79d382a325703d7728471f92fc602c285040.png │ ├── 8d8d2629791f8063c5ad7d7c94ac50d04881.png │ ├── 9f3a11e0f48d829f9a162cd47644cf2b6822.png │ ├── a8dd57da277921b813a230908e36a6024643.png │ ├── b1cacf9dbbf615d546d1ce24ebcc6fb77277.png │ ├── c64c33e20b330e6fa3c40a816a2381b77908.png │ ├── charles_hdr.863548d1.png │ ├── d29310bddba69aac4b6f0187e9e76c6a7761.png │ ├── d321d630a0b0fd956f81bf1f194b14063637.png │ ├── ef555a1827efb3dfcef6f426fc1085716419.jpeg │ └── wireshark-logo.png ├── _assets_21 │ ├── 01c867a0f9c7aa12547fff13d7da37233297.png │ ├── 0a9a2100cf372797d71d6eef020f20995509.png │ ├── 10412680bca1b1eb36f35b94753359722389.png │ ├── 220f891dcbe0141f943329092d824e8f4823.png │ ├── 270791dea38b7180e01545da7451c4838629.png │ ├── 2c99b38732db09c7c53ff41c01558c829480.png │ ├── 2fe64e3f49905acfb778c9e768d877903919.png │ ├── 327705fdbf6c6e9174662278103993333896.png │ ├── 46ae4e01cb09f73cdcc08aa9d186a59f4749.png │ ├── 4e90d681954f292f3d0d1fa449a283826951.png │ ├── 55c4c46ec2a7069adba004a951b6155f8883.png │ ├── 7ee730055cad5f62a71757086a60393e6576.png │ ├── 8d1507667471fd97a56535605ee2f8394322.png │ ├── acbec70f90e02bc9b22e03329310dced8210.png │ ├── b1f52f35ce477799124866bf8c2f03665392.png │ ├── b3c57e78ebf7c0f4b78a7455d2d8202c9612.png │ ├── b558f9e5955df257c7a69fdf2674a32b7773.png │ ├── cca5d2acd5a5489d4deabe0a8cb1075c7230.png │ ├── ccffa5dc15c369ef1db76ef41a13bb903741.png │ ├── cea0767af148752ed9b8fbee9084b9c53235.png │ ├── eb0b10801f015a40537d6a47f65a81e64424.png │ ├── fc153f6ac1c211d8585b54ec7aed6f106586.png │ └── fd5f2e774a73c9cab41771670ddd44d63517.jpeg ├── _assets_23 │ ├── 08bd74f1969f4ad3e07239687aace37d1767.png │ ├── 3e7d68353ecaa9c62720955d1d230ea61665.png │ ├── 3f61fa813672068bbdd42947d4d6d6907655.png │ ├── 616433f141a1a49e76ff6be600dfcde46951.png │ ├── 690785bc58639169df752ca001d82e038823.png │ ├── 693f228eb6a69046a950dd8b35992c6f3820.png │ ├── 860cb5670ca1da633d4f7cd69a9b024a8599.png │ ├── 9008c362571f7ceff9b68a57858707423332.png │ ├── b4cacbf211c796ba7ccd9ca8fdfae8905990.png │ ├── b66485d2d34c392a8f599b496a59f0fc3877.png │ ├── c64c33e20b330e6fa3c40a816a2381b77908.png │ ├── fa47478f32c76bf2adee8ad73e206b295695.png │ └── 微信图片_20240916205905.jpg ├── _assets_24 │ ├── 0595862b33c3749fe0addb56298b2e092560.png │ ├── 51503d979edc786ef59d17daba088e824447.png │ ├── a79c8f5b13843a9791737f663c5354e07037.png │ └── c64c33e20b330e6fa3c40a816a2381b77908.png ├── _assets_25 │ ├── 0595862b33c3749fe0addb56298b2e092560.png │ ├── 2c7e201d38f159b6415498665139dd537331.png │ ├── 425674e586a164f240dbdecc013a29375961.png │ ├── 42f64fbf7955fee4e576103830d0b9362530.png │ ├── 6928ce9343c8d818db850a9a6f510f9a774.png │ ├── a5a71662ce7a80f210e94738b801fcf09656.png │ └── f570c80361c53cd8b69d789d1b0a175d6192.png ├── 番外实战篇1-某电影视全家桶.md ├── 番外实战篇2-【2024春节】解题领红包活动,启动!.md └── 番外实战篇3-拨云见日之浅谈Flutter逆向.md ├── README.md ├── _assets └── 9fa626afac76ce38386a510dc71a78682196.webp └── scripts ├── .gitignore ├── download_images.mjs ├── package-lock.json └── package.json /Article/01第一课、模拟器环境搭建.md: -------------------------------------------------------------------------------- 1 | # 一.什么是安卓逆向? 2 | 3 | 安卓逆向是对已经打包好的APP进行反编译、源码分析了解APP实现逻辑的一门技术 4 | # 二.安卓逆向可以干嘛? 5 | 6 | 去更新 7 | 去广告 8 | 内购/会员破解 9 | 协议自动签到 10 | 白嫖!!! 11 | 拜托,会逆向的人超酷的好嘛 12 | 13 | # 三.适合人群 14 | 15 | 小白、零基础人群 16 | 先来一碗鸡汤:改天是哪天,下次是哪次,以后是多久,去经历,去后悔。保持热爱,奔赴山海。我们都在奔赴各自不同的人生!!! 17 | 18 | # 四.教程简介 19 | 20 | 参考之前发的 21 | [《关于我在吾爱破解论坛学安卓逆向这档事》预告](https://www.52pojie.cn/thread-1692384-1-1.html) 22 | PS:我不是程序员,安卓逆向只是兴趣,可能讲的不好,还请各位大佬多多包涵。另外本教程只是个基础的,并没有什么含金量。所以,如果能帮到一些新朋友培养起对安卓逆向的兴趣,那已经是物尽其用了。 23 | # 五.Magisk介绍 24 | 25 | ![](_assets_01/magisk.webp) 26 | 27 | 28 | Magisk 是一套用于定制 Android 的开源软件,支持高于 Android 5.0 的设备。 29 | 30 | 以下是一些功能亮点: 31 | 32 | -   **MagiskSU**:为应用程序提供 root 访问权限 33 | -   **Magisk 模块**:通过安装模块修改只读分区 34 | -   **MagiskHide**:从根检测 / 系统完整性检查中隐藏 Magisk(Shamiko) 35 | -   **MagiskBoot** : 最完整的安卓启动镜像解包和重新打包工具 36 | 37 | 38 | 39 | # 六.安装步骤 40 | 41 | 42 | 1.到官网下载9.0模拟器,并安装 43 | https://www.ldmnq.com/ 44 | 45 | [更新!]适用于几乎所有安卓模拟器(7+)安装magisk的教程-简单无脑向 46 | https://www.52pojie.cn/thread-1583586-1-1.html 47 | (出处: 吾爱破解论坛) 48 | 49 | 50 | 2.下载配置文件 51 | 52 | 3.安装面具 53 | 54 | # 七.答疑 55 | 56 | Magisk刷不上 57 | ![](_assets_01/QQ_cX1PyTDD8C.webp) 58 | 59 | 60 | 这种情况可能是你下的是最新版雷电模拟器,需要在设置里把读写权限打开 61 | 62 | ![](_assets_01/QQ_x1fLNSspol.webp) 63 | 64 | 65 | # 八.视频及课件地址 66 | 67 | [百度云](https://pan.baidu.com/s/1cFWTLn14jeWfpXxlx3syYw?pwd=nqu9) 68 | [阿里云](https://www.aliyundrive.com/s/TJoKMK6du6x) 69 | [哔哩哔哩](https://www.bilibili.com/video/BV1wT411N7sV) 70 | 71 | # 九.后续更新地址 72 | 73 | 74 | [《安卓逆向这档事》二、初识APK文件结构、双开、汉化、基础修改](https://www.52pojie.cn/thread-1695796-1-1.html) 75 | [《安卓逆向这档事》三、初识smail,vip终结者](https://www.52pojie.cn/thread-1701353-1-1.html)   76 | [《安卓逆向这档事》四、恭喜你获得广告&弹窗静默卡](https://www.52pojie.cn/thread-1706691-1-1.html) 77 | [《安卓逆向这档事》五、1000-7=?&动态调试&Log插桩](https://www.52pojie.cn/thread-1714727-1-1.html) 78 | [《安卓逆向这档事》六、校验的N次方-签名校验对抗、PM代{过}{滤}理、IO重定向](https://www.52pojie.cn/thread-1731181-1-1.html) 79 | [《安卓逆向这档事》七、Sorry,会Hook真的可以为所欲为-Xposed快速上手(上)模块编写,常用Api](https://www.52pojie.cn/thread-1740944-1-1.html) 80 | [《安卓逆向这档事》八、Sorry,会Hook真的可以为所欲为-xposed快速上手(下)快速hook](https://www.52pojie.cn/thread-1748081-1-1.html) 81 | [《安卓逆向这档事》九、密码学基础、算法自吐、非标准加密对抗](https://www.52pojie.cn/thread-1762225-1-1.html) 82 | [《安卓逆向这档事》十、不是我说,有了IDA还要什么女朋友?](https://www.52pojie.cn/thread-1787667-1-1.html) 83 | [《安卓逆向这档事》十二、大佬帮我分析一下](https://www.52pojie.cn/thread-1809646-1-1.html) 84 | [《安卓逆向这档事》番外实战篇1-某电影视全家桶](https://www.52pojie.cn/thread-1814917-1-1.html) 85 | [《安卓逆向这档事》十三、是时候学习一下Frida一把梭了(上)](https://www.52pojie.cn/thread-1823118-1-1.html) 86 | [《安卓逆向这档事》十四、是时候学习一下Frida一把梭了(中)](https://www.52pojie.cn/thread-1838539-1-1.html) 87 | 88 | 89 | PS:解压密码都是52pj,阿里云由于不能分享压缩包,所以下载exe文件,双击自解压 90 | -------------------------------------------------------------------------------- /Article/02第二课、初识APK文件结构、双开、汉化、基础修改.md: -------------------------------------------------------------------------------- 1 | ![|400](_assets_02/0805127fa851ed69cc1b88602b4e030f.webp) 2 | 3 | # 一、课程目标 4 | 5 | 1.了解APK文件结构 6 | 7 | 8 | 2.双开APK,简单了解原理 9 | 10 | 11 | 3.汉化APK 12 | 13 | 14 | 4.简单修改APK名字、图标 15 | 16 | # 二、工具 17 | 1.教程Demo 18 | 19 | 2.MT管理器/NP管理器 20 | 21 | 3.开发者助手 22 | 23 | 4.雷电模拟器 24 | 25 | # 三、课程内容 26 | 27 | ## 1、Apk结构 28 | 29 | apk 全称 Android Package,它相当于一个压缩文件,只要在电脑上将apk后缀改为rar即可解压。 30 | 31 | | 文件 | 注释 | | 32 | | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | --- | 33 | | assets目录 | 存放APK的静态资源文件,比如视频,音频,图片等 | | 34 | | lib 目录 | armeabi-v7a基本通用所有android设备,arm64-v8a只适用于64位的android设备,x86常见用于android模拟器,其目录下的.so文件是c或c++编译的动态链接库文件 | | 35 | | META-INF目录 | 保存应用的签名信息,签名信息可以验证APK文件的完整性,相当于APK的身份证(验证文件是否又被修改) | | 36 | | res目录 |res目录存放资源文件,包括图片,字符串等等,APK的脸蛋由他的layout文件设计 | | 37 | | AndroidMainfest.xml文件 | APK的应用清单信息,它描述了应用的名字,版本,权限,引用的库文件等等信息 | | 38 | | classes.dex文件 | classes.dex是java源码编译后生成的java字节码文件,APK运行的主要逻辑 | | 39 | | resources.arsc文件 | resources.arsc是编译后的二进制资源文件,它是一个映射表,映射着资源和id,通过R文件中的id就可以找到对应的资源 | | 40 | 41 | ## 2.双开及原理 42 | 43 | 双开:简单来说,就是手机同时运行两个或多个相同的应用,例如同时运行两个微信 44 | | 原理 | 解释 | 45 | | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- | 46 | | 修改包名 |让手机系统认为这是2个APP,这样的话就能生成2个数据存储路径,此时的多开就等于你打开了两个互不干扰的APP | 47 | | 修改Framework | 对于有系统修改权限的厂商,可以修改Framework来实现双开的目的,例如:小米自带多开 | 48 | | 通过虚拟化技术实现 | 虚拟Framework层、虚拟文件系统、模拟Android对组件的管理、虚拟应用进程管理 等一整套虚拟技术,将APK复制一份到虚拟空间中运行,例如:平行空间 | 49 | | 以插件机制运行 |利用反射替换,动态代理,hook了系统的大部分与system—server进程通讯的函数,以此作为“欺上瞒下”的目的,欺骗系统“以为”只有一个apk在运行,瞒过插件让其“认为”自己已经安装。例如:VirtualApp | 50 | 51 | 52 | ## 3.汉化APK 53 | 54 | 汉化:使用专门的工具对外文版的软件资源进行读取、翻译、修改、回写等一系列处理,使软件的菜单、对话框、提示等用户界面显示为中文,而程序的内核和功能保持不变,这个过程即为软件汉化 55 | 56 | 基本上字符串都是在arsc里,建议一键汉化,然后再润色。 57 | 少量没汉化到的字符串参考视频中的方法定位去逐个汉化。 58 | 59 | ### 流程图 60 | 这里还需要注意的是,如果要直装应用,那就应该先签名安装,看看是否有签名校验导致的闪退 61 | ![|800](_assets_02/cb35179c3ff8786b19fc1d2d2ecae12e.webp) 62 | 63 | ## 4.初识AndroidMainfest.xml 64 | --- 65 | AndroidManifest.xml文件是整个应用程序的信息描述文件,定义了应用程序中包含的Activity,Service,Content provider和BroadcastReceiver组件信息。每个应用程序在[根目录](https://so.csdn.net/so/search?q=%E6%A0%B9%E7%9B%AE%E5%BD%95&spm=1001.2101.3001.7020)下必须包含一个AndroidManifest.xml文件,且文件名不能修改。它描述了package中暴露的组件,他们各自的实现类,各种能被处理的数据和启动位置。 66 | | 属性 | 定义 | 67 | | ---------------------------------- | -------------------------------------------------------- | 68 | | versionCode | 版本号,主要用来更新,例如:12 | 69 | | versionName | 版本名,给用户看的,例如:1.2 | 70 | | package | 包名,例如:com.zj.52pj.demo | 71 | | uses-permission android:name="" | 应用权限,例如:android.permission.INTERNET 代表网络权限 | 72 | | android:label="@string/app_name" |应用名称 | 73 | | android:icon="@mipmap/ic_launcher" | 应用图标路径 | 74 | |  android:debuggable="true" | 应用是否开启debug权限 | 75 | 76 | #  四、课后小作业 77 | 78 | 1.试着自己找个应用双开、修改名字、找个英文应用汉化 79 | 2.替换第一关挑战中的图片 80 | 81 | # 六、视频及课件地址 82 | 83 | [百度云](https://pan.baidu.com/s/1cFWTLn14jeWfpXxlx3syYw?pwd=nqu9) 84 | [阿里云](https://www.aliyundrive.com/s/TJoKMK6du6x) 85 | [哔哩哔哩](https://www.bilibili.com/video/BV1wT411N7sV) 86 | 87 | # 七、其他章节 88 | 89 | [《安卓逆向这档事》一、模拟器环境搭建](https://www.52pojie.cn/thread-1695141-1-1.html) 90 | [《安卓逆向这档事》二、初识APK文件结构、双开、汉化、基础修改](https://www.52pojie.cn/thread-1695796-1-1.html) 91 | [《安卓逆向这档事》三、初识smail,vip终结者](https://www.52pojie.cn/thread-1701353-1-1.html)   92 | [《安卓逆向这档事》四、恭喜你获得广告&弹窗静默卡](https://www.52pojie.cn/thread-1706691-1-1.html) 93 | [《安卓逆向这档事》五、1000-7=?&动态调试&Log插桩](https://www.52pojie.cn/thread-1714727-1-1.html) 94 | [《安卓逆向这档事》六、校验的N次方-签名校验对抗、PM代{过}{滤}理、IO重定向](https://www.52pojie.cn/thread-1731181-1-1.html) 95 | [《安卓逆向这档事》七、Sorry,会Hook真的可以为所欲为-Xposed快速上手(上)模块编写,常用Api](https://www.52pojie.cn/thread-1740944-1-1.html) 96 | [《安卓逆向这档事》八、Sorry,会Hook真的可以为所欲为-xposed快速上手(下)快速hook](https://www.52pojie.cn/thread-1748081-1-1.html) 97 | [《安卓逆向这档事》九、密码学基础、算法自吐、非标准加密对抗](https://www.52pojie.cn/thread-1762225-1-1.html) 98 | [《安卓逆向这档事》十、不是我说,有了IDA还要什么女朋友?](https://www.52pojie.cn/thread-1787667-1-1.html) 99 | [《安卓逆向这档事》十二、大佬帮我分析一下](https://www.52pojie.cn/thread-1809646-1-1.html) 100 | [《安卓逆向这档事》番外实战篇1-某电影视全家桶](https://www.52pojie.cn/thread-1814917-1-1.html) 101 | [《安卓逆向这档事》十三、是时候学习一下Frida一把梭了(上)](https://www.52pojie.cn/thread-1823118-1-1.html) 102 | [《安卓逆向这档事》十四、是时候学习一下Frida一把梭了(中)](https://www.52pojie.cn/thread-1838539-1-1.html) 103 | 104 | 105 | 106 | # 八、参考文档 107 | 108 | 109 | [【VirtualAPP 双开系列08】如何实现多开 - UID](https://blog.csdn.net/u014294681/article/details/116270479) 110 | 111 | 112 | PS:解压密码都是52pj,阿里云由于不能分享压缩包,所以下载exe文件,双击自解压 113 | -------------------------------------------------------------------------------- /Article/03第三课、初识smali,vip终结者,一键三连.md: -------------------------------------------------------------------------------- 1 | ![|400](_assets_03/96c49239b5565c8b8e8e55e724a08a79.webp) 2 | # 一、课程目标 3 | 4 | 1.了解JVM、Dalvik、ART 5 | 6 | 2.初识smali语法 7 | 8 | 3.实战修改smali 9 | 10 | # 二、工具 11 | 12 | 1.教程Demo(更新) 13 | 14 | 2.MT管理器/NP管理器 15 | 16 | 3.雷电模拟器 17 | 18 | 4.jadx-gui 19 | 20 | 5.核心破解 21 | 22 | # 三、课程内容 23 | ## 1.什么是JVM、Dalvik、ART 24 | JVM是JAVA虚拟机,运行JAVA字节码程序 25 | 26 | Dalvik是Google专门为Android设计的一个虚拟机,Dalvik有专属的文件执行格式dex(Dalvik executable) 27 | 28 | Art(Android Runtime)相当于Dalvik的升级版,本质与Dalvik无异 29 | 30 | ## 2.smali及其语法 31 | smali是Dalvik的寄存器语言,smali代码是dex反编译而来的。 32 | 33 | 关键字 34 | | 名称 | 注释 | 35 | | ----------- | -------------------------- | 36 | | .class | 类名 | 37 | | .super | 父类名,继承的上级类名名称 | 38 | | .source | 源名 | 39 | | .field | 变量 | 40 | | .method | 方法名 | 41 | | .register | 寄存器 | 42 | | .end method | 方法名的结束 | 43 | | public | 公有 | 44 | | protected | 半公开,只有同一家人才能用 | 45 | | private | 私有,只能自己使用 | 46 | | .parameter | 方法参数 | 47 | | .prologue|方法开始 48 | |.line xxx|位于第xxx行 | 49 | 50 | 数据类型对应 51 | 52 | | smali类型 | java类型 | 注释 | 53 | | --------- | --------------------------------- | -------------------- | 54 | | V | void | 无返回值 | 55 | | Z | boolean | 布尔值类型,返回0或1 | 56 | | B | byte | 字节类型,返回字节 | 57 | | S | short | 短整数类型,返回数字 | 58 | | C | char | 字符类型,返回字符 | 59 | | I | int | 整数类型,返回数字 | 60 | | J | long (64位 需要2个寄存器存储) | 长整数类型,返回数字 | 61 | | F | float | 单浮点类型,返回数字 | 62 | | D | double (64位 需要2个寄存器存储) | 双浮点类型,返回数字 | 63 | | string | String | 文本类型,返回字符串 | 64 | | Lxxx/xxx/xxx | object | 对象类型,返回对象 | 65 | 66 | 常用指令 67 | 68 | | 关键字 | 注释 | 69 | | ------------ | ------------------------------------------------------ | 70 | | const | 重写整数属性,真假属性内容,只能是数字类型 | 71 | | const-string | 重写字符串内容 | 72 | | const-wide | 重写长整数类型,多用于修改到期时间。 | 73 | | return | 返回指令 | 74 | | if-eq | 全称equal(a=b),比较寄存器ab内容,相同则跳 | 75 | | if-ne | 全称not equal(a!=b),ab内容不相同则跳 | 76 | | if-eqz | 全称equal zero(a=0),z即是0的标记,a等于0则跳 | 77 | | if-nez | 全称not equal zero(a!=0),a不等于0则跳 | 78 | | if-ge | 全称garden equal(a>=b),a大于或等于则跳 | 79 | | if-le | 全称little equal(a<=b),a小于或等于则跳 | 80 | | goto | 强制跳到指定位置 | 81 | | switch | 分支跳转,一般会有多个分支线,并根据指令跳转到适当位置 | 82 | | iget | 获取寄存器数据 | 83 | | | | 84 | 85 | 86 | 其余指令可用语法工具查询 87 | 88 | 定位方法:搜索弹窗关键字、抓取按钮id 89 | 90 | 91 | 例子: 92 | ```java 93 | //一个私有、静态、不可变的方法 方法名 94 | .method private static final onCreate$lambda-2(Lkotlin/jvm/internal/Ref$IntRef;Lcom/zj/wuaipojie/ui/ChallengeSecond;Landroid/widget/ImageView;Landroid/widget/ImageView;Landroid/widget/ImageView;Landroid/view/View;)Z //(这里面是方法的参数)这里是方法返回值类型,表示布尔值类型,返回假或真 95 | .registers 7 //寄存器数量 96 | 97 | .line 33 //代码所在的行数 98 | iget p0, p0, Lkotlin/jvm/internal/Ref$IntRef;->element:I //读取p0(第一个参数,参考寄存器知识)中element的值赋值给p0 99 | 100 | const/4 p5, 0x1 //p5赋值1 101 | 102 | const/16 v0, 0xa //v0赋值10,在16进制里a表示10 103 | 104 | if-ge p0, v0, :cond_15 //判断p0的值是否大于或等于v0的值(即p0的值是否大于或等于10),如果大于或等于则跳转到:cond_15 105 | 106 | .line 34 //以下是常见的Toast弹窗代码 107 | check-cast p1, Landroid/content/Context; //检查Context对象引用 108 | 109 | const-string p0, "请先获取10个硬币哦" //弹窗文本信息,把""里的字符串数据赋值给p0 110 | 111 | check-cast p0, Ljava/lang/CharSequence; //检查CharSequence对象引用 112 | 113 | invoke-static {p1, p0, p5}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast; 114 | //将弹窗文本、显示时间等信息传给p1 115 | 116 | move-result-object p0 //结果传递给p0 117 | 118 | invoke-virtual {p0}, Landroid/widget/Toast;->show()V //当看到这个Toast;->show你就应该反应过来这里是弹窗代码 119 | 120 | goto :goto_31 //跳转到:goto_31 121 | 122 | :cond_15 //跳转的一个地址 123 | 124 | invoke-virtual {p1}, Lcom/zj/wuaipojie/ui/ChallengeSecond;->isvip()Z //判断isvip方法的返回值是否为真(即结果是否为1) 125 | 126 | move-result p0 //结果赋值给p0 127 | 128 | if-eqz p0, :cond_43 //如果结果为0则跳转cond_43地址 129 | 130 | const p0, 0x7f0d0018 //在arsc中的id索引,这个值可以进行查询 131 | 132 | .line 37 133 | invoke-virtual {p2, p0}, Landroid/widget/ImageView;->setImageResource(I)V //设置图片资源 134 | 135 | const p0, 0x7f0d0008 136 | 137 | .line 38 138 | invoke-virtual {p3, p0}, Landroid/widget/ImageView;->setImageResource(I)V 139 | 140 | const p0, 0x7f0d000a 141 | 142 | .line 39 143 | invoke-virtual {p4, p0}, Landroid/widget/ImageView;->setImageResource(I)V 144 | 145 | .line 40 146 | sget-object p0, Lcom/zj/wuaipojie/util/SPUtils;->INSTANCE:Lcom/zj/wuaipojie/util/SPUtils; 147 | 148 | check-cast p1, Landroid/content/Context; 149 | 150 | const/4 p2, 0x2 //p2赋值2 151 | 152 | const-string p3, "level" //sp的索引 153 | 154 | invoke-virtual {p0, p1, p3, p2}, Lcom/zj/wuaipojie/util/SPUtils;->saveInt(Landroid/content/Context;Ljava/lang/String;I)V //写入数据 155 | 156 | goto :goto_50 //跳转地址 157 | 158 | :cond_43 159 | 160 | check-cast p1, Landroid/content/Context; 161 | 162 | 163 | const-string p0, "\u8bf7\u5148\u5145\u503c\u5927\u4f1a\u5458\u54e6\uff01" //请先充值大会员哦! 164 | 165 | 166 | check-cast p0, Ljava/lang/CharSequence; 167 | 168 | 169 | invoke-static {p1, p0, p5}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast; 170 | 171 | 172 | move-result-object p0 173 | 174 | 175 | 176 | invoke-virtual {p0}, Landroid/widget/Toast;->show()V 177 | 178 | 179 | :goto_50 180 | return p5 //返回p5的值 181 | .end method //方法结束 182 | 183 | 184 | //判断是否是大会员的方法 185 | .method public final isvip()Z 186 | .registers 2 187 | 188 | const/4 v0, 0x0 //v0赋值0 189 | 190 | return v0 //返回v0的值 191 | 192 | .end method 193 | 194 | ``` 195 | 196 | 197 | 修改方法:修改判断、强制跳转、修改寄存器的值 198 | 199 | ![](_assets_03/fe7852e13a354ab54af29ff3a3361b3f.webp) 200 | 201 | 202 | ## 3.寄存器 203 | --- 204 | 在smali里的所有操作都必须经过寄存器来进行:本地寄存器用v开头数字结尾的符号来表示,如v0、 v1、v2。 参数寄存器则使用p开头数字结尾的符号来表示,如p0、p1、p2。特别注意的是,p0不一定是函数中的第一个参数,在非static函数中,p0代指“this",p1表示函数的第一个 参数,p2代表函数中的第二个参数。而在static函数中p0才对应第一个参数(因为Java的static方法中没有this方法) 205 | 206 | 207 | # 四、课后小作业 208 | 209 | 1.关掉视频自己复现三种方法 210 | 2.完成这个作业demo(因为最近实在是太太太忙了,绝对不是因为我懒,咕咕咕。搞懂这个demo那也基本上能理解本节课的内容) 211 | 丑小鸭师傅的demo 212 | 链接:[https://pan.baidu.com/s/1cUInoi](https://pan.baidu.com/s/1cUInoi) 密码:07p9 213 | 原文链接:[教我兄弟学Android逆向02 破解第一个Android程序](https://www.52pojie.cn/thread-650395-1-1.html) 214 | 215 | # 五、反思&答疑 216 | 217 | 关于jadx搜不到大会员的unicode编码,这是因为我录视频之前在设置里把unicode的转义打开而导致的,像你们第一次安装jadx都是默认关闭这个选项的,所以能直接搜到大会员的汉字!!! 218 | 219 | 由于准备不是很充足,我感觉我讲的不是太好,多看看我列举参考文档有利于理解smali语法。 220 | 221 | 对于开发者而言,在打包应用时,最好对代码进行混淆,否则逆向人员轻而易举得进行Crack,或者说在写代码的时候就不要用isvip、getvip等易辨识的单词作为方法名 222 | 223 | 224 | # 六、视频及课件地址 225 | 226 | 227 | [百度云](https://pan.baidu.com/s/1cFWTLn14jeWfpXxlx3syYw?pwd=nqu9) 228 | [阿里云](https://www.aliyundrive.com/s/TJoKMK6du6x) 229 | [哔哩哔哩](https://www.bilibili.com/video/BV1wT411N7sV) 230 | 231 | PS:解压密码都是52pj,阿里云由于不能分享压缩包,所以下载exe文件,双击自解压 232 | 233 | # 七、其他章节 234 | [《安卓逆向这档事》一、模拟器环境搭建](https://www.52pojie.cn/thread-1695141-1-1.html) 235 | [《安卓逆向这档事》二、初识APK文件结构、双开、汉化、基础修改](https://www.52pojie.cn/thread-1695796-1-1.html) 236 | [《安卓逆向这档事》三、初识smail,vip终结者](https://www.52pojie.cn/thread-1701353-1-1.html)   237 | [《安卓逆向这档事》四、恭喜你获得广告&弹窗静默卡](https://www.52pojie.cn/thread-1706691-1-1.html) 238 | [《安卓逆向这档事》五、1000-7=?&动态调试&Log插桩](https://www.52pojie.cn/thread-1714727-1-1.html) 239 | [《安卓逆向这档事》六、校验的N次方-签名校验对抗、PM代{过}{滤}理、IO重定向](https://www.52pojie.cn/thread-1731181-1-1.html) 240 | [《安卓逆向这档事》七、Sorry,会Hook真的可以为所欲为-Xposed快速上手(上)模块编写,常用Api](https://www.52pojie.cn/thread-1740944-1-1.html) 241 | [《安卓逆向这档事》八、Sorry,会Hook真的可以为所欲为-xposed快速上手(下)快速hook](https://www.52pojie.cn/thread-1748081-1-1.html) 242 | [《安卓逆向这档事》九、密码学基础、算法自吐、非标准加密对抗](https://www.52pojie.cn/thread-1762225-1-1.html) 243 | [《安卓逆向这档事》十、不是我说,有了IDA还要什么女朋友?](https://www.52pojie.cn/thread-1787667-1-1.html) 244 | [《安卓逆向这档事》十二、大佬帮我分析一下](https://www.52pojie.cn/thread-1809646-1-1.html) 245 | [《安卓逆向这档事》番外实战篇1-某电影视全家桶](https://www.52pojie.cn/thread-1814917-1-1.html) 246 | [《安卓逆向这档事》十三、是时候学习一下Frida一把梭了(上)](https://www.52pojie.cn/thread-1823118-1-1.html) 247 | [《安卓逆向这档事》十四、是时候学习一下Frida一把梭了(中)](https://www.52pojie.cn/thread-1838539-1-1.html) 248 | 249 | 250 | # 八、参考文档 251 | 252 | [ 移动安全Android逆向系列:Dalvik概念&破解实例](https://forum.butian.net/share/649) 253 | 254 | [【原木文章】Android改造者之路-02.初探smali功法](https://www.52pojie.cn/thread-1485681-1-1.html) 255 | 256 | [吾爱破解安卓逆向入门教程(三)---深入Smali文件](https://www.52pojie.cn/thread-396966-1-1.html) 257 | 258 | [吾爱破解安卓逆向入门教程(四)---Smali函数分析](https://www.52pojie.cn/thread-397858-1-1.html) 259 | -------------------------------------------------------------------------------- /Article/04第四课、恭喜你获得广告&弹窗静默卡.md: -------------------------------------------------------------------------------- 1 | ![](_assets_04/095224403891.gif) 2 | # 一、课程目标 3 | 4 | 1.了解安卓四大组件、Activity生命周期 5 | 6 | 2.弹窗定位、去更新 7 | 8 | 3.广告分析与布局优化 9 | 10 | # 二、工具 11 | 12 | 1.教程Demo(更新) 13 | 14 | 2.MT管理器/NP管理器 15 | 16 | 3.算法助手 17 | 18 | 4.雷电模拟器 19 | 20 | 5.jadx-gui 21 | 22 | 6.开发助手 23 | 24 | # 三、课程内容 25 | 26 | ## 1.广告类型 27 | 28 | 启动广告 弹窗&更新广告 横幅广告 29 | ![|800](_assets_04/526ed2cdc5a4bd33be2389203d8141d2.webp) 30 | ## 2.安卓四大组件 31 | 32 | | 组件 | 描述 | 33 | | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | 34 | | Activity(活动) | 在应用中的一个Activity可以用来表示一个界面,意思可以理解为“活动”,即一个活动开始,代表 Activity组件启动,活动结束,代表一个Activity的生命周期结束。一个Android应用必须通过Activity来运行和启动,Activity的生命周期交给系统统一管理。 | 35 | | Service(服务) | Service它可以在后台执行长时间运行操作而没有用户界面的应用组件,不依赖任何用户界面,例如后台播放音乐,后台下载文件等。 | 36 | | Broadcast Receiver(广播接收器) | 一个用于接收广播信息,并做出对应处理的组件。比如我们常见的系统广播:通知时区改变、电量低、用户改变了语言选项等。 | 37 | | Content Provider(内容提供者) |作为应用程序之间唯一的共享数据的途径,Content Provider主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的接口。Android内置的许多数据都是使用Content Provider形式,供开发者调用的(如视频,音频,图片,通讯录等) | 38 | 39 | ### 1.activity的切换 40 | ```xml 41 |          42 |          46 |              47 |              48 |              49 |                  51 |                  52 |                  54 |              55 |          56 |          58 |          61 |          64 |          67 |          70 |          72 | ``` 73 | 74 | 启动广告流程: 75 | 启动Activity->广告Activity->主页Activity 76 | 77 | 修改方法: 78 | 1.修改加载时间 79 | 2.Acitivity切换定位,修改Intent的Activity类名 80 | 81 | ```java 82 | switch (position) { 83 |             case 0: 84 |                 Intent intent = new Intent(); 85 |                 intent.setClass(it.getContext(), ChallengeFirst.class); 86 |                 it.getContext().startActivity(intent); 87 |                 return; 88 |             case 1: 89 |                 Intent intent2 = new Intent(); 90 |                 intent2.setClass(it.getContext(), ChallengeSecond.class); 91 |                 it.getContext().startActivity(intent2); 92 |                 return; 93 |             case 2: 94 |                 Intent intent3 = new Intent(); //new一个Intent, 95 |                 intent3.setClass(it.getContext(), AdActivity.class); //传入要切换的Acitivity的类名 96 |                 it.getContext().startActivity(intent3); //启动对应的Activity 97 |                 return; 98 |             case 3: 99 |                 Intent intent4 = new Intent(); 100 |                 intent4.setClass(it.getContext(), ChallengeFourth.class); 101 |                 it.getContext().startActivity(intent4); 102 |                 return; 103 |             default: 104 |                 return; 105 |         } 106 | 107 | ``` 108 | 109 | 110 | ## 3.Activity生命周期 111 | 112 | | 函数名称 | 描述 | 113 | | ----------- | ---- | 114 | | onCreate() |一个Activity启动后第一个被调用的函数,常用来在此方法中进行Activity的一些初始化操作。例如创建View,绑定数据,注册监听,加载参数等。 | 115 | | onStart() |当Activity显示在屏幕上时,此方法被调用但此时还无法进行与用户的交互操作。 | 116 | | onResume() |这个方法在onStart()之后调用,也就是在Activity准备好与用户进行交互的时候调用,此时的Activity一定位于Activity栈顶,处于运行状态。 | 117 | | onPause() | 这个方法是在系统准备去启动或者恢复另外一个Activity的时候调用,通常在这个方法中执行一些释放资源的方法,以及保存一些关键数据。 | 118 | | onStop() |这个方法是在Activity完全不可见的时候调用的。 | 119 | | onDestroy() |这个方法在Activity销毁之前调用,之后Activity的状态为销毁状态。 | 120 | | onRestart() | 当Activity从停止stop状态恢进入start状态时调用状态。 | 121 | 122 | ![](_assets_04/d810cf812e87dd8cbbb663cf9b1247a4.webp) 123 | 124 | ## 4.弹窗定位&堆栈分析 125 | 126 | 修改方法: 127 | 1.修改xml中的versiocode 128 | 2.Hook弹窗(推荐算法助手开启弹窗定位) 129 | 3.修改dex弹窗代码 130 | 4.抓包修改响应体(也可以路由器拦截) 131 | 132 | ## 5.布局优化 133 | 134 | 1.开发者助手抓布局 135 | 2.MT管理器xml搜索定位 136 | 3.修改xml代码 137 | ```xml 138 | android:visibility="gone" 139 | 140 | ``` 141 | 142 | 143 | 144 | # 四、课后小作业 145 | 定位并去除作业demo首页中的弹窗 146 | [https://wwl.lanzoub.com/iVKJk0f0pi7g](https://wwl.lanzoub.com/iVKJk0f0pi7g) 147 | 148 | [作业反馈贴](https://www.52pojie.cn/thread-1706783-1-1.html) 149 | 150 | # 六、视频及课件地址 151 | 152 | 153 | [百度云](https://pan.baidu.com/s/1cFWTLn14jeWfpXxlx3syYw?pwd=nqu9) 154 | 155 | [阿里云](https://www.aliyundrive.com/s/TJoKMK6du6x) 156 | 157 | [哔哩哔哩](https://www.bilibili.com/video/BV14v4y1D7yA/?vd_source=6dde16dc6479f00694baaf73a2225452) 158 | 159 | PS:解压密码都是52pj,阿里云由于不能分享压缩包,所以下载exe文件,双击自解压 160 | # 七、其他章节 161 | [《安卓逆向这档事》一、模拟器环境搭建](https://www.52pojie.cn/thread-1695141-1-1.html) 162 | [《安卓逆向这档事》二、初识APK文件结构、双开、汉化、基础修改](https://www.52pojie.cn/thread-1695796-1-1.html) 163 | [《安卓逆向这档事》三、初识smail,vip终结者](https://www.52pojie.cn/thread-1701353-1-1.html)   164 | [《安卓逆向这档事》四、恭喜你获得广告&弹窗静默卡](https://www.52pojie.cn/thread-1706691-1-1.html) 165 | [《安卓逆向这档事》五、1000-7=?&动态调试&Log插桩](https://www.52pojie.cn/thread-1714727-1-1.html) 166 | [《安卓逆向这档事》六、校验的N次方-签名校验对抗、PM代{过}{滤}理、IO重定向](https://www.52pojie.cn/thread-1731181-1-1.html) 167 | [《安卓逆向这档事》七、Sorry,会Hook真的可以为所欲为-Xposed快速上手(上)模块编写,常用Api](https://www.52pojie.cn/thread-1740944-1-1.html) 168 | [《安卓逆向这档事》八、Sorry,会Hook真的可以为所欲为-xposed快速上手(下)快速hook](https://www.52pojie.cn/thread-1748081-1-1.html) 169 | [《安卓逆向这档事》九、密码学基础、算法自吐、非标准加密对抗](https://www.52pojie.cn/thread-1762225-1-1.html) 170 | [《安卓逆向这档事》十、不是我说,有了IDA还要什么女朋友?](https://www.52pojie.cn/thread-1787667-1-1.html) 171 | [《安卓逆向这档事》十二、大佬帮我分析一下](https://www.52pojie.cn/thread-1809646-1-1.html) 172 | [《安卓逆向这档事》番外实战篇1-某电影视全家桶](https://www.52pojie.cn/thread-1814917-1-1.html) 173 | [《安卓逆向这档事》十三、是时候学习一下Frida一把梭了(上)](https://www.52pojie.cn/thread-1823118-1-1.html) 174 | [《安卓逆向这档事》十四、是时候学习一下Frida一把梭了(中)](https://www.52pojie.cn/thread-1838539-1-1.html) 175 | 176 | -------------------------------------------------------------------------------- /Article/05第五课、Jeb动态调试,Log插桩.md: -------------------------------------------------------------------------------- 1 | ![|500](_assets_05/6662c1557c35c098361cf868274174e5.webp) 2 | # 一、课程目标 3 | 1.配置java环境 4 | 5 | 2.了解并掌握动态调试 6 | 7 | 3.了解并掌握Log插桩 8 | 9 | # 二、工具 10 | 11 | 1.教程Demo 12 | 13 | 2.MT管理器/NP管理器 14 | 15 | 3.jeb 16 | 17 | 4.雷电模拟器 18 | 19 | 5.XappDebug 20 | 21 | # 三、课程内容 22 | 23 | ## 1.配置java环境 24 | 25 | 1.下载jdk文件并安装(课件里有) 26 | 2.配置java环境 27 | ps:在视频里面环境配置只配置了一个JAVA_HOME 28 | 还有一个Path和CLASSPATH,请参考这篇文档,写得很详细,配置完后记得cmd窗口输入java验证一下 29 | [java 环境配置(详细教程)](https://blog.csdn.net/xhmico/article/details/122390181) 30 | 31 | ## 2.什么是动态调试 32 | 33 | 动态调试是指自带的调试器跟踪自己软件的运行,可以在调试的过程中知道参数或者局部变量的值以及履清代码运行的先后顺序。多用于爆破注册码(CTF必备技能) 34 | 35 | ## 3.动态调试步骤 36 | 37 | ### 1.修改debug权限 38 | 方法一:在AndroidManifest.xml里添加可调试权限 39 | ```xml 40 | android:debuggable="true" 41 | ``` 42 | 43 | 方法二:XappDebug模块hook对应的app 44 | 45 | 项目地址 46 | 47 | [XappDebug](https://github.com/Palatis/XAppDebug) 48 | 49 | 方法三:Magisk命令(重启失效) 50 | 51 | ``` 52 | 1. adb shell #adb进入命令行模式 53 | 54 | 2. su #切换至超级用户 55 | 56 | 3. magisk resetprop ro.debuggable 1 57 | 58 | 4. stop;start; #一定要通过该方式重启 59 | ``` 60 | 61 | 方法四:刷入MagiskHide Props Config模块(永久有效,但我这两台手机都不行,哭死,呜呜呜) 62 | 63 | 一般来说,在4选项中如果有ro.debuggable那就直接修改 64 | 没有的话就选5 65 | ![](_assets_05/aafaf597b418757a41a89c24897606fe.webp) 66 | 修改ro.debuggable的值为1 67 | 68 | 69 | ### 2.端口转发以及开启adb权限 70 | 71 | 72 | 版本号点击七次开启开发者模式并开启adb调试权限 73 | 74 | 夜神模拟器:adb connect 127.0.0.1:62001 75 | 76 | ### 3.下段点 77 | 78 | 79 | ctrl+b下断点 80 | 81 | ### 4.debug模式启动 82 | 83 | 84 | ``` 85 | adb shell am start -D -n com.zj.wuaipojie/.ui.MainActivity 86 | ``` 87 | adb shell am start -D -n 88 | adb shell am start -D -n 包名/类名 89 | am start -n 表示启动一个activity 90 | am start -D 表示将应用设置为可调试模式 91 | 92 | ### 5.Jeb附加调试进程 93 | 94 | 激活jeb 95 | 96 | 在线python运行 97 | [https://tool.lu/coderunner/](https://tool.lu/coderunner/) 98 | 99 | 算号代码: 100 | ```python 101 | #[url=https://bbs.pediy.com/]https://bbs.pediy.com/[/url] 102 | #!/usr/bin/env python 103 | import os, sys, struct, time, binascii, hashlib 104 | 105 | RC4_Key2= 'Eg\xa2\x99_\x83\xf1\x10' 106 | 107 | def rc4(Key, inData): 108 | Buf = "" 109 | S = range(256) 110 | K = (map(lambda x:ord(x), Key) * (256 / len(Key) + 1))[:256] 111 | j = 0 112 | for i in range(256): 113 | j = (S[i] + K[i] + j) % 256 114 | S[i], S[j] = S[j], S[i] 115 | i, j = 0, 0 116 | for x in range(len(inData)): 117 | i = (i + 1) % 256 118 | j = (j + S[i]) % 256 119 | S[i], S[j] = S[j], S[i] 120 | Buf += chr(S[(S[j] + S[i]) % 256] ^ ord(inData[x])) 121 | return Buf 122 | 123 | def Long2Int(longdata): 124 | lo = longdata & 0xFFFFFFFF 125 | hi = (longdata >> 32) & 0x7FFFFFFF 126 | return hi, lo 127 | 128 | def KeygenSN(LicenseSerial, MachineID): 129 | mhi, mlo = Long2Int(MachineID) 130 | lhi, llo = Long2Int(LicenseSerial) 131 | hi_Key = (mhi - lhi + 0x55667788) & 0x7FFFFFFF 132 | lo_Key = (mlo + llo + 0x11223344) & 0xFFFFFFFF 133 | Z0, = struct.unpack('v(Ljava/lang/Object;)V 179 | 180 | ``` 181 | 182 | 183 | 184 | # 四、课后小作业 185 | 动态调试获取注册码 186 | [https://wwl.lanzoub.com/iZ0tt0fzsbpa](https://wwl.lanzoub.com/iZ0tt0fzsbpa) 187 | 作业提交地址: 188 | 《安卓逆向这档事》第五节课后小作业贴 189 | [https://www.52pojie.cn/thread-1714883-1-1.html](https://www.52pojie.cn/thread-1714883-1-1.html) 190 | (出处: 吾爱破解论坛) 191 | 192 | # 五、答疑 193 | 关于jeb动态调试没有进程的问题,请看下面顶置的评论,替换个新的adb 194 | 关于永久debug的问题,可以参考zzzznl的方法(具体楼层在224) 195 | 关于MagiskHidePropsConfig设置ro.debuggable,我运气比较好,雷电模拟器中设置成功了几次,操作如下: 196 | 1.cmd中adb shell 197 | 2.su获取root权限 198 | 3.props进入设置,其后是大佬教程中的步骤,注意不要在4中设置,哪怕4中有也在5中新建一下,因为4中设置无法选择设置的时期,而5中可以 199 | 4.重新进入5中设置的ro.debuggable,这时候可以选择设置该参数的时间,我选的延时Delay,Boot Completed之后3秒(随便设的,没测试其他值) 200 | ![图片](_assets_05/d0b83f14677ccee75fdeb7891e1886c95009.webp) 201 | 5.重启n次之后进入模拟器,检查参数 202 | ![图片](_assets_05/ff8d9deea26f077ba163581b7baa78e5681.webp) 203 | 所以我觉得存在一种可能,模块虽然起作用了,但很快又被模拟器重新设回去了,选择较晚期进行设置,存在一点设置成功的可能,大佬可以参考下 204 | 205 | # 六、视频及课件地址 206 | 207 | 208 | [百度云](https://pan.baidu.com/s/1cFWTLn14jeWfpXxlx3syYw?pwd=nqu9) 209 | 210 | [阿里云](https://www.aliyundrive.com/s/TJoKMK6du6x) 211 | 212 | [哔哩哔哩](https://www.bilibili.com/video/BV1wT411N7sV/?spm_id_from=333.788&vd_source=6dde16dc6479f00694baaf73a2225452) 213 | 214 | PS:解压密码都是52pj,阿里云由于不能分享压缩包,所以下载exe文件,双击自解压 215 | 216 | # 七、其他章节 217 | [《安卓逆向这档事》一、模拟器环境搭建](https://www.52pojie.cn/thread-1695141-1-1.html) 218 | [《安卓逆向这档事》二、初识APK文件结构、双开、汉化、基础修改](https://www.52pojie.cn/thread-1695796-1-1.html) 219 | [《安卓逆向这档事》三、初识smail,vip终结者](https://www.52pojie.cn/thread-1701353-1-1.html)   220 | [《安卓逆向这档事》四、恭喜你获得广告&弹窗静默卡](https://www.52pojie.cn/thread-1706691-1-1.html) 221 | [《安卓逆向这档事》五、1000-7=?&动态调试&Log插桩](https://www.52pojie.cn/thread-1714727-1-1.html) 222 | [《安卓逆向这档事》六、校验的N次方-签名校验对抗、PM代{过}{滤}理、IO重定向](https://www.52pojie.cn/thread-1731181-1-1.html) 223 | [《安卓逆向这档事》七、Sorry,会Hook真的可以为所欲为-Xposed快速上手(上)模块编写,常用Api](https://www.52pojie.cn/thread-1740944-1-1.html) 224 | [《安卓逆向这档事》八、Sorry,会Hook真的可以为所欲为-xposed快速上手(下)快速hook](https://www.52pojie.cn/thread-1748081-1-1.html) 225 | [《安卓逆向这档事》九、密码学基础、算法自吐、非标准加密对抗](https://www.52pojie.cn/thread-1762225-1-1.html) 226 | [《安卓逆向这档事》十、不是我说,有了IDA还要什么女朋友?](https://www.52pojie.cn/thread-1787667-1-1.html) 227 | [《安卓逆向这档事》十二、大佬帮我分析一下](https://www.52pojie.cn/thread-1809646-1-1.html) 228 | [《安卓逆向这档事》番外实战篇1-某电影视全家桶](https://www.52pojie.cn/thread-1814917-1-1.html) 229 | [《安卓逆向这档事》十三、是时候学习一下Frida一把梭了(上)](https://www.52pojie.cn/thread-1823118-1-1.html) 230 | [《安卓逆向这档事》十四、是时候学习一下Frida一把梭了(中)](https://www.52pojie.cn/thread-1838539-1-1.html) 231 | # 八、参考文档 232 | 233 | [Android修改ro.debuggable 的四种方法](https://blog.csdn.net/jinmie0193/article/details/111355867) 234 | 235 | [Log简易打印工具,超简单的调用方法](https://www.52pojie.cn/thread-411454-1-1.html) 236 | 237 | [JEB动态调试Smali-真机/模拟器(详细,新手必看)](https://www.52pojie.cn/thread-1598242-1-1.html) 238 | -------------------------------------------------------------------------------- /Article/07第七课、Sorry,会Hook真的可以为所欲为-Xposed快速上手(上)模块编写,Api详解.md: -------------------------------------------------------------------------------- 1 | ![|300](_assets_07/92d1daf78d96dcb10b3351f808a9021c.webp) 2 | # 一、课程目标 3 | 1.了解Xposed原理及发展 4 | 5 | 2.从0到1编写xposed模块 6 | 7 | 3.配置ubuntu的逆向环境 8 | 9 | 4.了解xposed的常用Api 10 | 11 | # 二、工具 12 | 13 | 1.教程Demo(更新) 14 | 15 | 2.jadx-gui 16 | 17 | 3.雷电模拟器 18 | 19 | 4.vmware 20 | 21 | 5.Android Studio 22 | 23 | # 三、课程内容 24 | 25 | ## 1.什么是Xposed? 26 | 27 | Xposed是一款可以在不修改APK的情况下影响程序运行的框架,基于它可以制作出许多功能强大的模块,且在功能不冲突的情况下同时运作。在这个框架下,我们可以编写并加载自己编写的插件APP,实现对目标apk的注入拦截等。 28 | 29 | ## 2.Xposed原理 30 | 31 | 用自己实现的**app_process**替换掉了系统原本提供的**app_process**,加载一个额外的jar包,入口从原来的: **com.android.internal.osZygoteInit.main()被替换成了: de.robv.android.xposed.XposedBridge.main()**, 32 | 创建的Zygote进程就变成Hook的Zygote进程了,从而完成对zygote进程及其创建的Dalvik/ART虚拟机的劫持(zytoge注入) 33 | ![](_assets_07/ad601470ed9b3277ac4f2921374ee046.webp) 34 | 35 | ## 3.Xposed的发展及免root框架 36 | 37 | 38 | | 名称 | 地址 | 支持版本 | 是否免root | 39 | | ------------- | ----------------------------------------------- | -------- | ---------- | 40 | | xposed | https://github.com/rovo89/Xposed | 2.3-8.1 | 否 | 41 | | EDXposed | https://github.com/ElderDrivers/EdXposed | 8.0-10 | 否 | 42 | | LSPosed | https://github.com/LSPosed/LSPosed | 8.1-13 | 否 | 43 | | VirtualXposed | https://github.com/android-hacker/VirtualXposed | 5.0-10.0 | 是 | 44 | | 太极 | https://www.coolapk.com/apk/me.weishu.exp | 5.0-10.0 | 是 | 45 | | 两仪 | https://www.coolapk.com/apk/io.twoyi | 8.1-12 | 是 | 46 | | 天鉴 | https://github.com/Katana-Official/SPatch-Update | 6-10 | 是 | 47 | 48 | 49 | 50 | ## 4.Xposed可以做什么? 51 | 52 | 1.修改app布局:[上帝模式](https://github.com/kaisar945/Xposed-GodMode) 53 | 54 | 2.劫持数据,修改参数值、返回值、主动调用等。例:微信防撤回、步数修改、一键新机 55 | [应用变量](https://github.com/kingsollyu/AppEnv) 56 | ![](_assets_07/7c151d078e0c180a9c51dfd50b26c4d6.webp) 57 | 58 | 3.自动化操作,例:微信抢红包 59 | ![|300](_assets_07/04ea10cee93fed63a897374f30454fbc.webp) 60 | 61 | 学习项目: 62 | ![|300](_assets_07/446f8d3dd904807ec67410eb40c0e185.webp) 63 | 64 | [2022 最好的Xposed模块: GravityBox, Pixelify, XPrivacyLua](https://www.xda-developers.com/best-xposed-modules/) 65 | 66 | [基于Xposed的抖音爬虫,抖音风控后自动一键新机,模拟一个全新的运行环境](https://github.com/Lstaynight/xposed-dy) 67 | 68 | [基于xposed的frida持久化方案](https://github.com/svengong/xcubebase) 69 | 70 | [A Xposed Module for Android Penetration Test, with NanoHttpd.](https://github.com/monkeylord/XServer) 71 | 72 | [GravityBox](https://github.com/GravityBox/GravityBox) 73 | 74 | [Xposed-Modules-Repo](https://github.com/Xposed-Modules-Repo)] 75 | 76 | [一个旨在使QQ变得更好用的开源Xposed模块](https://github.com/ferredoxin/QNotified) 77 | 78 | [杜比大喇叭](https://github.com/nining377/dolby_beta) 79 | 80 | [知乎去广告Xposed模块](https://github.com/shatyuka/Zhiliao) 81 | 82 | [哔哩漫游](https://github.com/yujincheng08/BiliRoaming) 83 | 84 | [曲境](https://github.com/Mocha-L/QuJing) 85 | 86 | [自动化创建Xposed模块及钩子,让Xposed模块编写时只需关注钩子实现](https://github.com/monkeylord/XposedTemplateForAS) 87 | 88 | ## 5.Xpposed环境配置 89 | 90 | ### 前置 91 | ubuntu虚拟机镜像 92 | 内置: 93 | - `Frida`开发环境 94 | - 动态分析及开发工具:android-studio 95 | - 动态分析工具:ddms 96 | - 静态分析工具:jadx1.4.4 97 | - 动静态分析工具:jeb 98 | - 动态分析工具:集成HyperPwn 99 | - 静态分析工具:010 editor 100 | - 抓包工具:Charles 101 | - 抓包工具:WireShark 102 | - 动态分析工具:unidbg 103 | 104 | vm虚拟机:https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html 105 | (或下载我打包好的) 106 | 激活码:ZZ5RR-6AF8H-M8EKQ-TGMNG-X2UV6 107 | 108 | 109 | 第一步,安装虚拟机调整路径,输入激活码 110 | 111 | 第二步,导入镜像,文件->打开->选择解压好的镜像 112 | 113 | 第三步,点击运行,待初始化,输入密码:toor 114 | 115 | 116 | 117 | 118 | 119 | 120 | 1.Android Studio创建新项目 121 | 2.将下载的xposedBridgeApi.jar包拖进libs文件夹 122 | 3.右击jar包,选择add as library 123 | 4.修改xml文件配置 124 | ```xml 125 | 126 | 129 | 130 | 133 | 134 | 137 | ``` 138 | 5.修改build.gradle,将此处修改为compileOnly 默认的是implementation 139 | ``` 140 | implementation 使用该方式依赖的库将会参与编译和打包 141 | compileOnly 只在编译时有效,不会参与打包 142 | ``` 143 | 6.新建-->Folder-->Assets Folder,创建xposed_init(不要后缀名):只有一行代码,就是说明入口类 144 | 7.新建Hook类,实现IXposedHookLoadPackage接口,然后在handleLoadPackage函数内编写Hook逻辑 145 | ```java 146 | import de.robv.android.xposed.IXposedHookLoadPackage; 147 | import de.robv.android.xposed.callbacks.XC_LoadPackage; 148 | 149 | public class Hook implements IXposedHookLoadPackage { 150 | @Override 151 | public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable { 152 | 153 | } 154 | } 155 | ``` 156 | 继承了IXposedHookLoadPackag便拥有了hook的能力 157 | ## 6.Xpoosed常用API 158 | 159 | [An efficient Hook API and Xposed Module solution built in Kotlin](https://github.com/fankes/YukiHookAPI) 160 | 161 | ### 1.Hook普通方法 162 | 修改返回值 163 | ```java 164 | XposedHelpers.findAndHookMethod("com.zj.wuaipojie.Demo", classLoader, "getPublicInt", new XC_MethodHook() { 165 | @Override 166 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 167 | super.beforeHookedMethod(param); 168 | } 169 | @Override 170 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 171 | super.afterHookedMethod(param); 172 | param.setResult(999); 173 | } 174 | }); 175 | 176 | ``` 177 | 修改参数 178 | ```java 179 | XposedHelpers.findAndHookMethod("com.zj.wuaipojie.Demo", classLoader, "setPublicInt", int.class, new XC_MethodHook() { 180 | @Override 181 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 182 | super.beforeHookedMethod(param); 183 | param.args[0] = 999; 184 | } 185 | @Override 186 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 187 | super.afterHookedMethod(param); 188 | } 189 | }); 190 | 191 | ``` 192 | 193 | ### 2.Hook复杂&自定义参数 194 | 195 | ```java 196 | Class a = loadPackageParam.classLoader.loadClass("com.zj.wuaipojie.Demo"); 197 | XposedBridge.hookAllMethods(a, "Inner", new XC_MethodHook() { 198 | @Override 199 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 200 | super.beforeHookedMethod(param); 201 | 202 | } 203 | }); 204 | 205 | ``` 206 | 207 | 208 | ### 3.Hook替换函数 209 | ```java 210 | Class a = classLoader.loadClass("类名") 211 | XposedBridge.hookAllMethods(a,"getId",new XC_MethodReplacement() { 212 | @Override 213 | protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable { 214 | return ""; 215 | } 216 | }); 217 | 218 | ``` 219 | 220 | 221 | ### 4.Hook加固通杀 222 | ```java 223 | XposedHelpers.findAndHookMethod(Application.class, "attach", Context.class, new XC_MethodHook() { 224 | @Override 225 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 226 | Context context = (Context) param.args[0]; 227 | ClassLoader classLoader = context.getClassLoader(); 228 | } 229 | }); 230 | 231 | ``` 232 | 233 | 234 | # 四、课后小作业 235 | 写一个xposed模块去修改上节课smali相关学习里的方法,并修改参数以及返回值 236 | 237 | 238 | # 六、视频及课件地址 239 | 240 | 241 | [百度云](https://pan.baidu.com/s/1cFWTLn14jeWfpXxlx3syYw?pwd=nqu9) 242 | 243 | [阿里云](https://www.aliyundrive.com/s/TJoKMK6du6x) 244 | 245 | [哔哩哔哩](https://www.bilibili.com/video/BV1wT411N7sV/?spm_id_from=333.788&vd_source=6dde16dc6479f00694baaf73a2225452) 246 | 247 | PS:解压密码都是52pj,阿里云由于不能分享压缩包,所以下载exe文件,双击自解压 248 | 249 | # 七、其他章节 250 | 251 | [《安卓逆向这档事》一、模拟器环境搭建](https://www.52pojie.cn/thread-1695141-1-1.html) 252 | [《安卓逆向这档事》二、初识APK文件结构、双开、汉化、基础修改](https://www.52pojie.cn/thread-1695796-1-1.html) 253 | [《安卓逆向这档事》三、初识smail,vip终结者](https://www.52pojie.cn/thread-1701353-1-1.html)   254 | [《安卓逆向这档事》四、恭喜你获得广告&弹窗静默卡](https://www.52pojie.cn/thread-1706691-1-1.html) 255 | [《安卓逆向这档事》五、1000-7=?&动态调试&Log插桩](https://www.52pojie.cn/thread-1714727-1-1.html) 256 | [《安卓逆向这档事》六、校验的N次方-签名校验对抗、PM代{过}{滤}理、IO重定向](https://www.52pojie.cn/thread-1731181-1-1.html) 257 | [《安卓逆向这档事》七、Sorry,会Hook真的可以为所欲为-Xposed快速上手(上)模块编写,常用Api](https://www.52pojie.cn/thread-1740944-1-1.html) 258 | [《安卓逆向这档事》八、Sorry,会Hook真的可以为所欲为-xposed快速上手(下)快速hook](https://www.52pojie.cn/thread-1748081-1-1.html) 259 | [《安卓逆向这档事》九、密码学基础、算法自吐、非标准加密对抗](https://www.52pojie.cn/thread-1762225-1-1.html) 260 | [《安卓逆向这档事》十、不是我说,有了IDA还要什么女朋友?](https://www.52pojie.cn/thread-1787667-1-1.html) 261 | [《安卓逆向这档事》十二、大佬帮我分析一下](https://www.52pojie.cn/thread-1809646-1-1.html) 262 | [《安卓逆向这档事》番外实战篇1-某电影视全家桶](https://www.52pojie.cn/thread-1814917-1-1.html) 263 | [《安卓逆向这档事》十三、是时候学习一下Frida一把梭了(上)](https://www.52pojie.cn/thread-1823118-1-1.html) 264 | [《安卓逆向这档事》十四、是时候学习一下Frida一把梭了(中)](https://www.52pojie.cn/thread-1838539-1-1.html) 265 | # 八、参考文档 266 | 267 | [[原创]Xposed Hook技巧,代理abstract](https://bbs.kanxue.com/thread-260484.htm) 268 | 269 | [[原创]Xposed callMethod 如何传入接口参数](https://bbs.kanxue.com/thread-257100.htm) 270 | 271 | [[原创]源码编译(2)——Xopsed源码编译详解](https://bbs.kanxue.com/thread-269616.htm#msg_header_h2_0) 272 | 273 | 274 | 275 | -------------------------------------------------------------------------------- /Article/08第八课、不好意思,会Hook真的可以为所欲为-xposed快速上手(下)常用Api,免root与快速Hook.md: -------------------------------------------------------------------------------- 1 | ![|500](_assets_08/9502d04fe683e2e0775f0eea93924366.gif) 2 | # 一、课程目标 3 | 1.了解Xposed常用API以及妙用 4 | 5 | 2.借助lspatch实现免root注入 6 | 7 | 3.SimpleHook快速hook 8 | 9 | # 二、工具 10 | 11 | 1.教程Demo(更新) 12 | 13 | 2.MT管理器/NP管理器 14 | 15 | 3.算法助手 16 | 17 | 4.jadx-gui 18 | 19 | 5.simplehook 20 | 21 | 6.Android Studio 22 | 23 | # 三、课程内容 24 | 25 | 虚拟机连接模拟器方法 26 | https://www.cnblogs.com/voyage1969/p/14876449.html 27 | 28 | ## Xposed常用API 29 | --- 30 | 31 | ### 1.Hook变量 32 | 静态变量与实例变量: 33 | - 静态变量(static):类被初始化,同步进行初始化 34 | - 非静态变量:类被实例化(产生一个对象的时候),进行初始化 35 | 36 | 静态变量 37 | ```java 38 | final Class clazz = XposedHelpers.findClass("类名", classLoader); 39 | XposedHelpers.setStaticIntField(clazz, "变量名", 999); 40 | 41 | ``` 42 | 实例变量 43 | ```java 44 | final Class clazz = XposedHelpers.findClass("类名", classLoader); 45 | XposedBridge.hookAllConstructors(clazz, new XC_MethodHook() { 46 | @Override 47 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 48 | super.afterHookedMethod(param); 49 | //param.thisObject获取当前所属的对象 50 | Object ob = param.thisObject; 51 | XposedHelpers.setIntField(ob,"变量名",9999); 52 | } 53 | }); 54 | 55 | ``` 56 | 57 | ### 2.Hook构造函数 58 | 59 | 60 | 无参构造函数 61 | ```java 62 | XposedHelpers.findAndHookConstructor("com.zj.wuaipojie.Demo", classLoader, new XC_MethodHook() { 63 | @Override 64 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 65 | super.beforeHookedMethod(param); 66 | } 67 | @Override 68 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 69 | super.afterHookedMethod(param); 70 | } 71 | }); 72 | ``` 73 | 有参构造函数 74 | ```java 75 | XposedHelpers.findAndHookConstructor("com.zj.wuaipojie.Demo", classLoader, String.class, new XC_MethodHook() { 76 | @Override 77 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 78 | super.beforeHookedMethod(param); 79 | } 80 | @Override 81 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 82 | super.afterHookedMethod(param); 83 | } 84 | }); 85 | 86 | ``` 87 | 88 | ### 3.Hook multiDex方法 89 | ```java 90 | XposedHelpers.findAndHookMethod(Application.class, "attach", Context.class, new XC_MethodHook() { 91 | @Override 92 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 93 | ClassLoader cl= ((Context)param.args[0]).getClassLoader(); 94 | Class hookclass=null; 95 | try { 96 | hookclass=cl.loadClass("类名"); 97 | }catch (Exception e){ 98 | Log.e("zj2595","未找到类",e); 99 | return; 100 | } 101 | XposedHelpers.findAndHookMethod(hookclass, "方法名", new XC_MethodHook() { 102 | @Override 103 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 104 | } 105 | }); 106 | } 107 | }); 108 | 109 | ``` 110 | 111 | ### 4.主动调用 112 | 静态方法: 113 | ```java 114 | Class clazz = XposedHelpers.findClass("类名",lpparam.classLoader); 115 | XposedHelpers.callStaticMethod(clazz,"方法名",参数(非必须)); 116 | ``` 117 | 实例方法: 118 | ```java 119 | Class clazz = XposedHelpers.findClass("类名",lpparam.classLoader); 120 | XposedHelpers.callMethod(clazz.newInstance(),"方法名",参数(非必须)); 121 | 122 | ``` 123 | 124 | ### 5.Hook内部类 125 | 内部类:类里还有一个类class 126 | ```java 127 | XposedHelpers.findAndHookMethod("com.zj.wuaipojie.Demo$InnerClass", lpparam.classLoader, "innerFunc",String.class, new XC_MethodHook() { 128 | @Override 129 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 130 | super.beforeHookedMethod(param); 131 | 132 | } 133 | }); 134 | 135 | ``` 136 | 137 | ### 6.反射大法 138 | ```java 139 | Class clazz = XposedHelpers.findClass("com.zj.wuaipojie.Demo", lpparam.classLoader); 140 | XposedHelpers.findAndHookMethod("com.zj.wuaipojie.Demo$InnerClass", lpparam.classLoader, "innerFunc",String.class, new XC_MethodHook() { 141 | @Override 142 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 143 | super.beforeHookedMethod(param); 144 | //第一步找到类 145 | //找到方法,如果是私有方法就要setAccessible设置访问权限 146 | //invoke主动调用或者set修改值(变量) 147 | Class democlass = Class.forName("com.zj.wuaipojie.Demo",false,lpparam.classLoader); 148 | Method demomethod = democlass.getDeclaredMethod("refl"); 149 | demomethod.setAccessible(true); 150 | demomethod.invoke(clazz.newInstance()); 151 | } 152 | }); 153 | 154 | ``` 155 | 156 | ### 7.遍历所有类下的所有方法 157 | 158 | ```java 159 | XposedHelpers.findAndHookMethod(ClassLoader.class, "loadClass", String.class, new XC_MethodHook() { 160 | @Override 161 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 162 | super.afterHookedMethod(param); 163 | Class clazz = (Class) param.getResult(); 164 | String clazzName = clazz.getName(); 165 | //排除非包名的类 166 | if(clazzName.contains("com.zj.wuaipojie")){ 167 | Method[] mds = clazz.getDeclaredMethods(); 168 | for(int i =0;iSettings->Plugins,在这里可以搜索并安装你想安装的插件,以下是我用的插件 277 | 278 | ![](_assets_08/91014da5df72d045bdc9fcc522e8591c.webp) 279 | ![](_assets_08/dee2255c9aee5991068d78d00574c251.webp) 280 | 281 | # 六、视频及课件地址 282 | 283 | 284 | [百度云](https://pan.baidu.com/s/1cFWTLn14jeWfpXxlx3syYw?pwd=nqu9) 285 | 286 | [阿里云](https://www.aliyundrive.com/s/TJoKMK6du6x) 287 | 288 | [哔哩哔哩](https://www.bilibili.com/video/BV1wT411N7sV/?spm_id_from=333.788&vd_source=6dde16dc6479f00694baaf73a2225452) 289 | 290 | PS:解压密码都是52pj,阿里云由于不能分享压缩包,所以下载exe文件,双击自解压 291 | 292 | # 七、其他章节 293 | [《安卓逆向这档事》一、模拟器环境搭建](https://www.52pojie.cn/thread-1695141-1-1.html) 294 | [《安卓逆向这档事》二、初识APK文件结构、双开、汉化、基础修改](https://www.52pojie.cn/thread-1695796-1-1.html) 295 | [《安卓逆向这档事》三、初识smail,vip终结者](https://www.52pojie.cn/thread-1701353-1-1.html)   296 | [《安卓逆向这档事》四、恭喜你获得广告&弹窗静默卡](https://www.52pojie.cn/thread-1706691-1-1.html) 297 | [《安卓逆向这档事》五、1000-7=?&动态调试&Log插桩](https://www.52pojie.cn/thread-1714727-1-1.html) 298 | [《安卓逆向这档事》六、校验的N次方-签名校验对抗、PM代{过}{滤}理、IO重定向](https://www.52pojie.cn/thread-1731181-1-1.html) 299 | [《安卓逆向这档事》七、Sorry,会Hook真的可以为所欲为-Xposed快速上手(上)模块编写,常用Api](https://www.52pojie.cn/thread-1740944-1-1.html) 300 | [《安卓逆向这档事》八、Sorry,会Hook真的可以为所欲为-xposed快速上手(下)快速hook](https://www.52pojie.cn/thread-1748081-1-1.html) 301 | [《安卓逆向这档事》九、密码学基础、算法自吐、非标准加密对抗](https://www.52pojie.cn/thread-1762225-1-1.html) 302 | [《安卓逆向这档事》十、不是我说,有了IDA还要什么女朋友?](https://www.52pojie.cn/thread-1787667-1-1.html) 303 | [《安卓逆向这档事》十二、大佬帮我分析一下](https://www.52pojie.cn/thread-1809646-1-1.html) 304 | [《安卓逆向这档事》番外实战篇1-某电影视全家桶](https://www.52pojie.cn/thread-1814917-1-1.html) 305 | [《安卓逆向这档事》十三、是时候学习一下Frida一把梭了(上)](https://www.52pojie.cn/thread-1823118-1-1.html) 306 | [《安卓逆向这档事》十四、是时候学习一下Frida一把梭了(中)](https://www.52pojie.cn/thread-1838539-1-1.html) 307 | 308 | 309 | 310 | 311 | -------------------------------------------------------------------------------- /Article/10第十课、不是我说,有了IDA还要什么女朋友?.md: -------------------------------------------------------------------------------- 1 | ![|300](_assets_10/cc9934d4392e49ed2c51e35cf94ab8e2.webp) 2 | # 一、课程目标 3 | 4 | 1.初识ELF文件格式、常见节区 5 | 6 | 2.了解NDK开发,写一个简单的so 7 | 8 | 3.学习IDA Pro工具的使用来分析so文件 9 | 10 | 4.通过学习ARM基础知识,能进行简单的修改 11 | 12 | 5.通过Chatgpt&IDA快速分析二进制文件 13 | 14 | # 二、工具 15 | 16 | 1.教程Demo(更新) 17 | 18 | 2.MT管理器/NP管理器 19 | 20 | 3.IDA Pro 21 | 22 | 4.雷电模拟器 23 | 24 | 5.Android Studio 25 | 26 | 27 | # 三、课程内容 28 | 29 | ## 1. 初识ELF文件格式 30 | 31 | ELF(Executable and Linkable Format)是一种可执行和可链接的文件格式,是linux底下二进制文件,可以理解为windows下的`PE文件`,在Android中可以比作`dll`,方便函数的移植,在常用于保护Android软件,增加逆向难度。 32 | 33 | ELF文件的主要组成部分包括: 34 | - ELF Header:文件头,描述文件的基本信息 35 | - Program Header Table:程序头表,描述进程映像的布局 36 | - Section Header Table:节区头表,描述文件的各个节区 37 | 38 | | 节区名 | 描述 | 39 | | -------- | ------------------------------------------------ | 40 | | .text | 代码段,存放程序的指令 | 41 | | .data | 数据段,存放已初始化的全局变量和静态变量 | 42 | | .rodata | 只读数据段,存放只读数据 | 43 | | .bss | 未初始化数据段,存放未初始化的全局变量和静态变量 | 44 | | .symtab | 符号表,存放符号信息 | 45 | | .strtab | 字符串表,存放字符串数据 | 46 | | .dynsym | 动态符号表,存放动态链接需要的符号信息 | 47 | | .dynamic | 动态链接信息,存放动态链接器需要的信息 | 48 | 49 | ## 2.NDK开发 50 | 51 | NDK(Native Development Kit)是一套用于开发Android应用程序的工具集,它允许您在C/C++中编写性能关键的部分代码,并将这些代码与Java代码进行连接。 52 | 53 | 步骤: 54 | 1.下载NDK和CMake 55 | ![](_assets_10/666c7661bc9de4a54f730bb789af63f74113.webp) 56 | ![](_assets_10/7a7ad0ff5b441646156f6116cbcf8e2a610.webp) 57 | 2.新建一个项目,往下拉,找到"c++"这个选项 58 | 3.查看CMakeLists.txt和编写native-lib.cpp 59 | 下面是cmakelist.txt和native-lib.cpp文件的作用以及简要说明: 60 | 61 | | 文件名 | 作用 | 说明 | 62 | | --- | --- | --- | 63 | | CMakeLists.txt | 构建配置文件 | CMakeLists.txt是用于配置NDK项目的构建系统的文件。它指定了构建所需的源文件、依赖项、编译选项等。在构建过程中,CMake会根据该文件的指示生成对应的构建脚本,用于编译本地代码并生成本地库。 | 64 | | native-lib.cpp | 本地代码实现文件 | native-lib.cpp是包含本地代码实现的文件。它定义了通过Java和本地代码之间进行通信的本地方法。该文件中的函数实现将被编译为本地库,供Java代码调用。 | 65 | 66 | ```java 67 | public class MainActivity extends AppCompatActivity { 68 | 69 | // Used to load the 'ndkdemo' library on application startup. 70 | static { 71 | System.loadLibrary("ndkdemo"); // 加载名为"ndkdemo"的库 72 | } 73 | 74 | private ActivityMainBinding binding; // 声明一个ActivityMainBinding变量 75 | 76 | @Override 77 | protected void onCreate(Bundle savedInstanceState) { 78 | super.onCreate(savedInstanceState); 79 | 80 | binding = ActivityMainBinding.inflate(getLayoutInflater()); // 使用ViewBinding将布局文件解析为一个ActivityMainBinding对象 81 | setContentView(binding.getRoot()); // 将Activity的布局设置为根布局 82 | 83 | // Example of a call to a native method 84 | TextView tv = binding.sampleText; // 获取布局文件中的TextView控件 85 | tv.setText(stringFromJNI()); // 调用本地方法stringFromJNI()并将其返回的字符串设置为TextView的文本内容 86 | } 87 | 88 | /** 89 | * A native method that is implemented by the 'ndkdemo' native library, 90 | * which is packaged with this application. 91 | */ 92 | public native String stringFromJNI(); // 声明一个native方法stringFromJNI() 93 | } 94 | 95 | ``` 96 | 97 | ```java 98 | # For more information about using CMake with Android Studio, read the 99 | # documentation: https://d.android.com/studio/projects/add-native-code.html 100 | 101 | # 设置构建本地库所需的CMake的最小版本要求 102 | cmake_minimum_required(VERSION 3.22.1) 103 | 104 | # 声明和命名项目 105 | project("ndkdemo") 106 | 107 | # 创建并命名一个库,设置其类型为STATIC或SHARED,并指定源代码的相对路径 108 | # 可以定义多个库,CMake会为您构建它们 109 | # Gradle会自动将共享库打包到APK中 110 | add_library( 111 | # 设置库的名称 112 | ndkdemo 113 | 114 | # 设置库类型为共享库 115 | SHARED 116 | 117 | # 提供源文件的相对路径 118 | native-lib.cpp) 119 | 120 | # 搜索指定的预构建库并将路径存储为变量。 121 | # 由于CMake默认在搜索路径中包含系统库,因此您只需指定要添加的公共NDK库的名称。 122 | # CMake会在完成构建之前验证该库是否存在。 123 | find_library( 124 | # 设置路径变量的名称 125 | log-lib 126 | 127 | # 指定要让CMake定位的NDK库的名称 128 | log) 129 | 130 | # 指定CMake应链接到目标库的库。 131 | # 您可以链接多个库,例如在此构建脚本中定义的库、预构建的第三方库或系统库。 132 | target_link_libraries( 133 | # 指定目标库 134 | ndkdemo 135 | 136 | # 将目标库链接到NDK中包含的log库 137 | ${log-lib}) 138 | 139 | ``` 140 | 141 | ```c++ 142 | #include // JNI头文件,提供了JNI函数和数据类型的定义 143 | #include // C++标准库的string类 144 | 145 | // 声明一个jni函数,该函数将会被Java代码调用 146 | // JNIEXPORT表示这个函数是可导出的,并且可以被其他代码使用 147 | // jstring表示这个函数返回的是一个Java字符串对象 148 | // JNICALL是JNI函数的调用约定 149 | // Java_com_example_ndkdemo_MainActivity_stringFromJNI是JNI函数的命名规则,与Java中对应的方法名对应 150 | // Java打头,1包名,2类名,3方法名字;"_"号隔开 151 | extern "C" JNIEXPORT jstring JNICALL 152 | Java_com_example_ndkdemo_MainActivity_stringFromJNI( 153 | JNIEnv* env, // JNIEnv是指向JNI环境的指针,可以用来访问JNI提供的功能 154 | jobject /* this */) { // jobject是指向Java对象的指针,在本例中并没有使用 155 | 156 | std::string hello = "Hello from C++"; // 创建一个C++字符串对象 157 | return env->NewStringUTF(hello.c_str()); // 将C++字符串对象转换为Java字符串对象并返回 158 | } 159 | 160 | 161 | ``` 162 | 163 | ### 1.JNI的前世今生 164 | NDK是开发套件,JNI才是调用的框架。所以与其说是NDK开发,不如说是JNI的开发。不过NDK是Android提供的开发套件。JNI可不是,JNI全称Java Native Interface,即Java本地接口,JNI是Java调用Native 语言的一种特性。通过JNI可以使得Java与C/C++机型交互。即可以在Java代码中调用C/C++等语言的代码或者在C/C++代码中调用Java代码。 165 | ### 2.JNI的两种注册方式 166 | #### jni静态注册方式 167 | - 优点: 理解和使用方式简单, 属于傻瓜式操作, 使用相关工具按流程操作就行, 出错率低 168 | - 缺点: 当需要更改类名,包名或者方法时, 需要按照之前方法重新生成头文件, 灵活性不高 169 | #### jni动态注册方式 170 | ```c++ 171 | #include 172 | #include 173 | 174 | extern "C" { 175 | 176 | JNIEXPORT jstring JNICALL Java_com_example_ndkdemo_MainActivity_nativeGetStringFromJNI(JNIEnv* env, jobject obj) { 177 | std::string hello = "Hello wuaipojie"; 178 | return env->NewStringUTF(hello.c_str()); 179 | } 180 | 181 | // 定义本地方法注册函数 182 | JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) { 183 | JNIEnv* env; 184 | if (vm->GetEnv(reinterpret_cast(&env), JNI_VERSION_1_6) != JNI_OK) { 185 | return -1; 186 | } 187 | 188 | // 定义要注册的本地方法 189 | JNINativeMethod methods[] = { 190 | {"nativeGetStringFromJNI", "()Ljava/lang/String;", reinterpret_cast(Java_com_example_ndkdemo_MainActivity_nativeGetStringFromJNI)} 191 | }; 192 | 193 | // 获取类引用 194 | jclass clazz = env->FindClass("com/example/ndkdemo/MainActivity"); 195 | if (clazz == nullptr) { 196 | return -1; 197 | } 198 | 199 | // 注册本地方法 200 | if (env->RegisterNatives(clazz, methods, sizeof(methods) / sizeof(methods[0])) < 0) { 201 | return -1; 202 | } 203 | 204 | return JNI_VERSION_1_6; 205 | } 206 | 207 | } // extern "C" 208 | 209 | 210 | ``` 211 | 212 | #### 数据类型 213 | 下面是一些常见的C++数据类型和它们在Java中的对应关系,以及它们在JNI动态注册中的数据类型签名(signature): 214 | 215 | 216 | | C++ 数据类型 | Java 数据类型 | JNI 数据类型签名 | 217 | | ------------ | ---------------- | ---------------- | 218 | | jint | int | "I" | 219 | | jboolean | boolean | "Z" | 220 | | jbyte | byte | "B" | 221 | | jchar | char | "C" | 222 | | jshort | short | "S" | 223 | | jlong | long | "J" | 224 | | jfloat | float | "F" | 225 | | jdouble | double | "D" | 226 | | jobject | Object | "Ljava/lang/Object;" | 227 | | jstring | String | "Ljava/lang/String;" | 228 | | jarray | Array | "[elementType" | 229 | | jobjectArray | Object[] | "[Ljava/lang/Object;" | 230 | | jbooleanArray| boolean[] | "[Z" | 231 | | jbyteArray | byte[] | "[B" | 232 | | jcharArray | char[] | "[C" | 233 | | jshortArray | short[] | "[S" | 234 | | jintArray | int[] | "[I" | 235 | | jlongArray | long[] | "[J" | 236 | | jfloatArray | float[] | "[F" | 237 | | jdoubleArray | double[] | "[D" | 238 | 239 | 240 | 在JNI动态注册中,需要使用正确的数据类型签名来声明本地方法。例如,如果你要注册一个返回`int`类型的本地方法,其数据类型签名应为`I`。 241 | 242 | ## 3.IDA Pro使用技巧与Patch 243 | 244 | 简介: 245 | IDA Pro(Interactive Disassembler Professional)是一款功能强大的交互式反汇编和调试工具,广泛应用于软件逆向工程、漏洞分析和二进制代码分析。它支持多种处理器架构和可执行文件格式,包括但不限于x86、ARM、MIPS、PowerPC等。通过使用IDA Pro,可以对程序进行静态分析、动态调试和代码修改等操作。 246 | 247 | 快捷键: 248 | 249 | | 快捷键 | 功能 | 250 | | ----------- | ---------------------------- | 251 | | Esc | 回到上一个位置 | 252 | | Enter | 跳转到当前光标处的地址 | 253 | | - | 折叠代码 | 254 | | + | 展开代码 | 255 | | * | 创建一个结构 | 256 | | Alt + A | 手动定义一个数组 | 257 | | Alt + F | 寻找直接引用的函数 | 258 | | Alt + G | 跳转到特定的地址 | 259 | | Alt + T | 显示调用树 | 260 | | Alt + X | 重命名 | 261 | | Ctrl + G | 快速跳转到指定地址 | 262 | | Ctrl + J | 显示引用列表 | 263 | | Ctrl + K | 显示 XREF 到选中的函数/数据 | 264 | | Ctrl + N | 创建一个函数 | 265 | | Ctrl + Q | 快速重命名 | 266 | | Ctrl + X | 显示从选中的函数/数据的 XREF | 267 | | Ctrl + E | 显示结构类型 | 268 | | Ctrl + R | 手动定义一个数据结构 | 269 | | Ctrl + W | 打开函数列表 | 270 | | Ctrl + D | 以十进制显示当前值 | 271 | | Ctrl + B | 以二进制显示当前值 | 272 | | Ctrl + H | 以十六进制显示当前值 | 273 | | Space | 在图形/文本视图中切换 | 274 | | shift + f12 | 打开字符串窗口 | 275 | | F5 | 转伪C代码 | 276 | 277 | ### Patch方式 278 | 1.keypatch插件快速修补 279 | 快捷键:Ctrl+Alt+k 280 | 录完教程发现Patching这个插件更好用些,下节课再做演示 281 | Patching - [https://github.com/gaasedelen/patching](https://github.com/gaasedelen/patching) 282 | 2.ARM TO Hex 283 | [ARM to HEX](https://armconverter.com/) 284 | 285 | 286 | ## 4.ARM基础知识 287 | 288 | 289 | ### 常见寻址方式 290 | | 寻址方式 | 描述 | 291 | |---------------------|------------------------------------------------------------| 292 | | 立即数寻址 | 直接使用立即数值作为操作数,例如:`MOV R0, #5` | 293 | | 寄存器直接寻址 | 使用寄存器中的值作为操作数,例如:`MOV R0, R1` | 294 | | 寄存器间接寻址 | 使用寄存器中的值作为内存地址,访问该地址中的数据,例如:`LDR R0, [R1]` | 295 | | 寄存器相对寻址 | 使用寄存器中的值加上一个立即偏移量作为内存地址,例如:`LDR R0, [R1, #4]` | 296 | | 寄存器变址寻址 | 使用两个寄存器中的值相加作为内存地址,例如:`LDR R0, [R1, R2]` | 297 | | 带有变址寄存器的寄存器相对寻址 | 使用寄存器中的值加上另一个寄存器的值乘以一个比例因子作为内存地址,例如:`LDR R0, [R1, R2, LSL #2]` | 298 | | 堆栈寻址 | 使用堆栈指针寄存器(如SP)进行操作,例如:`PUSH {R0, R1}` 或 `POP {R0, R1}` | 299 | ### 压栈和出栈指令 300 | | 指令类型 | 指令示例 | 描述 | 301 | |-------|---------------------|-------------------------------------| 302 | | 压栈 | `PUSH {R0, R1}` | 将寄存器R0和R1的内容压入堆栈中 | 303 | | 压栈 | `PUSH {R0-R5}` | 将寄存器R0到R5的内容压入堆栈中 | 304 | | 压栈 | `STMDB SP!, {R0-R5}` | 将寄存器R0到R5的内容压入堆栈中(与PUSH等效) | 305 | | 出栈 | `POP {R0, R1}` | 从堆栈中弹出数据,恢复到寄存器R0和R1中 | 306 | | 出栈 | `POP {R0-R5}` | 从堆栈中弹出数据,恢复到寄存器R0到R5中 | 307 | 308 | ### 跳转指令 309 | 310 | | 指令类型 | 指令示例 | 描述 | 311 | |-------|--------------|------------------------------------------------------------| 312 | | 无条件跳转 | `B label` | 无条件跳转到标签`label`指向的位置 | 313 | | 子程序调用 | `BL label` | 调用子程序,将当前指令的下一条指令地址存入链接寄存器(LR),然后跳转到标签`label`指向的位置 | 314 | | 子程序返回 | `BX LR` | 返回子程序调用前的位置,跳转到链接寄存器(LR)中存储的地址 | 315 | | 寄存器跳转 | `BX Rn` | 跳转到寄存器Rn中存储的地址 | 316 | 317 | 318 | 319 | ### 算术运算指令 320 | 汇编中也可以进行算术运算, 比如加减乘除,常用的运算指令用法如表 所示: 321 | 322 | | 指令 | 计算公式 | 备注 | 323 | |----------------|-----------------|-------------------| 324 | | ADD Rd, Rn, Rm | Rd = Rn + Rm | 加法运算,指令为 ADD | 325 | | ADD Rd, Rn, #immed | Rd = Rn + #immed | 加法运算,指令为 ADD | 326 | | ADC Rd, Rn, Rm | Rd = Rn + Rm + 进位 | 带进位的加法运算,指令为 ADC | 327 | | ADC Rd, Rn, #immed | Rd = Rn + #immed + 进位 | 带进位的加法运算,指令为 ADC | 328 | | SUB Rd, Rn, Rm | Rd = Rn - Rm | 减法 | 329 | | SUB Rd, #immed | Rd = Rd - #immed | 减法 | 330 | | SUB Rd, Rn, #immed | Rd = Rn - #immed | 减法 | 331 | | SBC Rd, Rn, #immed | Rd = Rn - #immed - 借位 | 带借位的减法 | 332 | | SBC Rd, Rn ,Rm | Rd = Rn - Rm - 借位 | 带借位的减法 | 333 | | MUL Rd, Rn, Rm | Rd = Rn * Rm | 乘法 (32 位) | 334 | | UDIV Rd, Rn, Rm | Rd = Rn / Rm | 无符号除法 | 335 | | SDIV Rd, Rn, Rm | Rd = Rn / Rm | 有符号除法 | 336 | 337 | 338 | ### 逻辑运算 339 | 汇编语言的时候也可以使用逻辑运算指令,常用的运算指令用法如表 所示: 340 | ![](_assets_10/35d0832fb2523805c2a2165ec5458caa.webp) 341 | 342 | ### 偷懒小插件 343 | [WPeChatGPT](https://github.com/WPeace-HcH/WPeChatGPT) 344 | 345 | ![](_assets_10/01f4bf013198aea885d9e513ad5e5eec4798.webp) 346 | api报错问题,可以参考仓库里的解决方法: 347 | ``` 348 | pip uninstall urllib3 349 | pip install urllib3==1.25.11 350 | ``` 351 | 如果 urllib3 版本没错或重装 1.25 版本还是存在 API 访问问题的话,那么请下载最新版本,对插件指定代理: 352 | - 将下面三行代码取消注释,然后把代理地址及端口信息填入 _**proxies**_ 变量即可: 353 | ```python 354 | print("WPeChatGPT has appointed the proxy.") 355 | proxies = {'http': "http://127.0.0.1:7890", 'https': "http://127.0.0.1:7890"} 356 | openai.proxy = proxies 357 | ``` 358 | # 四、 课后小作业 359 | 1.修改教程demo第五关里的native校验 360 | 361 | # 五、答疑 362 | 363 | 待更新 364 | 365 | Obsidian主题: 366 | [Blue-topaz-example](https://github.com/PKM-er/Blue-topaz-example) 367 | 368 | 推荐书籍: 369 | 王爽老师的《汇编语言(第三版)》 370 | 《IDA Pro权威指南(第二版)》 371 | 372 | 373 | # 六、视频及课件地址 374 | 375 | 376 | [百度云](https://pan.baidu.com/s/1cFWTLn14jeWfpXxlx3syYw?pwd=nqu9) 377 | 378 | [阿里云](https://www.aliyundrive.com/s/TJoKMK6du6x) 379 | 380 | [哔哩哔哩](https://www.bilibili.com/video/BV1wT411N7sV/?spm_id_from=333.788&vd_source=6dde16dc6479f00694baaf73a2225452) 381 | 382 | PS:解压密码都是52pj,阿里云由于不能分享压缩包,所以下载exe文件,双击自解压 383 | 384 | # 七、其他章节 385 | 386 | [《安卓逆向这档事》一、模拟器环境搭建](https://www.52pojie.cn/thread-1695141-1-1.html) 387 | [《安卓逆向这档事》二、初识APK文件结构、双开、汉化、基础修改](https://www.52pojie.cn/thread-1695796-1-1.html) 388 | [《安卓逆向这档事》三、初识smail,vip终结者](https://www.52pojie.cn/thread-1701353-1-1.html)   389 | [《安卓逆向这档事》四、恭喜你获得广告&弹窗静默卡](https://www.52pojie.cn/thread-1706691-1-1.html) 390 | [《安卓逆向这档事》五、1000-7=?&动态调试&Log插桩](https://www.52pojie.cn/thread-1714727-1-1.html) 391 | [《安卓逆向这档事》六、校验的N次方-签名校验对抗、PM代{过}{滤}理、IO重定向](https://www.52pojie.cn/thread-1731181-1-1.html) 392 | [《安卓逆向这档事》七、Sorry,会Hook真的可以为所欲为-Xposed快速上手(上)模块编写,常用Api](https://www.52pojie.cn/thread-1740944-1-1.html) 393 | [《安卓逆向这档事》八、Sorry,会Hook真的可以为所欲为-xposed快速上手(下)快速hook](https://www.52pojie.cn/thread-1748081-1-1.html) 394 | [《安卓逆向这档事》九、密码学基础、算法自吐、非标准加密对抗](https://www.52pojie.cn/thread-1762225-1-1.html) 395 | [《安卓逆向这档事》十、不是我说,有了IDA还要什么女朋友?](https://www.52pojie.cn/thread-1787667-1-1.html) 396 | [《安卓逆向这档事》十二、大佬帮我分析一下](https://www.52pojie.cn/thread-1809646-1-1.html) 397 | [《安卓逆向这档事》番外实战篇1-某电影视全家桶](https://www.52pojie.cn/thread-1814917-1-1.html) 398 | [《安卓逆向这档事》十三、是时候学习一下Frida一把梭了(上)](https://www.52pojie.cn/thread-1823118-1-1.html) 399 | [《安卓逆向这档事》十四、是时候学习一下Frida一把梭了(中)](https://www.52pojie.cn/thread-1838539-1-1.html) 400 | # 八、参考文档 401 | 402 | 403 | [官方NDK入门案例](https://developer.android.com/ndk/guides?hl=zh-cn) 404 | 405 | [ARM汇编入门指南](https://zhuanlan.zhihu.com/p/388683540) 406 | 407 | [ARM汇编基础详解](https://blog.csdn.net/weixin_45309916/article/details/107837561) 408 | 409 | [Android so(ELF)文件解析](https://www.52pojie.cn/forum.php?mod=viewthread&tid=1282554) 410 | 411 | [小米学安卓逆向一 - NDK开发(1)](https://bbs.kanxue.com/thread-267367.htm) 412 | 413 | [WPeChatGPT](https://github.com/WPeace-HcH/WPeChatGPT) 414 | 415 | [工具使用-IDA从入门到理解](https://bbs.kanxue.com/thread-266021.htm) 416 | 417 | [什么是NDK开发(一)](https://blog.csdn.net/weixin_34583170/article/details/94864797) 418 | 419 | -------------------------------------------------------------------------------- /Article/13第十三课、是时候学习一下Frida一把梭了(上).md: -------------------------------------------------------------------------------- 1 | ![|500](_assets_13/13975df155153ae785b86e901db44d921765.webp) 2 | # 一、课程目标 3 | 1.配置frida环境,了解frida原理 4 | 5 | 2.从0到1编写frida脚本 6 | 7 | 3.了解frida的常用Api 8 | 9 | 10 | # 二、工具 11 | 12 | 1.教程Demo(更新) 13 | 14 | 2.jadx-gui 15 | 16 | 3.雷电模拟器 17 | 18 | 4.VS Code 19 | 20 | # 三、课程内容 21 | 22 | ## 1.什么是Frida? 23 | 24 | Frida 是一款开源的动态插桩工具,可以插入一些代码到原生App的内存空间去动态地监视和修改其行为,支持Windows、Mac、Linux、Android或者iOS,从安卓层面来讲,可以实现`Java`层和`Native`层`Hook`操作。 25 | [项目地址](https://github.com/frida/frida) 26 | [官网及使用文档](https://frida.re/) 27 | ## 2.Frida原理及重要组件 28 | 29 | frida注入的原理就是找到目标进程,使用ptrace跟踪目标进程获取mmap,dlpoen,dlsym等函数库的偏移获取mmap在目标进程申请一段内存空间将在目标进程中找到存放frida-agent-32/64.so的空间启动执行各种操作由agent去实现 30 | 31 | |组件名称|功能描述| 32 | |:---|:---| 33 | |frida-gum|提供了inline-hook的核心实现,还包含了代码跟踪模块Stalker,用于内存访问监控的MemoryAccessMonitor,以及符号查找、栈回溯实现、内存扫描、动态代码生成和重定位等功能| 34 | |frida-core|fridahook的核心,具有进程注入、进程间通信、会话管理、脚本生命周期管理等功能,屏蔽部分底层的实现细节并给最终用户提供开箱即用的操作接口。包含了frida-server、frida-gadget、frida-agent、frida-helper、frida-inject等关键模块和组件,以及之间的互相通信底座| 35 | |frida-gadget|本身是一个动态库,可以通过重打包修改动态库的依赖或者修改smali代码去实现向三方应用注入gadget,从而实现Frida的持久化或免root| 36 | |frida-server|本质上是一个二进制文件,类似于前面学习到的android_server,需要在目标设备上运行并转发端口,在Frida hook中起到关键作用| 37 | ## 3.Frida与Xposed的对比 38 | 39 | | 工具 | 优点 | 缺点 | 40 | | :--- | :--- | :--- | 41 | | Xposed | 直接编写Java代码,Java层hook方便,可打包模块持久化hook | 环境配置繁琐,兼容性较差,难以Hook底层代码。 | 42 | | Frida | 配置简单,免重启hook。支持Java层和Native层的hook操作 | 持久化hook相对麻烦 | 43 | 44 | ## 4.Frida环境配置 45 | 46 | ### 1.安装Python与VS Code 47 | [下载python](https://www.python.org/downloads/windows/) 48 | 49 | ![](_assets_13/7db57bb7af605621210756bc21aa9b674367.webp) 50 | 51 | [下载VS Code](https://code.visualstudio.com/) 52 | 53 | 汉化:在插件搜索Chinese,选择第一个插件安装重启即可 54 | ### 2.虚拟环境的env的安装 55 | 1. 安装环境 56 | ``` 57 | pip install virtualenvwrapper-win -i https://pypi.tuna.tsinghua.edu.cn/simple 58 | ``` 59 | 1. 设置WORKON_HOME环境变量 60 | ``` 61 | mkvirtualenv 新建环境 62 | rmvirtualenv 删除环境 63 | ``` 64 | ### 3.Frida安装以及多版本处理 65 | ``` 66 | pip install frida-tools -i https://pypi.tuna.tsinghua.edu.cn/simple 67 | ``` 68 | 配置代码提示 69 | ### 4.push Frida-server 70 | [点击下载](https://github.com/frida/frida) 71 | 72 | PS:版本一定要对应!!! 73 | 74 | ![图片](_assets_13/24a6bd098ba2f33600cd53a0aefef3505230.webp) 75 | ## 5.Frida基础知识 76 | 77 | ### 1.基础指令 78 | 1.frida-ps -U 查看当前手机运行的进程 79 | 2.frida-ps --help 查看help指令 80 | ``` 81 | frida-ps --help 82 | 使用方式: frida-ps [选项] 83 | 84 | 选项: 85 | -h, --help 显示帮助信息并退出 86 | -D ID, --device ID 连接到具有给定ID的设备 87 | -U, --usb 连接到USB设备 88 | -R, --remote 连接到远程frida-server 89 | -H HOST, --host HOST 连接到HOST上的远程frida-server 90 | --certificate CERTIFICATE 91 | 与HOST进行TLS通信,期望的CERTIFICATE 92 | --origin ORIGIN 连接到设置了"Origin"头为ORIGIN的远程服务器 93 | --token TOKEN 使用TOKEN验证HOST 94 | --keepalive-interval INTERVAL 95 | 设置心跳包间隔(秒),或设置为0以禁用(默认为-1,根据传输方式自动选择) 96 | --p2p 与目标建立点对点连接 97 | --stun-server ADDRESS 98 | 设置与--p2p一起使用的STUN服务器地址 99 | --relay address,username,password,turn-{udp,tcp,tls} 100 | 添加与--p2p一起使用的中继 101 | -O FILE, --options-file FILE 102 | 包含额外命令行选项的文本文件 103 | --version 显示程序版本号并退出 104 | -a, --applications 只列出应用程序 105 | -i, --installed 包括所有已安装的应用程序 106 | -j, --json 以JSON格式输出结果 107 | ``` 108 | 109 | ### 2.操作模式: 110 | | 操作模式 | 描述 | 优点 | 主要用途 | 111 | |---|---|---|---| 112 | | CLI(命令行)模式 | 通过命令行直接将JavaScript脚本注入进程中,对进程进行操作 | 便于直接注入和操作 | 在较小规模的操作或者需求比较简单的场景中使用 | 113 | | RPC模式 | 使用Python进行JavaScript脚本的注入工作,实际对进程进行操作的还是JavaScript脚本,可以通过RPC传输给Python脚本来进行复杂数据的处理 | 在对复杂数据的处理上可以通过RPC传输给Python脚本来进行,有利于减少被注入进程的性能损耗 | 在大规模调用中更加普遍,特别是对于复杂数据处理的需求 | 114 | 115 | ### 3.注入模式与启动命令: 116 | 117 | | 注入模式 | 描述 | 命令或参数 | 优点 | 主要用途 | 118 | |---|---|---|---|---| 119 | | Spawn模式 | 将启动App的权利交由Frida来控制,即使目标App已经启动,在使用Frida注入程序时还是会重新启动App | 在CLI模式中,Frida通过加上 -f 参数指定包名以spawn模式操作App | 适合于需要在App启动时即进行注入的场景,可以在App启动时即捕获其行为 | 当需要监控App从启动开始的所有行为时使用 | 120 | | Attach模式 | 在目标App已经启动的情况下,Frida通过ptrace注入程序从而执行Hook的操作 | 在CLI模式中,如果不添加 -f 参数,则默认会通过attach模式注入App | 适合于已经运行的App,不会重新启动App,对用户体验影响较小 | 在App已经启动,或者我们只关心特定时刻或特定功能的行为时使用 | 121 | Spawn模式 122 | ``` 123 | frida -U -f 进程名 -l hook.js 124 | ``` 125 | 126 | attach模式 : 127 | ``` 128 | frida -U 进程名 -l hook.js 129 | ``` 130 | 131 | frida_server自定义端口 132 | ``` 133 | frida server 默认端口:27042 134 | 135 | taimen:/ $ su 136 | taimen:/ # cd data/local/tmp/ 137 | taimen:/data/local/tmp # ./fs1280 -l 0.0.0.0:6666 138 | 139 | ``` 140 | `logcat |grep "D.zj2595"`日志捕获 141 | `adb connect 127.0.0.1:62001`模拟器端口转发 142 | ### 4.基础语法 143 | 144 | | API名称 | 描述 | 145 | |---|---| 146 | | `Java.use(className)` | 获取指定的Java类并使其在JavaScript代码中可用。| 147 | | `Java.perform(callback)` | 确保回调函数在Java的主线程上执行。 | 148 | | `Java.choose(className, callbacks)` | 枚举指定类的所有实例。 | 149 | | `Java.cast(obj, cls)` | 将一个Java对象转换成另一个Java类的实例。 | 150 | | `Java.enumerateLoadedClasses(callbacks)` | 枚举进程中已经加载的所有Java类。 | 151 | | `Java.enumerateClassLoaders(callbacks)` | 枚举进程中存在的所有Java类加载器。 | 152 | | `Java.enumerateMethods(targetClassMethod)` | 枚举指定类的所有方法。 | 153 | 154 | 155 | ### 5.日志输出语法区别 156 | 157 | | 日志方法 | 描述 | 区别 | 158 | |---|---|---| 159 | | `console.log()` | 使用JavaScript直接进行日志打印 | 多用于在CLI模式中,`console.log()`直接输出到命令行界面,使用户可以实时查看。在RPC模式中,`console.log()`同样输出在命令行,但可能被Python脚本的输出内容掩盖。 | 160 | | `send()` | Frida的专有方法,用于发送数据或日志到外部Python脚本 | 多用于RPC模式中,它允许JavaScript脚本发送数据到Python脚本,Python脚本可以进一步处理或记录这些数据。 | 161 | 162 | ### 6.Hook框架模板 163 | 164 | ```js 165 | function main(){ 166 | Java.perform(function(){ 167 | hookTest1(); 168 | }); 169 | } 170 | setImmediate(main); 171 | ``` 172 | 173 | ## 6.Frida常用API 174 | 175 | 176 | ### 1.Hook普通方法、打印参数和修改返回值 177 | 178 | ```js 179 | //定义一个名为hookTest1的函数 180 | function hookTest1(){ 181 | //获取一个名为"类名"的Java类,并将其实例赋值给JavaScript变量utils 182 | var utils = Java.use("类名"); 183 | //修改"类名"的"method"方法的实现。这个新的实现会接收两个参数(a和b) 184 | utils.method.implementation = function(a, b){ 185 | //将参数a和b的值改为123和456。 186 | a = 123; 187 | b = 456; 188 | //调用修改过的"method"方法,并将返回值存储在`retval`变量中 189 | var retval = this.method(a, b); 190 | //在控制台上打印参数a,b的值以及"method"方法的返回值 191 | console.log(a, b, retval); 192 | //返回"method"方法的返回值 193 | return retval; 194 | } 195 | } 196 | 197 | ``` 198 | 199 | 200 | ### 2.Hook重载参数 201 | 202 | ```js 203 | // .overload() 204 | // .overload('自定义参数') 205 | // .overload('int') 206 | function hookTest2(){ 207 | var utils = Java.use("com.zj.wuaipojie.Demo"); 208 | //overload定义重载函数,根据函数的参数类型填 209 | utils.Inner.overload('com.zj.wuaipojie.Demo$Animal','java.lang.String').implementation = function(a,b){ 210 | b = "aaaaaaaaaa"; 211 | this.Inner(a,b); 212 | console.log(b); 213 | } 214 | } 215 | 216 | 217 | 218 | ``` 219 | 220 | 221 | ### 3.Hook构造函数 222 | ```js 223 | function hookTest3(){ 224 | var utils = Java.use("com.zj.wuaipojie.Demo"); 225 | //修改类的构造函数的实现,$init表示构造函数 226 | utils.$init.overload('java.lang.String').implementation = function(str){ 227 | console.log(str); 228 | str = "52"; 229 | this.$init(str); 230 | } 231 | } 232 | 233 | 234 | ``` 235 | 236 | 237 | ### 4.Hook字段 238 | ```js 239 | function hookTest5(){ 240 | Java.perform(function(){ 241 | //静态字段的修改 242 | var utils = Java.use("com.zj.wuaipojie.Demo"); 243 | //修改类的静态字段"flag"的值 244 | utils.staticField.value = "我是被修改的静态变量"; 245 | console.log(utils.staticField.value); 246 | //非静态字段的修改 247 | //使用`Java.choose()`枚举类的所有实例 248 | Java.choose("com.zj.wuaipojie.Demo", { 249 | onMatch: function(obj){ 250 | //修改实例的非静态字段"_privateInt"的值为"123456",并修改非静态字段"privateInt"的值为9999。 251 | obj._privateInt.value = "123456"; //字段名与函数名相同 前面加个下划线 252 | obj.privateInt.value = 9999; 253 | }, 254 | onComplete: function(){ 255 | 256 | } 257 | }); 258 | }); 259 | 260 | } 261 | ``` 262 | 263 | ### 5.Hook内部类 264 | ```js 265 | function hookTest6(){ 266 | Java.perform(function(){ 267 | //内部类 268 | var innerClass = Java.use("com.zj.wuaipojie.Demo$innerClass"); 269 | console.log(innerClass); 270 | innerClass.$init.implementation = function(){ 271 | console.log("eeeeeeee"); 272 | } 273 | 274 | }); 275 | } 276 | 277 | ``` 278 | 279 | ### 6.枚举所有的类与类的所有方法 280 | ```js 281 | function hookTest7(){ 282 | Java.perform(function(){ 283 | //枚举所有的类与类的所有方法,异步枚举 284 | Java.enumerateLoadedClasses({ 285 | onMatch: function(name,handle){ 286 | //过滤类名 287 | if(name.indexOf("com.zj.wuaipojie.Demo") !=-1){ 288 | console.log(name); 289 | var clazz =Java.use(name); 290 | console.log(clazz); 291 | var methods = clazz.class.getDeclaredMethods(); 292 | console.log(methods); 293 | } 294 | }, 295 | onComplete: function(){} 296 | }) 297 | }) 298 | } 299 | 300 | ``` 301 | 302 | ### 7.枚举所有方法 303 | ```js 304 | function hookTest8(){ 305 | Java.perform(function(){ 306 | var Demo = Java.use("com.zj.wuaipojie.Demo"); 307 | //getDeclaredMethods枚举所有方法 308 | var methods =Demo.class.getDeclaredMethods(); 309 | for(var j=0; j < methods.length; j++){ 310 | var methodName = methods[j].getName(); 311 | console.log(methodName); 312 | for(var k=0; k getPublicInt(实例的hashcode+方法名) 141 | 如果是带参数的方法,则需要进入编辑器环境 142 | android heap evaluate 143 | console.log(clazz.a("吾爱破解")); 144 | 按住esc+enter触发 145 | ``` 146 | 3. android hooking list classes -列出内存中所有的类(结果比静态分析的更准确) 147 | ``` 148 | android hooking list classes 149 | 150 | tw.idv.palatis.xappdebug.MainApplication 151 | tw.idv.palatis.xappdebug.xposed.HookMain 152 | tw.idv.palatis.xappdebug.xposed.HookMain$a 153 | tw.idv.palatis.xappdebug.xposed.HookMain$b 154 | tw.idv.palatis.xappdebug.xposed.HookMain$c 155 | tw.idv.palatis.xappdebug.xposed.HookMain$d 156 | tw.idv.palatis.xappdebug.xposed.HookSelf 157 | u 158 | v 159 | void 160 | w 161 | xposed.dummy.XResourcesSuperClass 162 | xposed.dummy.XTypedArraySuperClass 163 | 164 | Found 10798 classes 165 | ``` 166 | 4. android hooking search classes 关键类名 -在内存中所有已加载的类中搜索包含特定关键词的类 167 | ``` 168 | android hooking search classes wuaipojie 169 | Note that Java classes are only loaded when they are used, so if the expected class has not been found, it might not have been loaded yet. 170 | com.zj.wuaipojie.Demo 171 | com.zj.wuaipojie.Demo$Animal 172 | com.zj.wuaipojie.Demo$Companion 173 | com.zj.wuaipojie.Demo$InnerClass 174 | com.zj.wuaipojie.Demo$test$1 175 | com.zj.wuaipojie.MainApplication 176 | com.zj.wuaipojie.databinding.ActivityMainBinding 177 | ... 178 | 179 | Found 38 classes 180 | ``` 181 | 182 | 5. android hooking search methods 关键方法名 -在内存中所有已加载的类的方法中搜索包含特定关键词的方法(一般不建议使用,特别耗时,还可能崩溃) 183 | 6. android hooking list class_methods 类名 -内存漫游类中的所有方法 184 | ``` 185 | android hooking list class_methods com.zj.wuaipojie.ui.ChallengeSixth 186 | private static final void com.zj.wuaipojie.ui.ChallengeSixth.onCreate$lambda-0(com.zj.wuaipojie.ui.ChallengeSixth,android.view.View) 187 | private static final void com.zj.wuaipojie.ui.ChallengeSixth.onCreate$lambda-1(com.zj.wuaipojie.ui.ChallengeSixth,android.view.View) 188 | private static final void com.zj.wuaipojie.ui.ChallengeSixth.onCreate$lambda-2(com.zj.wuaipojie.ui.ChallengeSixth,android.view.View) 189 | private static final void com.zj.wuaipojie.ui.ChallengeSixth.onCreate$lambda-3(com.zj.wuaipojie.ui.ChallengeSixth,android.view.View) 190 | protected void com.zj.wuaipojie.ui.ChallengeSixth.onCreate(android.os.Bundle) 191 | public final java.lang.String com.zj.wuaipojie.ui.ChallengeSixth.hexToString(java.lang.String) 192 | public final java.lang.String com.zj.wuaipojie.ui.ChallengeSixth.unicodeToString(java.lang.String) 193 | public final void com.zj.wuaipojie.ui.ChallengeSixth.toastPrint(java.lang.String) 194 | public static void com.zj.wuaipojie.ui.ChallengeSixth.$r8$lambda$1lrkrgiCEFWXZDHzLRibYURG1h8(com.zj.wuaipojie.ui.ChallengeSixth,android.view.View) 195 | public static void com.zj.wuaipojie.ui.ChallengeSixth.$r8$lambda$IUqwMqbTKaOGiTaeOmvy_GjNBso(com.zj.wuaipojie.ui.ChallengeSixth,android.view.View) 196 | public static void com.zj.wuaipojie.ui.ChallengeSixth.$r8$lambda$Kc_cRYZjjhjsTl6GYNHbgD-i6sE(com.zj.wuaipojie.ui.ChallengeSixth,android.view.View) 197 | public static void com.zj.wuaipojie.ui.ChallengeSixth.$r8$lambda$PDKm2AfziZQo6Lv1HEFkJWkUsoE(com.zj.wuaipojie.ui.ChallengeSixth,android.view.View) 198 | 199 | Found 12 method(s) 200 | ``` 201 | 202 | ### 6.objectionHook 203 | 1. hook类的所有方法 204 | ``` 205 | android hooking watch class 类名 206 | ``` 207 | 208 | 2. hook方法的参数、返回值和调用栈 209 | ``` 210 | android hooking watch class_method 类名.方法名 --dump-args --dump-return --dump-backtrace 211 | ``` 212 | 3. hook 类的构造方法 213 | ``` 214 | android hooking watch class_method 类名.$init 215 | ``` 216 | 4. hook 方法的所有重载 217 | ``` 218 | android hooking watch class_method 类名.方法名 219 | ``` 220 | 221 | # 2.trace实战java控制流混淆 222 | 样本展示: 223 | ![图片](_assets_14/a7d36d5536989c6662d83cd3b69fa840277.webp) 224 | ![图片](_assets_14/6f038189728ce1e3ca2b7a590a4693534680.webp) 225 | 项目地址: 226 | [BlackObfuscator](https://github.com/CodingGay/BlackObfuscator) 227 | ### 对抗方法 228 | 1. ZenTracer 229 | [项目地址](https://github.com/hluwa/ZenTracer) 230 | 231 | 缺点:无法打印调用栈,无法`hook`构造函数 232 | ![图片](_assets_14/f45308a95f466b7f2288c9f03aed90bc8183.webp) 233 | ``` 234 | 因为以长久不更新,故新版frida不兼容,下面是我跑起来的版本 235 | python==3.8.8 236 | firda==14.2.18 237 | frida-tools==9.2.4 238 | 还需要安装pyqt5的库 239 | ``` 240 | ``` 241 | //使用说明 242 | 1.运行server端 243 | 2.点击action 244 | 3.点击Match Regex设置过滤标签 245 | 4.输入包名(或者方法名等可以过滤的标签),点击add 246 | 5.点击action的start 247 | 6.点击应用触发相应的逻辑 248 | 7.可左上角fils-Export JSON来导出日志分析 249 | 250 | 251 | ``` 252 | 253 | 2. r0tracer 254 | [项目地址](https://github.com/r0ysue/r0tracer) 255 | 256 | 兼容最新版本 257 | ![图片](_assets_14/057447279037dfcbc1b27773d51ea7126180.webp) 258 | 259 | ```js 260 | 261 | //A. 简易trace单个lei 262 | //traceClass("com.zj.wuaipojie2023_1.MainActivity") 263 | //B. 黑白名单trace多个函数,第一个参数是白名单(包含关键字),第二个参数是黑名单(不包含的关键字) 264 | hook("com.zj.wuaipojie2023_1", "$"); 265 | //hook("ViewController","UI") 266 | //C. 报某个类找不到时,将某个类名填写到第三个参数,比如找不到com.roysue.check类。(前两个参数依旧是黑白名单) 267 | // hook("com.roysue.check"," ","com.roysue.check"); 268 | //D. 新增hookALL() 打开这个模式的情况下,会hook属于app自己的所有业务类,小型app可用 ,中大型app几乎会崩溃,经不起 269 | // hookALL() 270 | 271 | //日志输出 272 | frida -U -f 【2023春节】解题领红包之四 -l r0tracer.js -o Log.txt 273 | 274 | ``` 275 | 276 | 277 | # 六、视频及课件地址 278 | 279 | [百度云](https://pan.baidu.com/s/1cFWTLn14jeWfpXxlx3syYw?pwd=nqu9) 280 | 281 | [阿里云](https://www.aliyundrive.com/s/TJoKMK6du6x) 282 | 283 | [哔哩哔哩](https://www.bilibili.com/video/BV1wT411N7sV/?spm_id_from=333.788&vd_source=6dde16dc6479f00694baaf73a2225452) 284 | 285 | PS:解压密码都是52pj,阿里云由于不能分享压缩包,所以下载exe文件,双击自解压 286 | 287 | # 七、其他章节 288 | 289 | [《安卓逆向这档事》一、模拟器环境搭建](https://www.52pojie.cn/thread-1695141-1-1.html) 290 | [《安卓逆向这档事》二、初识APK文件结构、双开、汉化、基础修改](https://www.52pojie.cn/thread-1695796-1-1.html) 291 | [《安卓逆向这档事》三、初识smail,vip终结者](https://www.52pojie.cn/thread-1701353-1-1.html)   292 | [《安卓逆向这档事》四、恭喜你获得广告&弹窗静默卡](https://www.52pojie.cn/thread-1706691-1-1.html) 293 | [《安卓逆向这档事》五、1000-7=?&动态调试&Log插桩](https://www.52pojie.cn/thread-1714727-1-1.html) 294 | [《安卓逆向这档事》六、校验的N次方-签名校验对抗、PM代{过}{滤}理、IO重定向](https://www.52pojie.cn/thread-1731181-1-1.html) 295 | [《安卓逆向这档事》七、Sorry,会Hook真的可以为所欲为-Xposed快速上手(上)模块编写,常用Api](https://www.52pojie.cn/thread-1740944-1-1.html) 296 | [《安卓逆向这档事》八、Sorry,会Hook真的可以为所欲为-xposed快速上手(下)快速hook](https://www.52pojie.cn/thread-1748081-1-1.html) 297 | [《安卓逆向这档事》九、密码学基础、算法自吐、非标准加密对抗](https://www.52pojie.cn/thread-1762225-1-1.html) 298 | [《安卓逆向这档事》十、不是我说,有了IDA还要什么女朋友?](https://www.52pojie.cn/thread-1787667-1-1.html) 299 | [《安卓逆向这档事》十二、大佬帮我分析一下](https://www.52pojie.cn/thread-1809646-1-1.html) 300 | [《安卓逆向这档事》番外实战篇1-某电影视全家桶](https://www.52pojie.cn/thread-1814917-1-1.html) 301 | [《安卓逆向这档事》十三、是时候学习一下Frida一把梭了(上)](https://www.52pojie.cn/thread-1823118-1-1.html) 302 | [《安卓逆向这档事》十四、是时候学习一下Frida一把梭了(中)](https://www.52pojie.cn/thread-1838539-1-1.html) 303 | # 八、参考文档 304 | [实用FRIDA进阶:内存漫游、hook anywhere、抓包](https://www.anquanke.com/post/id/197657) 305 | 306 | 307 | -------------------------------------------------------------------------------- /Article/15第十五课、是时候学习一下Frida一把梭了(下).md: -------------------------------------------------------------------------------- 1 | ![|500](_assets_15/13975df155153ae785b86e901db44d921765.webp) 2 | # 一、课程目标 3 | 4 | 1.了解Frida-Native-Hook 5 | 6 | 2.借助ida脚本实现一键式hook 7 | 8 | # 二、工具 9 | 10 | 1.教程Demo(更新) 11 | 12 | 2.jadx-gui 13 | 14 | 3.VS Code 15 | 16 | # 三、课程内容 17 | ## 1.Process、Module、Memory基础 18 | ### 1.Process 19 | `Process` 对象代表当前被Hook的进程,能获取进程的信息,枚举模块,枚举范围等 20 | | API | 含义 | 21 | |-------------------------------|-------------| 22 | | `Process.id` | 返回附加目标进程的 `PID` | 23 | | `Process.isDebuggerAttached()`| 检测当前是否对目标程序已经附加 | 24 | | `Process.enumerateModules()` | 枚举当前加载的模块,返回模块对象的数组 | 25 | | `Process.enumerateThreads()` | 枚举当前所有的线程,返回包含 `id`, `state`, `context` 等属性的对象数组 | 26 | 27 | ### 2.Module 28 | `Module` 对象代表一个加载到进程的模块(例如,在 Windows 上的 DLL,或在 Linux/Android 上的 .so 文件),能查询模块的信息,如模块的基址、名称、导入/导出的函数等 29 | | API | 含义 | 30 | |------------------------------------------------------------|----------------------------------------------------------------| 31 | | `Module.load()` | 加载指定so文件,返回一个Module对象 | 32 | | `enumerateImports()` | 枚举所有Import库函数,返回Module数组对象 | 33 | | `enumerateExports()` | 枚举所有Export库函数,返回Module数组对象 | 34 | | `enumerateSymbols()` | 枚举所有Symbol库函数,返回Module数组对象 | 35 | | `Module.findExportByName(exportName)、Module.getExportByName(exportName)` | 寻找指定so中export库中的函数地址 | 36 | | `Module.findBaseAddress(name)、Module.getBaseAddress(name)` | 返回so的基地址 | 37 | ### 3.Memory 38 | `Memory`是一个工具对象,提供直接读取和修改进程内存的功能,能够读取特定地址的值、写入数据、分配内存等 39 | 40 | | 方法 | 功能 | 41 | | ------------------------- | ----------------------------------------------------------- | 42 | | `Memory.copy()` | 复制内存 | 43 | | `Memory.scan()` | 搜索内存中特定模式的数据 | 44 | | `Memory.scanSync()` | 同上,但返回多个匹配的数据 | 45 | | `Memory.alloc()` | 在目标进程的堆上申请指定大小的内存,返回一个`NativePointer` | 46 | | `Memory.writeByteArray()` | 将字节数组写入一个指定内存 | 47 | | `Memory.readByteArray` | 读取内存 | 48 | 49 | ## 2.枚举导入导出表 50 | 51 | 1. **导出表(Export Table)**:列出了库中可以被其他程序或库访问的所有公开函数和符号的名称。 52 | 2. **导入表(Import Table)**:列出了库需要从其他库中调用的函数和符号的名称。 53 | 54 | 简而言之,导出表告诉其他程序:“这些是我提供的功能。”,而导入表则表示:“这些是我需要的功能。”。 55 | 56 | ```js 57 | function hookTest1(){ 58 | Java.perform(function(){ 59 | //打印导入表 60 | var imports = Module.enumerateImports("lib52pojie.so"); 61 | for(var i =0; i < imports.length;i++){ 62 | if(imports[i].name == "vip"){ 63 | console.log(JSON.stringify(imports[i])); //通过JSON.stringify打印object数据 64 | console.log(imports[i].address); 65 | } 66 | } 67 | //打印导出表 68 | var exports = Module.enumerateExports("lib52pojie.so"); 69 | for(var i =0; i < exports.length;i++){ 70 | console.log(JSON.stringify(exports[i])); 71 | } 72 | 73 | }) 74 | } 75 | ``` 76 | ## 3.Native函数的基础Hook打印 77 | 1. 整数型、布尔值类型、char类型 78 | ```JS 79 | function hookTest2(){ 80 | Java.perform(function(){ 81 | //根据导出函数名打印地址 82 | var helloAddr = Module.findExportByName("lib52pojie.so","Java_com_zj_wuaipojie_util_SecurityUtil_checkVip"); 83 | console.log(helloAddr); 84 | if(helloAddr != null){ 85 | //Interceptor.attach是Frida里的一个拦截器 86 | Interceptor.attach(helloAddr,{ 87 | //onEnter里可以打印和修改参数 88 | onEnter: function(args){ //args传入参数 89 | console.log(args[0]); //打印第一个参数的值 90 | console.log(this.context.x1); // 打印寄存器内容 91 | console.log(args[1].toInt32()); //toInt32()转十进制 92 | console.log(args[2].readCString()); //读取字符串 char类型 93 | console.log(hexdump(args[2])); //内存dump 94 | 95 | }, 96 | //onLeave里可以打印和修改返回值 97 | onLeave: function(retval){ //retval返回值 98 | console.log(retval); 99 | console.log("retval",retval.toInt32()); 100 | } 101 | }) 102 | } 103 | }) 104 | } 105 | ``` 106 | 2. 字符串类型 107 | ```js 108 | function hookTest2(){ 109 |     Java.perform(function(){ 110 |         //根据导出函数名打印地址 111 |         var helloAddr = Module.findExportByName("lib52pojie.so","Java_com_zj_wuaipojie_util_SecurityUtil_vipLevel"); 112 |         if(helloAddr != null){ 113 |             Interceptor.attach(helloAddr,{ 114 |                 //onEnter里可以打印和修改参数 115 |                 onEnter: function(args){  //args传入参数 116 |                     // 方法一 117 |                     var jString = Java.cast(args[2], Java.use('java.lang.String')); 118 |                     console.log("参数:", jString.toString()); 119 |                     // 方法二 120 |                     var JNIEnv = Java.vm.getEnv(); 121 |                     var originalStrPtr = JNIEnv.getStringUtfChars(args[2], null).readCString(); 122 |                     console.log("参数:", originalStrPtr); 123 |                 }, 124 |                 //onLeave里可以打印和修改返回值 125 |                 onLeave: function(retval){  //retval返回值 126 |                     var returnedJString = Java.cast(retval, Java.use('java.lang.String')); 127 |                     console.log("返回值:", returnedJString.toString()); 128 |                 } 129 |             }) 130 |         } 131 |     }) 132 | } 133 | 134 | ``` 135 | 136 | ## 4.Native函数的基础Hook修改 137 | 1. 整数型修改 138 | ```js 139 | function hookTest3(){ 140 | Java.perform(function(){ 141 | //根据导出函数名打印地址 142 | var helloAddr = Module.findExportByName("lib52pojie.so","func_four"); 143 | console.log(helloAddr); 144 | if(helloAddr != null){ 145 | Interceptor.attach(helloAddr,{ 146 | onEnter: function(args){ //args参数 147 | args[0] = ptr(1000); //第一个参数修改为整数 1000,先转为指针再赋值 148 | console.log(args[0]); 149 | 150 | }, 151 | onLeave: function(retval){ //retval返回值 152 | retval.replace(20000); //返回值修改 153 | console.log("retval",retval.toInt32()); 154 | } 155 | }) 156 | } 157 | }) 158 | } 159 | ``` 160 | 2. 字符串类型修改 161 | ```js 162 | function hookTest2(){ 163 |     Java.perform(function(){ 164 |         //根据导出函数名打印地址 165 |         var helloAddr = Module.findExportByName("lib52pojie.so","Java_com_zj_wuaipojie_util_SecurityUtil_vipLevel"); 166 |         if(helloAddr != null){ 167 |             Interceptor.attach(helloAddr,{ 168 |                 //onEnter里可以打印和修改参数 169 |                 onEnter: function(args){  //args传入参数 170 |                     var JNIEnv = Java.vm.getEnv(); 171 |                     var originalStrPtr = JNIEnv.getStringUtfChars(args[2], null).readCString(); 172 |                     console.log("参数:", originalStrPtr); 173 |                     var modifiedContent = "至尊"; 174 |                     var newJString = JNIEnv.newStringUtf(modifiedContent); 175 |                     args[2] = newJString; 176 |                 }, 177 |                 //onLeave里可以打印和修改返回值 178 |                 onLeave: function(retval){  //retval返回值 179 |                     var returnedJString = Java.cast(retval, Java.use('java.lang.String')); 180 |                     console.log("返回值:", returnedJString.toString()); 181 |                     var JNIEnv = Java.vm.getEnv(); 182 |                     var modifiedContent = "无敌"; 183 |                     var newJString = JNIEnv.newStringUtf(modifiedContent); 184 |                     retval.replace(newJString); 185 |                 } 186 |             }) 187 |         } 188 |     }) 189 | } 190 | ``` 191 | 192 | ## 5.SO基址的获取方式 193 | ```js 194 | var moduleAddr1 = Process.findModuleByName("lib52pojie.so").base;   195 | var moduleAddr2 = Process.getModuleByName("lib52pojie.so").base;   196 | var moduleAddr3 = Module.findBaseAddress("lib52pojie.so"); 197 | ``` 198 | ## 6.Hook未导出函数与函数地址计算 199 | ```js 200 | function hookTest6(){ 201 | Java.perform(function(){ 202 | //根据导出函数名打印基址 203 | var soAddr = Module.findBaseAddress("lib52pojie.so"); 204 | console.log(soAddr); 205 | var funcaddr = soAddr.add(0x1071C); 206 | console.log(funcaddr); 207 | if(funcaddr != null){ 208 | Interceptor.attach(funcaddr,{ 209 | onEnter: function(args){ //args参数 210 | 211 | }, 212 | onLeave: function(retval){ //retval返回值 213 | console.log(retval.toInt32()); 214 | } 215 | }) 216 | } 217 | }) 218 | } 219 | ``` 220 | 221 | 函数地址计算 222 | 1. 安卓里一般32 位的 so 中都是`thumb`指令,64 位的 so 中都是`arm`指令 223 | 2. 通过IDA里的opcode bytes来判断,arm 指令为 4 个字节(options -> general -> Number of opcode bytes (non-graph) 输入4) 224 | 3. thumb 指令,函数地址计算方式: so 基址 + 函数在 so 中的偏移 + 1 225 | arm 指令,函数地址计算方式: so 基址 + 函数在 so 中的偏移 226 | 227 | ## 7.Hook_dlopen 228 | [dlopen源码](http://aospxref.com/android-8.0.0_r36/xref/bionic/libdl/libdl.c?r=&mo=4035&fi=101#101) 229 | 230 | [android_dlopen_ext源码](http://aospxref.com/android-8.0.0_r36/xref/bionic/libdl/libdl.c#146) 231 | 232 | ```js 233 | function hook_dlopen() { 234 | var dlopen = Module.findExportByName(null, "dlopen"); 235 | Interceptor.attach(dlopen, { 236 | onEnter: function (args) { 237 | var so_name = args[0].readCString(); 238 | if (so_name.indexOf("lib52pojie.so") >= 0) this.call_hook = true; 239 | }, onLeave: function (retval) { 240 | if (this.call_hook) hookTest2(); 241 | } 242 | }); 243 | // 高版本Android系统使用android_dlopen_ext 244 | var android_dlopen_ext = Module.findExportByName(null, "android_dlopen_ext"); 245 | Interceptor.attach(android_dlopen_ext, { 246 | onEnter: function (args) { 247 | var so_name = args[0].readCString(); 248 | if (so_name.indexOf("lib52pojie.so") >= 0) this.call_hook = true; 249 | }, onLeave: function (retval) { 250 | if (this.call_hook) hookTest2(); 251 | } 252 | }); 253 | } 254 | ``` 255 | 256 | ## 8.借助IDA脚本实现一键式hook 257 | ![图片](_assets_15/a5da95feb308079617adbee3cfae85357280.webp) 258 | 259 | [IDA&Frida 学习](https://www.52pojie.cn/forum.php?mod=viewthread&tid=1759879&highlight=frida) 260 | 261 | 262 | # 五、答疑 263 | 264 | 待更新 265 | 266 | # 六、视频及课件地址 267 | 268 | 269 | [百度云](https://pan.baidu.com/s/1cFWTLn14jeWfpXxlx3syYw?pwd=nqu9) 270 | 271 | [阿里云](https://www.aliyundrive.com/s/TJoKMK6du6x) 272 | 273 | [哔哩哔哩](https://www.bilibili.com/video/BV1wT411N7sV/?spm_id_from=333.788&vd_source=6dde16dc6479f00694baaf73a2225452) 274 | 275 | PS:解压密码都是52pj,阿里云由于不能分享压缩包,所以下载exe文件,双击自解压 276 | 277 | # 七、其他章节 278 | [《安卓逆向这档事》一、模拟器环境搭建](https://www.52pojie.cn/thread-1695141-1-1.html) 279 | [《安卓逆向这档事》二、初识APK文件结构、双开、汉化、基础修改](https://www.52pojie.cn/thread-1695796-1-1.html) 280 | [《安卓逆向这档事》三、初识smail,vip终结者](https://www.52pojie.cn/thread-1701353-1-1.html)   281 | [《安卓逆向这档事》四、恭喜你获得广告&弹窗静默卡](https://www.52pojie.cn/thread-1706691-1-1.html) 282 | [《安卓逆向这档事》五、1000-7=?&动态调试&Log插桩](https://www.52pojie.cn/thread-1714727-1-1.html) 283 | [《安卓逆向这档事》六、校验的N次方-签名校验对抗、PM代{过}{滤}理、IO重定向](https://www.52pojie.cn/thread-1731181-1-1.html) 284 | [《安卓逆向这档事》七、Sorry,会Hook真的可以为所欲为-Xposed快速上手(上)模块编写,常用Api](https://www.52pojie.cn/thread-1740944-1-1.html) 285 | [《安卓逆向这档事》八、Sorry,会Hook真的可以为所欲为-xposed快速上手(下)快速hook](https://www.52pojie.cn/thread-1748081-1-1.html) 286 | [《安卓逆向这档事》九、密码学基础、算法自吐、非标准加密对抗](https://www.52pojie.cn/thread-1762225-1-1.html) 287 | [《安卓逆向这档事》十、不是我说,有了IDA还要什么女朋友?](https://www.52pojie.cn/thread-1787667-1-1.html) 288 | [《安卓逆向这档事》十二、大佬帮我分析一下](https://www.52pojie.cn/thread-1809646-1-1.html) 289 | [《安卓逆向这档事》番外实战篇1-某电影视全家桶](https://www.52pojie.cn/thread-1814917-1-1.html) 290 | [《安卓逆向这档事》十三、是时候学习一下Frida一把梭了(上)](https://www.52pojie.cn/thread-1823118-1-1.html) 291 | [《安卓逆向这档事》十四、是时候学习一下Frida一把梭了(中)](https://www.52pojie.cn/thread-1838539-1-1.html) 292 | 293 | 294 | # 八、参考文档 295 | [FRIDA-API使用篇:rpc、Process、Module、Memory使用方法及示例](https://www.anquanke.com/post/id/195215) 296 | 297 | [IDA&Frida 学习](https://www.52pojie.cn/forum.php?mod=viewthread&tid=1759879&highlight=frida) 298 | 299 | [Frida Hook 常用函数、java 层 hook、so 层 hook、RPC、群控](https://blog.csdn.net/freeking101/article/details/112634649) 300 | -------------------------------------------------------------------------------- /Article/16第十六课、是时候学习一下Frida一把梭了(终).md: -------------------------------------------------------------------------------- 1 | ![|500](_assets_16/13975df155153ae785b86e901db44d921765.webp) 2 | 3 | # 题外话(盗课后续) 4 | 吃瓜地址:https://www.52pojie.cn/thread-1854492-1-1.html 5 | 6 | 盗版课程地址:https://www.mashibing.com/live/2520 7 | 8 | ![img](_assets_16/bb1e9696cffc6368f24605e2beb99f16502.webp) 9 | ![img](_assets_16/d3cdcddccaaf1eba5e437f1ea8c458939121.webp) 10 | ![img](_assets_16/006f2041e717d32f007ac202d9bd245d4025.webp) 11 | 12 | PS:感谢北京金诚同达(沈阳)律师事务所-黄律师一直无偿帮我解疑 13 | 14 | 吾爱破解论坛官方B站号:https://space.bilibili.com/544451485 15 | 16 | 我的B站号:https://space.bilibili.com/337859280 17 | 18 | 《安卓逆向这档事》视频教程地址:https://www.bilibili.com/video/BV1wT411N7sV 19 | 20 | 教程开源地址:https://github.com/ZJ595/AndroidReverse 21 | # 一、课程目标 22 | 23 | 1.了解Frida-Native-Hook读写、主动调用 24 | 25 | 2.了解常见的frida_trace工具 26 | 27 | 3.了解控制流混淆对抗新思路 28 | 29 | # 二、工具 30 | 31 | 1.教程Demo(更新) 32 | 33 | 2.jadx-gui 34 | 35 | 3.VS Code 36 | 37 | 4.jeb 38 | 39 | # 三、课程内容 40 | ## 1.Frida写数据 41 | 42 | ```js 43 | //一般写在app的私有目录里,不然会报错:failed to open file (Permission denied)(实际上就是权限不足) 44 | var file_path = "/data/user/0/com.zj.wuaipojie/test.txt"; 45 | var file_handle = new File(file_path, "wb"); 46 | if (file_handle && file_handle != null) { 47 | file_handle.write(data); //写入数据 48 | file_handle.flush(); //刷新 49 | file_handle.close(); //关闭 50 | } 51 | ``` 52 | ## 2.Frida_inlineHook与读写汇编 53 | 什么是inlinehook? 54 | Inline hook(内联钩子)是一种在程序运行时修改函数执行流程的技术。**它通过修改函数的原始代码,将目标函数的执行路径重定向到自定义的代码段,从而实现对目标函数的拦截和修改。** 55 | 简单来说就是可以对任意地址的指令进行hook读写操作 56 | 57 | 常见inlinehook框架: 58 | 59 | [Android-Inline-Hook](https://github.com/ele7enxxh/Android-Inline-Hook) 60 | 61 | [whale](https://github.com/asLody/whale) 62 | 63 | [Dobby](https://github.com/jmpews/Dobby) 64 | 65 | [substrate](http://www.cydiasubstrate.com/) 66 | 67 | PS:Frida的inlinehook不是太稳定,崩溃是基操,另外新版的frida兼容性会比较好 68 | ```js 69 | function inline_hook() { 70 | var soAddr = Module.findBaseAddress("lib52pojie.so"); 71 | if (soAddr) { 72 | var func_addr = soAddr.add(0x10428); 73 | Java.perform(function () { 74 | Interceptor.attach(func_addr, { 75 | onEnter: function (args) { 76 | console.log(this.context.x22); //注意此时就没有args概念了 77 | this.context.x22 = ptr(1); //赋值方法参考上一节课 78 | }, 79 | onLeave: function (retval) { 80 | } 81 | } 82 | ) 83 | }) 84 | } 85 | } 86 | 87 | ``` 88 | 89 | 1. 将地址的指令解析成汇编 90 | ```js 91 | var soAddr = Module.findBaseAddress("lib52pojie.so"); 92 | var codeAddr = Instruction.parse(soAddr.add(0x10428)); 93 | console.log(codeAddr.toString()); 94 | ``` 95 | 2. Frida Api 96 | 97 | [arm转hex](https://armconverter.com/) 98 | ```js 99 | var soAddr = Module.findBaseAddress("lib52pojie.so"); 100 | var codeAddr = soAddr.add(0x10428); 101 | Memory.patchCode(codeAddr, 4, function(code) { 102 | const writer = new Arm64Writer(code, { pc: codeAddr }); 103 | writer.putBytes(hexToBytes("20008052")); 104 | writer.flush(); 105 | }); 106 | function hexToBytes(str) { 107 | var pos = 0; 108 | var len = str.length; 109 | if (len % 2 != 0) { 110 | return null; 111 | } 112 | len /= 2; 113 | var hexA = new Array(); 114 | for (var i = 0; i < len; i++) { 115 | var s = str.substr(pos, 2); 116 | var v = parseInt(s, 16); 117 | hexA.push(v); 118 | pos += 2; 119 | } 120 | return hexA; 121 | } 122 | ``` 123 | 124 | ## 3.普通函数与jni函数的主动调用 125 | [nativefunction](https://frida.re/docs/javascript-api/#nativefunction) 126 | 127 | | 数据类型 | 描述 | 128 | |---------|------------------| 129 | | void | 无返回值 | 130 | | pointer | 指针 | 131 | | int | 整数 | 132 | | long | 长整数 | 133 | | char | 字符 | 134 | | float | 浮点数 | 135 | | double | 双精度浮点数 | 136 | | bool | 布尔值 | 137 | 138 | 139 | ```js 140 | var funcAddr = Module.findBaseAddress("lib52pojie.so").add(0x1054C); 141 | //声明函数指针 142 | //NativeFunction的第一个参数是地址,第二个参数是返回值类型,第三个[]里的是传入的参数类型(有几个就填几个) 143 | var aesAddr = new NativeFunction(funcAddr , 'pointer', ['pointer', 'pointer']); 144 | var encry_text = Memory.allocUtf8String("OOmGYpk6s0qPSXEPp4X31g=="); //开辟一个指针存放字符串 145 | var key = Memory.allocUtf8String('wuaipojie0123456'); 146 | console.log(aesAddr(encry_text ,key).readCString()); 147 | 148 | ``` 149 | 150 | jni的主动调用 151 | 参考java的主动调用,简单快捷 152 | 153 | ## 4.Trace 154 | 155 | | 工具名称 | 描述 | 链接 | 156 | | ----------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------- | 157 | | jnitrace | 老牌,经典,信息全,携带方便 | [jnitrace](https://github.com/chame1eon/jnitrace) | 158 | | jnitrace-engine | 基于jnitrace,可定制化 | [jnitrace-engine](https://github.com/chame1eon/jnitrace-engine) | 159 | | jtrace | 定制方便,信息全面,直接在_agent.js或者_agent_stable.js 里面加自己的逻辑就行 | [jtrace](https://github.com/SeeFlowerX/jtrace) | 160 | | hook_art.js | 可提供jni trace,可以灵活的增加你需要hook的函数 | [hook_art.js](https://github.com/lasting-yang/frida_hook_libart) | 161 | | JNI-Frida-Hook | 函数名已定义,方便定位 | [JNI-Frida-Hook](https://github.com/Areizen/JNI-Frida-Hook) | 162 | | findhash | ida插件,可用于检测加解密函数,也可作为Native Trace库 | [findhash](https://github.com/Pr0214/findhash) | 163 | | Stalker | frida官方提供的代码跟踪引擎,可以在Native层方法级别,块级别,指令级别实现代码修改,代码跟踪 | [Stalker](https://frida.re/docs/stalker/) | 164 | | sktrace | 类似 ida 指令 trace 功能 | [sktrace](https://github.com/bmax121/sktrace) | 165 | | frida-qbdi-tracer | 速度比frida stalker快,免补环境 | [frida-qbdi-tracer](https://github.com/lasting-yang/frida-qbdi-tracer) | 166 | 167 | PS:这次介绍的几款工具都是基础用法,更深入的还需要大家去看看源码学习 168 | 169 | ### 4.1 frida-trace 170 | [官方文档](https://frida.re/docs/frida-trace/) 171 | 172 | frida-trace 可以一次性监控一堆函数地址。还能打印出比较漂亮的树状图,不仅可以显示调用流程,还能显示调用层次。并且贴心的把不同线程调用结果用不同的颜色区分开了。 173 | 大佬整理的文档: 174 | 175 | [frida-trace](https://crifan.github.io/reverse_debug_frida/website/use_frida/frida_trace/) 176 | ``` 177 | D:\> frida-trace.exe --help 178 | 用法: frida-trace [options] target 179 | 180 | 位置参数: 181 | args extra arguments and/or target 182 | 183 | 选项: 184 | -h, --help 显示帮助 185 | -D ID, --device ID 通过 ID 连接设备 186 | -U, --usb 通过 USB 连接设备 187 | -R, --remote 连接到远程 frida-server 188 | -H HOST, --host HOST 连接到远程 host 上的 frida-server 189 | --certificate 证书 设置证书,通过 TSL 与 host 交互 190 | --origin ORIGIN 设置连接到远程服务的 "Origin" 头部 191 | --token TOKEN 设置 与host 认证 192 | --keepalive-interval 时间间隔。0表示禁用,-1表示基于传输自动选择 193 | --p2p 建立一个点对点的连接 194 | --stun-server ADDRESS 设置--p2p 的 STUN 服务地址 195 | --relay address,username,password,turn-{udp,tcp,tls} 添加--p2p 延迟 196 | -f TARGET, --file TARGET spawn 模式 197 | -F, --attach-frontmost 附加到最前端的 application 198 | -n NAME, --attach-name NAME 附加到一个名字 199 | -N IDENTIFIER, --attach-identifier IDENTIFIER 附加到标识符 200 | -p PID, --attach-pid PID 附加到 pid 201 | -W PATTERN, --await PATTERN 202 | await spawn matching PATTERN 203 | --stdio {inherit,pipe} 204 | stdio behavior when spawning (defaults to “inherit”) 205 | --aux option set aux option when spawning, such as “uid=(int)42” (supported types are: 206 | string, bool, int) 207 | --realm {native,emulated} 附件的范围 208 | --runtime {qjs,v8} 使用的脚本运行环境 209 | --debug 启用 Node.js 兼容的脚本调试器 210 | --squelch-crash 如果启用,将不会将崩溃报告转储到控制台 211 | -O FILE, --options-file FILE 将信息保存到文件中 212 | --version 显示版本号 213 | ``` 214 | 215 | - `-i` / `-a`: 跟踪 C 函数或 so 库中的函数。 216 | 217 | PS:-a 包含模块+偏移跟踪,一般用于追踪未导出函数,例子:-a "lib52pojie.so!0x4793c" 218 | 219 | 包含/排除模块或函数: 220 | - `-I` : 包含指定模块。 221 | - `-X` : 排除指定模块。 222 | 223 | Java 方法跟踪: 224 | - `-j JAVA_METHOD`: 包含 Java 方法。 225 | - `-J JAVA_METHOD`: 排除 Java 方法。 226 | 227 | 附加方式: 228 | - `-f`:通过 spwan 方式启动 229 | - `-F`:通过 attach 方式附加当前进程 230 | 231 | 日志输出: 232 | `-o`:日志输出到文件 233 | 234 | ``` 235 | 使用案例: 236 | frida-trace -U -F -I "lib52pojie.so" -i "Java_" #附加当前进程并追踪lib52pojie.so里的所有Java_开头的jni导出函数 237 | ``` 238 | 239 | ![图片](_assets_16/288c4c7447228d803b9355891be976457415.webp) 240 | 241 | ### 4.2jnitrace 242 | 前提 243 | ``` 244 | pip install jnitrace==3.3.0 245 | ``` 246 | 247 | 使用方法 248 | ``` 249 | jnitrace -m attach -l lib52pojie.so com.zj.wuaipojie -o trace.json //attach模式附加52pojie.so并输出日志 250 | ``` 251 | `-l libnative-lib.so`- 用于指定要跟踪的库 252 | 253 | `-m `- 用于指定要使用的 Frida 附加机制 254 | 255 | `-i `- 用于指定应跟踪的方法名称,例如,`-i Get -i RegisterNatives`将仅包含名称中包含 Get 或 RegisterNatives 的 JNI 方法 256 | 257 | `-e `- 用于指定跟踪中应忽略的方法名称,例如,`-e ^Find -e GetEnv`将从结果中排除所有以 Find 开头或包含 GetEnv 的 JNI 方法名称 258 | 259 | `-I `- 用于指定应跟踪的库的导出 260 | 261 | `-E `用于指定不应跟踪的库的导出 262 | 263 | `-o path/output.json`- 用于指定`jnitrace`存储所有跟踪数据的输出路径 264 | 265 | ![图片](_assets_16/6030c0c3518cca31e9a9651dadc2875f7693.webp) 266 | 267 | ### 4.3sktrace 268 | ``` 269 | python sktrace.py -m attach -l lib52pojie.so -i 0x103B4 com.zj.wuaipojie 270 | ``` 271 | 272 | ![图片](_assets_16/2316edaea1d4685375ef7ecb0104f9196857.webp) 273 | ## 5.控制流混淆对抗新发现 274 | [细品sec2023安卓赛题](https://bbs.kanxue.com/thread-278648.htm) 275 | 276 | [JEB Decompiler 5.5.0.202311022109 mod by CXV](https://bbs.kanxue.com/thread-279456.htm) 277 | 278 | PS:注意jdk的版本要高于17,不然打不开 279 | 280 | [下载地址](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) 281 | 282 | 恐怖如斯的效果对比图: 283 | 284 | ![图片](_assets_16/9f23f5f8dc5bb2f1c7b14f2ad406c7891341.webp) 285 | 286 | PS:珍惜表哥说dexlib2也能混淆对抗,效果比jeb的还强大 287 | 288 | # 五、答疑 289 | 290 | 待更新 291 | 292 | # 六、视频及课件地址 293 | 294 | 295 | [百度云](https://pan.baidu.com/s/1cFWTLn14jeWfpXxlx3syYw?pwd=nqu9) 296 | 297 | [阿里云](https://www.aliyundrive.com/s/TJoKMK6du6x) 298 | 299 | [哔哩哔哩](https://www.bilibili.com/video/BV1wT411N7sV/?spm_id_from=333.788&vd_source=6dde16dc6479f00694baaf73a2225452) 300 | 301 | PS:解压密码都是52pj,阿里云由于不能分享压缩包,所以下载exe文件,双击自解压 302 | 303 | # 七、其他章节 304 | [《安卓逆向这档事》一、模拟器环境搭建](https://www.52pojie.cn/thread-1695141-1-1.html) 305 | [《安卓逆向这档事》二、初识APK文件结构、双开、汉化、基础修改](https://www.52pojie.cn/thread-1695796-1-1.html) 306 | [《安卓逆向这档事》三、初识smail,vip终结者](https://www.52pojie.cn/thread-1701353-1-1.html) 307 | [《安卓逆向这档事》四、恭喜你获得广告&弹窗静默卡](https://www.52pojie.cn/thread-1706691-1-1.html) 308 | [《安卓逆向这档事》五、1000-7=?&动态调试&Log插桩](https://www.52pojie.cn/thread-1714727-1-1.html) 309 | [《安卓逆向这档事》六、校验的N次方-签名校验对抗、PM代{过}{滤}理、IO重定向](https://www.52pojie.cn/thread-1731181-1-1.html) 310 | [《安卓逆向这档事》七、Sorry,会Hook真的可以为所欲为-Xposed快速上手(上)模块编写,常用Api](https://www.52pojie.cn/thread-1740944-1-1.html) 311 | [《安卓逆向这档事》八、Sorry,会Hook真的可以为所欲为-xposed快速上手(下)快速hook](https://www.52pojie.cn/thread-1748081-1-1.html) 312 | [《安卓逆向这档事》九、密码学基础、算法自吐、非标准加密对抗](https://www.52pojie.cn/thread-1762225-1-1.html) 313 | [《安卓逆向这档事》十、不是我说,有了IDA还要什么女朋友?](https://www.52pojie.cn/thread-1787667-1-1.html) 314 | [《安卓逆向这档事》十二、大佬帮我分析一下](https://www.52pojie.cn/thread-1809646-1-1.html) 315 | [《安卓逆向这档事》番外实战篇1-某电影视全家桶](https://www.52pojie.cn/thread-1814917-1-1.html) 316 | [《安卓逆向这档事》十三、是时候学习一下Frida一把梭了(上)](https://www.52pojie.cn/thread-1823118-1-1.html) 317 | [《安卓逆向这档事》十四、是时候学习一下Frida一把梭了(中)](https://www.52pojie.cn/thread-1838539-1-1.html) 318 | [《安卓逆向这档事》十五、是时候学习一下Frida一把梭了(下)](https://www.52pojie.cn/thread-1840174-1-1.html) 319 | 320 | # 八、参考文档 321 | 322 | [Trace大盘点](https://blog.csdn.net/fenfei331/article/details/123523182) 323 | 324 | [[原创]frida-qbdi-tracer](https://bbs.kanxue.com/thread-276523.htm) 325 | 326 | [优化jnitrace以及增强信息打印](https://blog.seeflower.dev/archives/82/) 327 | 328 | [jnitrace、frida-trace、Stalker、sktrace、Frida Native Trace、r0tracer、strace、IDA trace、Unidbg Trace](https://blog.csdn.net/freeking101/article/details/129645787) 329 | 330 | [Frida Stalker - Tracing binary instructions](https://www.youtube.com/watch?v=BgICyi2H2CU) 331 | 332 | [frida hook so层方法大全](https://blog.csdn.net/weixin_38819889/article/details/122535920) 333 | 334 | [Inline HOOK](https://blog.csdn.net/Tandy12356_/article/details/130898669) 335 | -------------------------------------------------------------------------------- /Article/_assets_00/7462852ab6eb72614bcf04006c7899b8889.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_00/7462852ab6eb72614bcf04006c7899b8889.webp -------------------------------------------------------------------------------- /Article/_assets_00/806bdcfee5aaf91ed799d9848e39bc631049.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_00/806bdcfee5aaf91ed799d9848e39bc631049.webp -------------------------------------------------------------------------------- /Article/_assets_01/QQ_cX1PyTDD8C.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_01/QQ_cX1PyTDD8C.webp -------------------------------------------------------------------------------- /Article/_assets_01/QQ_x1fLNSspol.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_01/QQ_x1fLNSspol.webp -------------------------------------------------------------------------------- /Article/_assets_01/magisk.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_01/magisk.webp -------------------------------------------------------------------------------- /Article/_assets_02/0805127fa851ed69cc1b88602b4e030f.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_02/0805127fa851ed69cc1b88602b4e030f.webp -------------------------------------------------------------------------------- /Article/_assets_02/cb35179c3ff8786b19fc1d2d2ecae12e.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_02/cb35179c3ff8786b19fc1d2d2ecae12e.webp -------------------------------------------------------------------------------- /Article/_assets_03/96c49239b5565c8b8e8e55e724a08a79.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_03/96c49239b5565c8b8e8e55e724a08a79.webp -------------------------------------------------------------------------------- /Article/_assets_03/fe7852e13a354ab54af29ff3a3361b3f.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_03/fe7852e13a354ab54af29ff3a3361b3f.webp -------------------------------------------------------------------------------- /Article/_assets_04/095224403891.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_04/095224403891.gif -------------------------------------------------------------------------------- /Article/_assets_04/526ed2cdc5a4bd33be2389203d8141d2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_04/526ed2cdc5a4bd33be2389203d8141d2.webp -------------------------------------------------------------------------------- /Article/_assets_04/d810cf812e87dd8cbbb663cf9b1247a4.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_04/d810cf812e87dd8cbbb663cf9b1247a4.webp -------------------------------------------------------------------------------- /Article/_assets_05/6662c1557c35c098361cf868274174e5.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_05/6662c1557c35c098361cf868274174e5.webp -------------------------------------------------------------------------------- /Article/_assets_05/aafaf597b418757a41a89c24897606fe.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_05/aafaf597b418757a41a89c24897606fe.webp -------------------------------------------------------------------------------- /Article/_assets_05/d0b83f14677ccee75fdeb7891e1886c95009.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_05/d0b83f14677ccee75fdeb7891e1886c95009.webp -------------------------------------------------------------------------------- /Article/_assets_05/ff8d9deea26f077ba163581b7baa78e5681.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_05/ff8d9deea26f077ba163581b7baa78e5681.webp -------------------------------------------------------------------------------- /Article/_assets_06/103358lyvv78yxjzjvctvb.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_06/103358lyvv78yxjzjvctvb.webp -------------------------------------------------------------------------------- /Article/_assets_06/1d7ab639d33cce3e5d833dd68ce90f56.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_06/1d7ab639d33cce3e5d833dd68ce90f56.webp -------------------------------------------------------------------------------- /Article/_assets_06/2501f84f8f0b1e23adf198e9597429c6.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_06/2501f84f8f0b1e23adf198e9597429c6.webp -------------------------------------------------------------------------------- /Article/_assets_06/4f081fbd5d9cc7007c8e69a30a54066d.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_06/4f081fbd5d9cc7007c8e69a30a54066d.webp -------------------------------------------------------------------------------- /Article/_assets_06/8b9292b5d889c38f1202491d80ca9a732735.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_06/8b9292b5d889c38f1202491d80ca9a732735.webp -------------------------------------------------------------------------------- /Article/_assets_06/c43f1a2451e41a9087ae2f383f21f908.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_06/c43f1a2451e41a9087ae2f383f21f908.gif -------------------------------------------------------------------------------- /Article/_assets_06/d59a8b67dd64ebaf64c340af074a9ad0.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_06/d59a8b67dd64ebaf64c340af074a9ad0.webp -------------------------------------------------------------------------------- /Article/_assets_06/e9ec81f588d2f36b4864db4eb7527eb4.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_06/e9ec81f588d2f36b4864db4eb7527eb4.webp -------------------------------------------------------------------------------- /Article/_assets_07/04ea10cee93fed63a897374f30454fbc.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_07/04ea10cee93fed63a897374f30454fbc.webp -------------------------------------------------------------------------------- /Article/_assets_07/446f8d3dd904807ec67410eb40c0e185.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_07/446f8d3dd904807ec67410eb40c0e185.webp -------------------------------------------------------------------------------- /Article/_assets_07/7c151d078e0c180a9c51dfd50b26c4d6.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_07/7c151d078e0c180a9c51dfd50b26c4d6.webp -------------------------------------------------------------------------------- /Article/_assets_07/92d1daf78d96dcb10b3351f808a9021c.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_07/92d1daf78d96dcb10b3351f808a9021c.webp -------------------------------------------------------------------------------- /Article/_assets_07/ad601470ed9b3277ac4f2921374ee046.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_07/ad601470ed9b3277ac4f2921374ee046.webp -------------------------------------------------------------------------------- /Article/_assets_08/072712a5b22db342388d6d48c6c04786.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_08/072712a5b22db342388d6d48c6c04786.webp -------------------------------------------------------------------------------- /Article/_assets_08/14fa2f859dff8270661317c87ff31bc5.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_08/14fa2f859dff8270661317c87ff31bc5.webp -------------------------------------------------------------------------------- /Article/_assets_08/91014da5df72d045bdc9fcc522e8591c.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_08/91014da5df72d045bdc9fcc522e8591c.webp -------------------------------------------------------------------------------- /Article/_assets_08/9502d04fe683e2e0775f0eea93924366.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_08/9502d04fe683e2e0775f0eea93924366.gif -------------------------------------------------------------------------------- /Article/_assets_08/dee2255c9aee5991068d78d00574c251.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_08/dee2255c9aee5991068d78d00574c251.webp -------------------------------------------------------------------------------- /Article/_assets_09/2115b905b61a6e036f43b84c8bcd545d.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_09/2115b905b61a6e036f43b84c8bcd545d.webp -------------------------------------------------------------------------------- /Article/_assets_09/2f6c631fd006975522c8f28626bcc2d4.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_09/2f6c631fd006975522c8f28626bcc2d4.webp -------------------------------------------------------------------------------- /Article/_assets_09/37f7b824a5b1b89590d1bb77930479ab.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_09/37f7b824a5b1b89590d1bb77930479ab.webp -------------------------------------------------------------------------------- /Article/_assets_09/9728127b75870d2592e42699757952d8.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_09/9728127b75870d2592e42699757952d8.webp -------------------------------------------------------------------------------- /Article/_assets_09/bb79537ec46505e2af3db6ad7d945ef8.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_09/bb79537ec46505e2af3db6ad7d945ef8.webp -------------------------------------------------------------------------------- /Article/_assets_10/01f4bf013198aea885d9e513ad5e5eec4798.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_10/01f4bf013198aea885d9e513ad5e5eec4798.webp -------------------------------------------------------------------------------- /Article/_assets_10/35d0832fb2523805c2a2165ec5458caa.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_10/35d0832fb2523805c2a2165ec5458caa.webp -------------------------------------------------------------------------------- /Article/_assets_10/666c7661bc9de4a54f730bb789af63f74113.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_10/666c7661bc9de4a54f730bb789af63f74113.webp -------------------------------------------------------------------------------- /Article/_assets_10/7a7ad0ff5b441646156f6116cbcf8e2a610.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_10/7a7ad0ff5b441646156f6116cbcf8e2a610.webp -------------------------------------------------------------------------------- /Article/_assets_10/cc9934d4392e49ed2c51e35cf94ab8e2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_10/cc9934d4392e49ed2c51e35cf94ab8e2.webp -------------------------------------------------------------------------------- /Article/_assets_12/10237711b2389cc4046111f281e2a5114798.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_12/10237711b2389cc4046111f281e2a5114798.webp -------------------------------------------------------------------------------- /Article/_assets_12/2e6d7fec6426ee782c457ef47dc1b6532185.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_12/2e6d7fec6426ee782c457ef47dc1b6532185.webp -------------------------------------------------------------------------------- /Article/_assets_12/3c7df87b5caf4fb8e8eb5a5e6770974c3143.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_12/3c7df87b5caf4fb8e8eb5a5e6770974c3143.webp -------------------------------------------------------------------------------- /Article/_assets_12/4e6ce8bed2fc8fe127883b353d430a3c633.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_12/4e6ce8bed2fc8fe127883b353d430a3c633.webp -------------------------------------------------------------------------------- /Article/_assets_12/5657f2b0cb88f9410b9ec005374483ee4165.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_12/5657f2b0cb88f9410b9ec005374483ee4165.webp -------------------------------------------------------------------------------- /Article/_assets_12/5fbd65841b315413cbe285ece4abe44a461.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_12/5fbd65841b315413cbe285ece4abe44a461.webp -------------------------------------------------------------------------------- /Article/_assets_12/70e8ece9cfaf25fc157f469ee70bdc276221.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_12/70e8ece9cfaf25fc157f469ee70bdc276221.webp -------------------------------------------------------------------------------- /Article/_assets_12/7dc6951312deb223eacc28000e5a6f555599.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_12/7dc6951312deb223eacc28000e5a6f555599.webp -------------------------------------------------------------------------------- /Article/_assets_12/b34cc8827fbdcf1c81e83be078d66ea25457.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_12/b34cc8827fbdcf1c81e83be078d66ea25457.webp -------------------------------------------------------------------------------- /Article/_assets_12/bb663034587188a1fa4ebf55789f66542707.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_12/bb663034587188a1fa4ebf55789f66542707.webp -------------------------------------------------------------------------------- /Article/_assets_12/bf90da0211002f1447698023d489397a9710.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_12/bf90da0211002f1447698023d489397a9710.webp -------------------------------------------------------------------------------- /Article/_assets_12/c9b8f1571cbb4a08837a2c93193b722f3091.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_12/c9b8f1571cbb4a08837a2c93193b722f3091.webp -------------------------------------------------------------------------------- /Article/_assets_12/d69ff8297a12fd1c9fe7ff62fbe5efae4286.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_12/d69ff8297a12fd1c9fe7ff62fbe5efae4286.webp -------------------------------------------------------------------------------- /Article/_assets_12/d8f025d0c0cf38b9964e616fe5a642a51839.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_12/d8f025d0c0cf38b9964e616fe5a642a51839.webp -------------------------------------------------------------------------------- /Article/_assets_12/e966a143f2519a137216d5614e0e2ea36269.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_12/e966a143f2519a137216d5614e0e2ea36269.webp -------------------------------------------------------------------------------- /Article/_assets_13/13975df155153ae785b86e901db44d921765.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_13/13975df155153ae785b86e901db44d921765.webp -------------------------------------------------------------------------------- /Article/_assets_13/24a6bd098ba2f33600cd53a0aefef3505230.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_13/24a6bd098ba2f33600cd53a0aefef3505230.webp -------------------------------------------------------------------------------- /Article/_assets_13/7db57bb7af605621210756bc21aa9b674367.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_13/7db57bb7af605621210756bc21aa9b674367.webp -------------------------------------------------------------------------------- /Article/_assets_14/057447279037dfcbc1b27773d51ea7126180.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_14/057447279037dfcbc1b27773d51ea7126180.webp -------------------------------------------------------------------------------- /Article/_assets_14/13975df155153ae785b86e901db44d921765.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_14/13975df155153ae785b86e901db44d921765.webp -------------------------------------------------------------------------------- /Article/_assets_14/149aa38a7e5ef7ea0a4f1e2cfa0815a66608.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_14/149aa38a7e5ef7ea0a4f1e2cfa0815a66608.webp -------------------------------------------------------------------------------- /Article/_assets_14/6f038189728ce1e3ca2b7a590a4693534680.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_14/6f038189728ce1e3ca2b7a590a4693534680.webp -------------------------------------------------------------------------------- /Article/_assets_14/a7d36d5536989c6662d83cd3b69fa840277.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_14/a7d36d5536989c6662d83cd3b69fa840277.webp -------------------------------------------------------------------------------- /Article/_assets_14/f45308a95f466b7f2288c9f03aed90bc8183.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_14/f45308a95f466b7f2288c9f03aed90bc8183.webp -------------------------------------------------------------------------------- /Article/_assets_15/13975df155153ae785b86e901db44d921765.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_15/13975df155153ae785b86e901db44d921765.webp -------------------------------------------------------------------------------- /Article/_assets_15/a5da95feb308079617adbee3cfae85357280.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_15/a5da95feb308079617adbee3cfae85357280.webp -------------------------------------------------------------------------------- /Article/_assets_16/006f2041e717d32f007ac202d9bd245d4025.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_16/006f2041e717d32f007ac202d9bd245d4025.webp -------------------------------------------------------------------------------- /Article/_assets_16/13975df155153ae785b86e901db44d921765.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_16/13975df155153ae785b86e901db44d921765.webp -------------------------------------------------------------------------------- /Article/_assets_16/2316edaea1d4685375ef7ecb0104f9196857.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_16/2316edaea1d4685375ef7ecb0104f9196857.webp -------------------------------------------------------------------------------- /Article/_assets_16/288c4c7447228d803b9355891be976457415.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_16/288c4c7447228d803b9355891be976457415.webp -------------------------------------------------------------------------------- /Article/_assets_16/6030c0c3518cca31e9a9651dadc2875f7693.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_16/6030c0c3518cca31e9a9651dadc2875f7693.webp -------------------------------------------------------------------------------- /Article/_assets_16/9f23f5f8dc5bb2f1c7b14f2ad406c7891341.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_16/9f23f5f8dc5bb2f1c7b14f2ad406c7891341.webp -------------------------------------------------------------------------------- /Article/_assets_16/bb1e9696cffc6368f24605e2beb99f16502.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_16/bb1e9696cffc6368f24605e2beb99f16502.webp -------------------------------------------------------------------------------- /Article/_assets_16/d3cdcddccaaf1eba5e437f1ea8c458939121.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_16/d3cdcddccaaf1eba5e437f1ea8c458939121.webp -------------------------------------------------------------------------------- /Article/_assets_17/0db17e0b880167caae73ae1d053047827157.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_17/0db17e0b880167caae73ae1d053047827157.webp -------------------------------------------------------------------------------- /Article/_assets_17/1e77b1180d8562a0eb8017c2d90a818d5780.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_17/1e77b1180d8562a0eb8017c2d90a818d5780.webp -------------------------------------------------------------------------------- /Article/_assets_17/736d19fb6b13e4941e89ff14a865f1dc2087.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_17/736d19fb6b13e4941e89ff14a865f1dc2087.webp -------------------------------------------------------------------------------- /Article/_assets_17/8e23e0092e459ba360f377debbdc0fce4256.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_17/8e23e0092e459ba360f377debbdc0fce4256.webp -------------------------------------------------------------------------------- /Article/_assets_17/beaaaa5baa4343112edc32e063495a3f1535.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_17/beaaaa5baa4343112edc32e063495a3f1535.webp -------------------------------------------------------------------------------- /Article/_assets_17/c8871d492cda099d0676d4736744e6c88770.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_17/c8871d492cda099d0676d4736744e6c88770.webp -------------------------------------------------------------------------------- /Article/_assets_17/da9478cb5246e031efadb5715dbfe3d67084.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_17/da9478cb5246e031efadb5715dbfe3d67084.webp -------------------------------------------------------------------------------- /Article/_assets_17/e6e9f54a157df42bc4dbf4bd5b853a2f1637.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_17/e6e9f54a157df42bc4dbf4bd5b853a2f1637.webp -------------------------------------------------------------------------------- /Article/_assets_17/e8dd5433c357eda94f0db69d5fc0c9989444.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_17/e8dd5433c357eda94f0db69d5fc0c9989444.webp -------------------------------------------------------------------------------- /Article/_assets_18/25f2a3c1d478357bb60008780a9539bf6487.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_18/25f2a3c1d478357bb60008780a9539bf6487.png -------------------------------------------------------------------------------- /Article/_assets_18/4dc9b4a36e937c443bbce777ada6b57e4327.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_18/4dc9b4a36e937c443bbce777ada6b57e4327.png -------------------------------------------------------------------------------- /Article/_assets_18/8d434c16d1a2af86d824723e4525de9e8343.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_18/8d434c16d1a2af86d824723e4525de9e8343.png -------------------------------------------------------------------------------- /Article/_assets_18/c66e1b5d8a9d09e037108b9234450a8b6913.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_18/c66e1b5d8a9d09e037108b9234450a8b6913.png -------------------------------------------------------------------------------- /Article/_assets_19/05021abca85b3171197d0fe3fb67ab6b4981.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_19/05021abca85b3171197d0fe3fb67ab6b4981.png -------------------------------------------------------------------------------- /Article/_assets_19/12c3c4392e3cbe98d587338ffaa17b958258.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_19/12c3c4392e3cbe98d587338ffaa17b958258.png -------------------------------------------------------------------------------- /Article/_assets_19/4dc9b4a36e937c443bbce777ada6b57e4327.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_19/4dc9b4a36e937c443bbce777ada6b57e4327.png -------------------------------------------------------------------------------- /Article/_assets_19/5d77cb0275b0416dd9108347d069a6543952.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_19/5d77cb0275b0416dd9108347d069a6543952.png -------------------------------------------------------------------------------- /Article/_assets_19/6083ea10892635db16bebb2051bde8c15922.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_19/6083ea10892635db16bebb2051bde8c15922.png -------------------------------------------------------------------------------- /Article/_assets_19/95a5834b93e0e9b4656b2ee59d3b03f26690.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_19/95a5834b93e0e9b4656b2ee59d3b03f26690.png -------------------------------------------------------------------------------- /Article/_assets_19/a706cdbf6ef8fe2814f0db18564378892331.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_19/a706cdbf6ef8fe2814f0db18564378892331.png -------------------------------------------------------------------------------- /Article/_assets_19/e9b4df380b4d463c8071b32d63fd79474022.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_19/e9b4df380b4d463c8071b32d63fd79474022.png -------------------------------------------------------------------------------- /Article/_assets_20/037c4aed12239c01c68cd9da85f4d41a770.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_20/037c4aed12239c01c68cd9da85f4d41a770.png -------------------------------------------------------------------------------- /Article/_assets_20/080ccff1430b2a09b4843c24f12e1b68918.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_20/080ccff1430b2a09b4843c24f12e1b68918.png -------------------------------------------------------------------------------- /Article/_assets_20/2135d73a0203b4c0fda76d1ebbf0e28f6280.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_20/2135d73a0203b4c0fda76d1ebbf0e28f6280.png -------------------------------------------------------------------------------- /Article/_assets_20/2380a96afbab29c6075f2fa59e9434d75797.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_20/2380a96afbab29c6075f2fa59e9434d75797.png -------------------------------------------------------------------------------- /Article/_assets_20/29cff81a83469952c3d4f740070331dd6871.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_20/29cff81a83469952c3d4f740070331dd6871.png -------------------------------------------------------------------------------- /Article/_assets_20/2cee7f32addd3a3a7a5a252515f830db4663.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_20/2cee7f32addd3a3a7a5a252515f830db4663.png -------------------------------------------------------------------------------- /Article/_assets_20/2e542318c825d13ce7498dab098840661279.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_20/2e542318c825d13ce7498dab098840661279.png -------------------------------------------------------------------------------- /Article/_assets_20/3e7f8a47c0f69b8da215cae330eab47a5378.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_20/3e7f8a47c0f69b8da215cae330eab47a5378.png -------------------------------------------------------------------------------- /Article/_assets_20/455a205768f13c92aeea2e898158975b8453.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_20/455a205768f13c92aeea2e898158975b8453.png -------------------------------------------------------------------------------- /Article/_assets_20/5608695270c253c624622537a8155b381372.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_20/5608695270c253c624622537a8155b381372.png -------------------------------------------------------------------------------- /Article/_assets_20/742f6986f3bff27771801393776f76512492.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_20/742f6986f3bff27771801393776f76512492.png -------------------------------------------------------------------------------- /Article/_assets_20/79d382a325703d7728471f92fc602c285040.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_20/79d382a325703d7728471f92fc602c285040.png -------------------------------------------------------------------------------- /Article/_assets_20/8d8d2629791f8063c5ad7d7c94ac50d04881.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_20/8d8d2629791f8063c5ad7d7c94ac50d04881.png -------------------------------------------------------------------------------- /Article/_assets_20/9f3a11e0f48d829f9a162cd47644cf2b6822.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_20/9f3a11e0f48d829f9a162cd47644cf2b6822.png -------------------------------------------------------------------------------- /Article/_assets_20/a8dd57da277921b813a230908e36a6024643.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_20/a8dd57da277921b813a230908e36a6024643.png -------------------------------------------------------------------------------- /Article/_assets_20/b1cacf9dbbf615d546d1ce24ebcc6fb77277.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_20/b1cacf9dbbf615d546d1ce24ebcc6fb77277.png -------------------------------------------------------------------------------- /Article/_assets_20/c64c33e20b330e6fa3c40a816a2381b77908.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_20/c64c33e20b330e6fa3c40a816a2381b77908.png -------------------------------------------------------------------------------- /Article/_assets_20/charles_hdr.863548d1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_20/charles_hdr.863548d1.png -------------------------------------------------------------------------------- /Article/_assets_20/d29310bddba69aac4b6f0187e9e76c6a7761.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_20/d29310bddba69aac4b6f0187e9e76c6a7761.png -------------------------------------------------------------------------------- /Article/_assets_20/d321d630a0b0fd956f81bf1f194b14063637.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_20/d321d630a0b0fd956f81bf1f194b14063637.png -------------------------------------------------------------------------------- /Article/_assets_20/ef555a1827efb3dfcef6f426fc1085716419.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_20/ef555a1827efb3dfcef6f426fc1085716419.jpeg -------------------------------------------------------------------------------- /Article/_assets_20/wireshark-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_20/wireshark-logo.png -------------------------------------------------------------------------------- /Article/_assets_21/01c867a0f9c7aa12547fff13d7da37233297.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_21/01c867a0f9c7aa12547fff13d7da37233297.png -------------------------------------------------------------------------------- /Article/_assets_21/0a9a2100cf372797d71d6eef020f20995509.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_21/0a9a2100cf372797d71d6eef020f20995509.png -------------------------------------------------------------------------------- /Article/_assets_21/10412680bca1b1eb36f35b94753359722389.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_21/10412680bca1b1eb36f35b94753359722389.png -------------------------------------------------------------------------------- /Article/_assets_21/220f891dcbe0141f943329092d824e8f4823.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_21/220f891dcbe0141f943329092d824e8f4823.png -------------------------------------------------------------------------------- /Article/_assets_21/270791dea38b7180e01545da7451c4838629.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_21/270791dea38b7180e01545da7451c4838629.png -------------------------------------------------------------------------------- /Article/_assets_21/2c99b38732db09c7c53ff41c01558c829480.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_21/2c99b38732db09c7c53ff41c01558c829480.png -------------------------------------------------------------------------------- /Article/_assets_21/2fe64e3f49905acfb778c9e768d877903919.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_21/2fe64e3f49905acfb778c9e768d877903919.png -------------------------------------------------------------------------------- /Article/_assets_21/327705fdbf6c6e9174662278103993333896.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_21/327705fdbf6c6e9174662278103993333896.png -------------------------------------------------------------------------------- /Article/_assets_21/46ae4e01cb09f73cdcc08aa9d186a59f4749.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_21/46ae4e01cb09f73cdcc08aa9d186a59f4749.png -------------------------------------------------------------------------------- /Article/_assets_21/4e90d681954f292f3d0d1fa449a283826951.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_21/4e90d681954f292f3d0d1fa449a283826951.png -------------------------------------------------------------------------------- /Article/_assets_21/55c4c46ec2a7069adba004a951b6155f8883.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_21/55c4c46ec2a7069adba004a951b6155f8883.png -------------------------------------------------------------------------------- /Article/_assets_21/7ee730055cad5f62a71757086a60393e6576.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_21/7ee730055cad5f62a71757086a60393e6576.png -------------------------------------------------------------------------------- /Article/_assets_21/8d1507667471fd97a56535605ee2f8394322.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_21/8d1507667471fd97a56535605ee2f8394322.png -------------------------------------------------------------------------------- /Article/_assets_21/acbec70f90e02bc9b22e03329310dced8210.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_21/acbec70f90e02bc9b22e03329310dced8210.png -------------------------------------------------------------------------------- /Article/_assets_21/b1f52f35ce477799124866bf8c2f03665392.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_21/b1f52f35ce477799124866bf8c2f03665392.png -------------------------------------------------------------------------------- /Article/_assets_21/b3c57e78ebf7c0f4b78a7455d2d8202c9612.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_21/b3c57e78ebf7c0f4b78a7455d2d8202c9612.png -------------------------------------------------------------------------------- /Article/_assets_21/b558f9e5955df257c7a69fdf2674a32b7773.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_21/b558f9e5955df257c7a69fdf2674a32b7773.png -------------------------------------------------------------------------------- /Article/_assets_21/cca5d2acd5a5489d4deabe0a8cb1075c7230.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_21/cca5d2acd5a5489d4deabe0a8cb1075c7230.png -------------------------------------------------------------------------------- /Article/_assets_21/ccffa5dc15c369ef1db76ef41a13bb903741.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_21/ccffa5dc15c369ef1db76ef41a13bb903741.png -------------------------------------------------------------------------------- /Article/_assets_21/cea0767af148752ed9b8fbee9084b9c53235.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_21/cea0767af148752ed9b8fbee9084b9c53235.png -------------------------------------------------------------------------------- /Article/_assets_21/eb0b10801f015a40537d6a47f65a81e64424.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_21/eb0b10801f015a40537d6a47f65a81e64424.png -------------------------------------------------------------------------------- /Article/_assets_21/fc153f6ac1c211d8585b54ec7aed6f106586.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_21/fc153f6ac1c211d8585b54ec7aed6f106586.png -------------------------------------------------------------------------------- /Article/_assets_21/fd5f2e774a73c9cab41771670ddd44d63517.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_21/fd5f2e774a73c9cab41771670ddd44d63517.jpeg -------------------------------------------------------------------------------- /Article/_assets_23/08bd74f1969f4ad3e07239687aace37d1767.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_23/08bd74f1969f4ad3e07239687aace37d1767.png -------------------------------------------------------------------------------- /Article/_assets_23/3e7d68353ecaa9c62720955d1d230ea61665.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_23/3e7d68353ecaa9c62720955d1d230ea61665.png -------------------------------------------------------------------------------- /Article/_assets_23/3f61fa813672068bbdd42947d4d6d6907655.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_23/3f61fa813672068bbdd42947d4d6d6907655.png -------------------------------------------------------------------------------- /Article/_assets_23/616433f141a1a49e76ff6be600dfcde46951.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_23/616433f141a1a49e76ff6be600dfcde46951.png -------------------------------------------------------------------------------- /Article/_assets_23/690785bc58639169df752ca001d82e038823.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_23/690785bc58639169df752ca001d82e038823.png -------------------------------------------------------------------------------- /Article/_assets_23/693f228eb6a69046a950dd8b35992c6f3820.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_23/693f228eb6a69046a950dd8b35992c6f3820.png -------------------------------------------------------------------------------- /Article/_assets_23/860cb5670ca1da633d4f7cd69a9b024a8599.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_23/860cb5670ca1da633d4f7cd69a9b024a8599.png -------------------------------------------------------------------------------- /Article/_assets_23/9008c362571f7ceff9b68a57858707423332.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_23/9008c362571f7ceff9b68a57858707423332.png -------------------------------------------------------------------------------- /Article/_assets_23/b4cacbf211c796ba7ccd9ca8fdfae8905990.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_23/b4cacbf211c796ba7ccd9ca8fdfae8905990.png -------------------------------------------------------------------------------- /Article/_assets_23/b66485d2d34c392a8f599b496a59f0fc3877.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_23/b66485d2d34c392a8f599b496a59f0fc3877.png -------------------------------------------------------------------------------- /Article/_assets_23/c64c33e20b330e6fa3c40a816a2381b77908.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_23/c64c33e20b330e6fa3c40a816a2381b77908.png -------------------------------------------------------------------------------- /Article/_assets_23/fa47478f32c76bf2adee8ad73e206b295695.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_23/fa47478f32c76bf2adee8ad73e206b295695.png -------------------------------------------------------------------------------- /Article/_assets_23/微信图片_20240916205905.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_23/微信图片_20240916205905.jpg -------------------------------------------------------------------------------- /Article/_assets_24/0595862b33c3749fe0addb56298b2e092560.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_24/0595862b33c3749fe0addb56298b2e092560.png -------------------------------------------------------------------------------- /Article/_assets_24/51503d979edc786ef59d17daba088e824447.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_24/51503d979edc786ef59d17daba088e824447.png -------------------------------------------------------------------------------- /Article/_assets_24/a79c8f5b13843a9791737f663c5354e07037.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_24/a79c8f5b13843a9791737f663c5354e07037.png -------------------------------------------------------------------------------- /Article/_assets_24/c64c33e20b330e6fa3c40a816a2381b77908.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_24/c64c33e20b330e6fa3c40a816a2381b77908.png -------------------------------------------------------------------------------- /Article/_assets_25/0595862b33c3749fe0addb56298b2e092560.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_25/0595862b33c3749fe0addb56298b2e092560.png -------------------------------------------------------------------------------- /Article/_assets_25/2c7e201d38f159b6415498665139dd537331.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_25/2c7e201d38f159b6415498665139dd537331.png -------------------------------------------------------------------------------- /Article/_assets_25/425674e586a164f240dbdecc013a29375961.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_25/425674e586a164f240dbdecc013a29375961.png -------------------------------------------------------------------------------- /Article/_assets_25/42f64fbf7955fee4e576103830d0b9362530.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_25/42f64fbf7955fee4e576103830d0b9362530.png -------------------------------------------------------------------------------- /Article/_assets_25/6928ce9343c8d818db850a9a6f510f9a774.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_25/6928ce9343c8d818db850a9a6f510f9a774.png -------------------------------------------------------------------------------- /Article/_assets_25/a5a71662ce7a80f210e94738b801fcf09656.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_25/a5a71662ce7a80f210e94738b801fcf09656.png -------------------------------------------------------------------------------- /Article/_assets_25/f570c80361c53cd8b69d789d1b0a175d6192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/Article/_assets_25/f570c80361c53cd8b69d789d1b0a175d6192.png -------------------------------------------------------------------------------- /Article/番外实战篇1-某电影视全家桶.md: -------------------------------------------------------------------------------- 1 | ![|500](_assets_00/806bdcfee5aaf91ed799d9848e39bc631049.webp) 2 | # 一、课程目标 3 | 借助已学知识完成样本软件的去除签名校验、去广告与更新、布局优化 4 | 5 | # 二、工具 6 | 7 | 1.样本软件 8 | 9 | 2.jadx-gui 10 | 11 | 3.MT管理器/NP管理器 12 | 13 | 4.算法助手 14 | 15 | 5.开发助手 16 | 17 | # 三、课程内容 18 | [《安卓逆向这档事》疑难解答-建议征集贴](https://www.52pojie.cn/thread-1811344-1-1.html) 19 | 20 | [【吾爱破解安卓逆向入门教程《安卓逆向这档事》三、初识smali,vip终结者】](https://www.bilibili.com/video/BV1G8411e7HT/?share_source=copy_web&vd_source=3bc2e3777e91ab913d8a64fe4871a3b1) 21 | 22 | [【【Android逆向】16分钟动画讲解java以及对应的smali代码】 ](https://www.bilibili.com/video/BV1Cp4y157bY/?share_source=copy_web&vd_source=3bc2e3777e91ab913d8a64fe4871a3b1) 23 | 24 | PS:讲得特别好,建议对于smali还不熟悉的朋友可以多看几遍!!! 25 | ## 1.去除广告 26 | 27 | 关键字:initsdk、loadad、initad等 28 | | 广告关键词 | 厂商 | 文档 | 29 | | ----------------------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | 30 | | com.qq.e.ads | 腾讯优量汇广告 | https://developers.adnet.qq.com/doc/android/union/union_splash | 31 | | CSJAD、TTAdSdk、bytedance、pangolin | 穿山甲广告 | https://www.csjplatform.com/supportcenter/5395 | 32 | | ADMob、google.ads | 谷歌广告 | https://developers.google.com/admob/android/app-open?hl=zh-cn#extend | 33 | | TorchAd | 360广告 | https://easydoc.soft.360.cn/doc?project=186589faed863b0a24f15f9bcbafd5c7&doc=2cbbbe19c5cb90f5e7a41c7037b0029a&config=title_menu_toc | 34 | | kwad | 快手广告 | https://u.kuaishou.com/home/help/detail/1334/1370/1310 | 35 | | baidu.mobads | 百度广告 | http://bce.ssp.baidu.com/mssp/sdk/BaiduMobAds_MSSP_bd_SDK_android_v5.1.pdf | 36 | | MimoSdk | 米盟广告 | https://t5.a.market.xiaomi.com/download/AdCenter/0d3a369516ee146e8a9d5c290985939da4624fe0a/AdCenter0d3a369516ee146e8a9d5c290985939da4624fe0a.html | 37 | | sigmob.sdk | sigmob广告 | https://doc.sigmob.com/#/Sigmob%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/SDK%E9%9B%86%E6%88%90%E8%AF%B4%E6%98%8E/Android/SDK%E6%8E%A5%E5%85%A5%E9%85%8D%E7%BD%AE/ | 38 | | TradPlus |TradPlus聚合广告 |https://service.cocos.com/document/zh/tradplusad.html | 39 | 通过免广告关键字来实现部分广告的去除 40 | ```java 41 | public void O(SaiUserInfo saiUserInfo, boolean z) { 42 |         g0.i(BaseApp.getInstance(), saiUserInfo); //获取用户信息 43 |         if (z) { 44 |             v.c().q(SaiSPKey.appToken, saiUserInfo.getToken()); //获取Token 45 |         } 46 |         this.e.set(saiUserInfo); 47 |         this.h.setValue(saiUserInfo.getPic()); //设置用户头像 48 |         if (saiUserInfo.getLogin_type() == 1) { //判断登录状态,并设置用户信息 49 |             this.g.set("点击登录"); 50 |             this.f.set(Boolean.FALSE); 51 |         } else { 52 |             this.g.set(saiUserInfo.getNickname()); 53 |             this.f.set(Boolean.TRUE); 54 |         } 55 |         ObservableField observableField = this.i; 56 |         observableField.set("ID:" + saiUserInfo.getUser_id()); //获取用户ID 57 |         ObservableField observableField2 = this.j; 58 |         observableField2.set(SaiAppUtils.d(saiUserInfo.getInvited_count() + "人")); //获取用户邀请人数 59 |         if (saiUserInfo.getInvited_count() > 0) { 60 |             ObservableField observableField3 = this.k; 61 |             observableField3.set(SaiAppUtils.d(N(saiUserInfo.getInvited_count()) + "天 ")); 62 |         } else { 63 |             this.k.set(SaiAppUtils.d("0天")); 64 |         } 65 |         if (saiUserInfo.getFree_time() * 1000 > System.currentTimeMillis()) { //获取免广告时间 66 |             this.n.set(0); 67 |             this.m.set(d.a(Long.valueOf(saiUserInfo.getFree_time() * 1000))); 68 |             this.l.set("剩余免广告:"); 69 |             BaseApp.getInstance().setFreeTime(saiUserInfo.getFree_time() * 1000); 70 |             return; 71 |         } 72 |         this.l.set("邀请好友获得终身免广告特权"); 73 |         this.n.set(8); 74 |         BaseApp.getInstance().setFreeTime(0L); 75 |     } 76 | ``` 77 | 78 | ```java 79 | public void initData() { 80 | super.initData(); 81 | if (!v.c().b(SaiSPKey.AGREE_PRIVATE, false)) { 82 | ((SaiSplashViewModel) this.viewModel).b(b.s.c.b.a().c(SaiPrivateEvent.class).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer() { // from class: b.l.i.v.d 83 | @Override // io.reactivex.functions.Consumer 84 | public final void accept(Object obj) { 85 | SaiSplashActivity.this.g((SaiPrivateEvent) obj); 86 | } 87 | })); 88 | a0.a.h(this); 89 | return; 90 | } 91 | try { 92 | s.a.d(); //广告SDK初始化 93 | } catch (Exception e2) { 94 | e0.b("===========>>> " + e2.getMessage()); 95 | } 96 | int g2 = v.c().g(SaiSPKey.INSTANCE.getLaunchCount(), 0); 97 | if (g2 != 0) { 98 | if (!v.c().b("extend_java_aa", false)) { 99 | v.c().s("extend_java_aa", true); 100 | g2 = 0; 101 | } 102 | } else { 103 | v.c().s("extend_java_aa", true); 104 | } 105 | if (g2 == 0) { 106 | showLoaddingDialog(); 107 | ((SaiSplashViewModel) this.viewModel).b(b.s.c.b.a().c(SaiAppInitEvent.class).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer() { // from class: b.l.i.v.a 108 | @Override // io.reactivex.functions.Consumer 109 | public final void accept(Object obj) { 110 | SaiSplashActivity.this.i((SaiAppInitEvent) obj); 111 | } 112 | })); 113 | } 114 | g.a.a(g2); 115 | int i2 = g2 + 1; 116 | v.c().m(SaiSPKey.INSTANCE.getLaunchCount(), i2); 117 | c0 c0Var = c0.a; 118 | if (c0Var.f3990g == -1) { 119 | c0Var.f3990g = i2; 120 | } 121 | if (g2 != 0) { 122 | if (NetworkUtils.c()) { 123 | ((SaiSplashViewModel) this.viewModel).n(); 124 | if (c0Var.l("1")) { 125 | showLoaddingDialog(); 126 | SaiSplashAdActivity.invoke(this); 127 | finish(); 128 | } else { 129 | n(b.DELAY); 130 | } 131 | } else { 132 | n(b.NONET); 133 | } 134 | } else { 135 | ((SaiSplashViewModel) this.viewModel).n(); 136 | } 137 | if (i.c(d.f().toString(), c0Var.f3986c).equals(c0Var.j(R.string.app_cudgel))) { 138 | return; 139 | } 140 | e0.b("===========>>> app kill app_cudgel"); 141 | System.exit(0); 142 | } 143 | ``` 144 | 145 | 赋值参考第六课52:08 146 | ```java 147 | .method public getFree_time()J 148 | .registers 3 149 | 150 | .line 1 151 | iget-wide v0, p0, Lcom/pencil/saibeans/SaiUserInfo;->free_time:J 152 | 153 | const-wide v0, 0x32d57bf5e8L 154 | 155 | return-wide v0 156 | .end method 157 | ``` 158 | 159 | ## 2.去除签名校验 160 | [吾爱破解安卓逆向入门教程《安卓逆向这档事》六、校验的N次方-签名校验对抗、PM代理、IO重定向](https://www.bilibili.com/video/BV1X24y1m7cj/?share_source=copy_web&vd_source=3bc2e3777e91ab913d8a64fe4871a3b1) 161 | 162 | 1.核心破解,免签名安装 163 | 164 | 2.一键去签名工具 165 | 166 | [[实战破解]白描-动态代{过}{滤}理Hook签名校验](https://www.52pojie.cn/thread-1526854-1-1.html) 167 | 168 | 3.手动分析签名校验 169 | ```java 170 | .method public static f()Ljava/util/List; 171 | .registers 2 172 | .annotation build Landroidx/annotation/NonNull; 173 | .end annotation 174 | 175 | .annotation system Ldalvik/annotation/Signature; 176 | value = { 177 | "()", 178 | "Ljava/util/List<", 179 | "Ljava/lang/String;", 180 | ">;" 181 | } 182 | .end annotation 183 | 184 | .line 1 185 | new-instance v0, Ljava/util/ArrayList; 186 | 187 | invoke-direct {v0}, Ljava/util/ArrayList;->()V 188 | 189 | const-string v1, "F9:6C:E9:5F:D5:47:BE:DF:81:15:E3:71:8A:10:54:45" 190 | #创建了一个新的 ArrayList 实例,然后向列表中添加了一个字符串常量 "F9:6C:E9:5F:D5:47:BE:DF:81:15:E3:71:8A:10:54:45" 191 | 192 | invoke-virtual {v0, v1}, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z 193 | 194 | 195 | return-object v0 196 | .end method 197 | 198 | ``` 199 | 200 | ![](_assets_00/7462852ab6eb72614bcf04006c7899b8889.webp) 201 | 202 | ## 3. 去除更新弹窗 203 | ```java 204 | public static boolean a(boolean z, SaiUpgradeInfo saiUpgradeInfo) { 205 |         if (!a.b.b() && saiUpgradeInfo != null) { 206 |             try { 207 |              //获取版本号进行对比 208 |                 if (saiUpgradeInfo.getVersion_code() >= b.c.a.b.d.i()) { 209 |                     boolean b2 = v.c().b(SaiSPKey.INSTANCE.getUpgrade_dialog(), false); 210 |                     if (z || !b2) { 211 |                         if (saiUpgradeInfo.getIs_same() == 1) { 212 |                             v c = v.c(); 213 |                             if (!c.b("appUpgrade_" + saiUpgradeInfo.getVersion_code(), false)) { 214 |                                 new d(b.c.a.b.a.h(), saiUpgradeInfo).show(); 215 |                                 v c2 = v.c(); 216 |                                 c2.s("appUpgrade_" + saiUpgradeInfo.getVersion_code(), true); 217 |                                 return true; 218 |                             } 219 |                         } else if (saiUpgradeInfo.getVersion_code() > b.c.a.b.d.i()) { 220 |                             new d(b.c.a.b.a.h(), saiUpgradeInfo).show(); 221 |                             return true; 222 |                         } else if (z) { 223 |                             ToastUtils.v("已经是最新版本"); 224 |                         } 225 |                         e0.b("========>>> 包升级更新:${it.url}"); 226 |                     } 227 |                 } else if (z) { 228 |                     ToastUtils.v("已经是最新版本"); 229 |                 } 230 |             } catch (Exception unused) { 231 |             } 232 |         } 233 |         return false; 234 |     } 235 | ``` 236 | ## 4.布局优化 237 | [【吾爱破解安卓逆向入门教程《安卓逆向这档事》四、恭喜你获得广告&弹窗静默卡】](https://www.bilibili.com/video/BV14v4y1D7yA/?share_source=copy_web&vd_source=3bc2e3777e91ab913d8a64fe4871a3b1) 238 | 239 | 1.修改xml中的属性值 240 | | 元素名称 | 属性名称 | 描述 | 241 | | --- | --- | --- | 242 | | LinearLayout | android:gravity | 设置布局内部元素的位置,这里设置为中心和左对齐 | 243 | | LinearLayout | android:orientation | 设置 `LinearLayout` 的方向,这里设置为水平 | 244 | | LinearLayout | android:tag | 为视图设置标签,这里设置为 "binding_13" | 245 | | LinearLayout | android:background | 设置背景图片,这里引用了名为 "sai_sp_stroke_divider" 的资源 | 246 | | LinearLayout | android:paddingLeft | 设置左填充距离,这里引用了名为 "dp_15" 的资源 | 247 | | LinearLayout | android:paddingTop | 设置顶部填充距离,这里设置为 10dp | 248 | | LinearLayout | android:paddingBottom | 设置底部填充距离,这里设置为 10dp | 249 | | LinearLayout | android:visibility | 设置视图可见性,这里设置为 "gone" | 250 | | LinearLayout | android:layout_width | 设置布局宽度,这里设置为 0dp | 251 | | LinearLayout | android:layout_height | 设置布局高度,这里设置为包裹内容 | 252 | | LinearLayout | android:layout_marginRight | 设置右边距,这里引用了名为 "dp_8" 的资源 | 253 | | LinearLayout | android:layout_weight | 设置布局权重,这里设置为 1.0 | 254 | | LinearLayout | android:paddingVertical | 设置垂直方向的填充距离,这里设置为 10dp | 255 | | ImageView | android:layout_width | 设置图片视图宽度,这里引用了名为 "dp_32" 的资源 | 256 | | ImageView | android:layout_height | 设置图片视图高度,这里引用了名为 "dp_32" 的资源 | 257 | | ImageView | android:src | 设置图片资源,这里引用了名为 "icon_mine_invitecode" 的资源 | 258 | | TextView | android:textSize | 设置文本字体大小,这里引用了名为 "sp_14" 的资源 | 259 | | TextView | android:textColor | 设置文本颜色,这里引用了名为 "common_h0" 的资源 | 260 | | TextView | android:layout_width | 设置文本视图宽度,这里设置为包裹内容 | 261 | | TextView | android:layout_height | 设置文本视图高度,这里设置为包裹内容 | 262 | | TextView | android:layout_marginLeft | 设置左边距,这里引用了名为 "dp_10" 的资源 | 263 | | TextView | android:text | 设置文本内容,这里设置为 "填写邀请码" | 264 | 265 | ```xml 266 | android:visibility="gone" 267 | ``` 268 | 2.上帝模式优化布局 269 | 270 | [[白嫖大法]某影视邀请协议分析](https://www.52pojie.cn/thread-1452996-1-1.html) 271 | 272 | # 四、课后小作业 273 | 274 | 完成剩余布局的优化并截图回复 275 | 276 | # 六、视频及课件地址 277 | 278 | 279 | [百度云](https://pan.baidu.com/s/1cFWTLn14jeWfpXxlx3syYw?pwd=nqu9) 280 | 281 | [阿里云](https://www.aliyundrive.com/s/TJoKMK6du6x) 282 | 283 | [哔哩哔哩](https://www.bilibili.com/video/BV1wT411N7sV/?spm_id_from=333.788&vd_source=6dde16dc6479f00694baaf73a2225452) 284 | 285 | PS:解压密码都是52pj,阿里云由于不能分享压缩包,所以下载exe文件,双击自解压 286 | 287 | # 七、其他章节 288 | 289 | [《安卓逆向这档事》一、模拟器环境搭建](https://www.52pojie.cn/thread-1695141-1-1.html) 290 | [《安卓逆向这档事》二、初识APK文件结构、双开、汉化、基础修改](https://www.52pojie.cn/thread-1695796-1-1.html) 291 | [《安卓逆向这档事》三、初识smail,vip终结者](https://www.52pojie.cn/thread-1701353-1-1.html)   292 | [《安卓逆向这档事》四、恭喜你获得广告&弹窗静默卡](https://www.52pojie.cn/thread-1706691-1-1.html) 293 | [《安卓逆向这档事》五、1000-7=?&动态调试&Log插桩](https://www.52pojie.cn/thread-1714727-1-1.html) 294 | [《安卓逆向这档事》六、校验的N次方-签名校验对抗、PM代{过}{滤}理、IO重定向](https://www.52pojie.cn/thread-1731181-1-1.html) 295 | [《安卓逆向这档事》七、Sorry,会Hook真的可以为所欲为-Xposed快速上手(上)模块编写,常用Api](https://www.52pojie.cn/thread-1740944-1-1.html) 296 | [《安卓逆向这档事》八、Sorry,会Hook真的可以为所欲为-xposed快速上手(下)快速hook](https://www.52pojie.cn/thread-1748081-1-1.html) 297 | [《安卓逆向这档事》九、密码学基础、算法自吐、非标准加密对抗](https://www.52pojie.cn/thread-1762225-1-1.html) 298 | [《安卓逆向这档事》十、不是我说,有了IDA还要什么女朋友?](https://www.52pojie.cn/thread-1787667-1-1.html) 299 | [《安卓逆向这档事》十二、大佬帮我分析一下](https://www.52pojie.cn/thread-1809646-1-1.html) 300 | [《安卓逆向这档事》番外实战篇1-某电影视全家桶](https://www.52pojie.cn/thread-1814917-1-1.html) 301 | [《安卓逆向这档事》十三、是时候学习一下Frida一把梭了(上)](https://www.52pojie.cn/thread-1823118-1-1.html) 302 | [《安卓逆向这档事》十四、是时候学习一下Frida一把梭了(中)](https://www.52pojie.cn/thread-1838539-1-1.html) 303 | -------------------------------------------------------------------------------- /Article/番外实战篇3-拨云见日之浅谈Flutter逆向.md: -------------------------------------------------------------------------------- 1 | ![图片|800](_assets_21/01c867a0f9c7aa12547fff13d7da37233297.png) 2 | # 一、课程目标 3 | 1.了解Flutter基本概念以及识别特征 4 | 2.了解Flutter应用的抓包对抗策略 5 | 3.了解Flutter反编译以及实战 6 | # 二、工具 7 | 8 | 1.某读app 9 | 2.proxypin 10 | 3.blutter 11 | # 三、课程内容 12 | ## 1.Flutter简介 13 | Flutter是Google构建在开源的Dart VM之上,使用Dart语言开发的移动应用开发框架,可以帮助开发者使用一套Dart代码就能快速在移动iOS 、Android上构建高质量的原生用户界面,同时还支持开发Web和桌面应用。 14 | `Flutter`引擎是一个用于**高质量跨平台应用的可移植运行时,由**`C/C++`**编写**。它实现了`Flutter`的核心库,包括动画和图形、文件和网络I/O、辅助功能支持、插件架构,以及用于开发、编译和运行`Flutter`应用程序的`Dart`**运行时**和工具链。引擎将底层`C++`代码包装成 `Dart`代码,通过`dart:ui`暴露给 `Flutter`框架层。 15 | [flutter开源地址](https://github.com/flutter/flutter) 16 | [flutter官网](https://flutter.dev/) 17 | ![](_assets_21/fd5f2e774a73c9cab41771670ddd44d63517.jpeg) 18 | 19 | [[原创]Flutter概述和逆向技术发展时间线,带你快速了解](https://bbs.kanxue.com/thread-274981.htm) 20 | ## 2.Flutter特征 21 | 在逆向分析前,我们首先要确定测试目标是否用Flutter开发的。当使用Flutter构建Android APP时,在assets文件夹下会有dexopt和flutter_assets两个文件夹 22 | ![图片](_assets_21/10412680bca1b1eb36f35b94753359722389.png) 23 | lib文件夹会有两个so文件:libapp.so和libflutter.so(flutter动态链接库,与实际业务代码无关) 24 | ![图片](_assets_21/327705fdbf6c6e9174662278103993333896.png) 25 | 26 | ## 3.Flutter抓包对抗 27 | `原理:` 28 | 1. **Dart语言标准库的网络请求不走Wi-Fi代理**:Flutter使用的是Dart语言,其标准库中的网络请求不会通过代理发送,这与许多其他应用不同。常规的抓包工具通常依赖于代理来捕获网络流量,因此无法捕获Flutter应用的网络请求。 29 | 2. **Dart SDK中的证书信任**:Dart SDK在Android平台上强制只信任系统目录下的证书。这意味着Flutter应用不会信任用户安装的证书,除非这些证书位于Android系统的`/system/etc/security/cacerts`目录中。这是通过Dart源码中的`runtime/bin/security_context_linux.cc`文件实现的。 30 | 31 | 通过分析Flutter应用程序抛出的错误,可以定位到触发错误的源代码位置,错误指向了`handshake.cc:352`,这是一个处理SSL握手的源代码位置。 32 | ``` 33 | E/flutter (10371): [ERROR:flutter/runtime/dart_isolate.cc(805)] Unhandled exception: 34 |  E/flutter (10371): HandshakeException: Handshake error in client (OS Error: 35 |  E/flutter (10371):  NO_START_LINE(pem_lib.c:631) 36 |  E/flutter (10371):  PEM routines(by_file.c:146) 37 |  E/flutter (10371):  NO_START_LINE(pem_lib.c:631) 38 |  E/flutter (10371):  PEM routines(by_file.c:146) 39 |  E/flutter (10371):  CERTIFICATE_VERIFY_FAILED: self signed certificate in certificate chain(handshake.cc:352)) 40 | ``` 41 | 为了绕过SSL验证,需要找到一个合适的hook点,即源代码中可以被拦截和修改以改变程序行为的位置。`ssl_verify_peer_cert`函数是一个可能的hook点,但经过测试,仅仅修改这个函数的返回值并不能成功绕过SSL验证。 42 | 进一步分析源代码后,发现`session_verify_cert_chain`函数可以作为另一个hook点。这个函数在验证证书链时,如果证书验证失败,会返回一个错误。 43 | ```C 44 | ret = ssl->ctx->x509_method->session_verify_cert_chain( 45 |               hs->new_session.get(), hs, &alert) 46 |               ? ssl_verify_ok 47 |               : ssl_verify_invalid; 48 | ``` 49 | session_verify_cert_chain函数定义在ssl_x509.cc,在该方法里可以看到有`ssl_client和ssl_server`两个字符串可以辅助定位方法 50 | ![图片](_assets_21/4e90d681954f292f3d0d1fa449a283826951.png) 51 | 52 | ### 1.hook_ssl_client 53 | 在libflutter.so里搜索`ssl_client`定位到方法,内存搜刮函数前10字节定位,在运行时将返回函数改为true即可绕过证书链检查实现抓包(这里以64位的so为例) 54 | ![图片](_assets_21/fc153f6ac1c211d8585b54ec7aed6f106586.png) 55 | 56 | ```js 57 | function hook_dlopen() { 58 | var android_dlopen_ext = Module.findExportByName(null, "android_dlopen_ext"); 59 | Interceptor.attach(android_dlopen_ext, { 60 | onEnter: function (args) { 61 | var so_name = args[0].readCString(); 62 | if (so_name.indexOf("libflutter.so") >= 0) this.call_hook = true; 63 | }, onLeave: function (retval) { 64 | if (this.call_hook) hookFlutter(); 65 | } 66 | }); 67 | } 68 | 69 | function hook_ssl_verify_result(address) { 70 | Interceptor.attach(address, { 71 | onEnter: function(args) { 72 | console.log("Disabling SSL validation") 73 | }, 74 | onLeave: function(retval) { 75 | console.log("Retval: " + retval); 76 | retval.replace(0x1); 77 | } 78 | }); 79 | } 80 | function hookFlutter() { 81 | var m = Process.findModuleByName("libflutter.so"); 82 | //利用函数前10字节定位 83 | var pattern = "FF C3 01 D1 FD 7B 01 A9 FC 6F 02 A9FA 67 03 A9 F8 5F 04 A9 F6 57 05 A9 F4 4F 06 A9 08 0A 80 52 48 00 00 39"; 84 | var res = Memory.scan(m.base, m.size, pattern, { 85 | onMatch: function(address, size){ 86 | console.log('[+] ssl_verify_result found at: ' + address.toString()); 87 | // Add 0x01 because it's a THUMB function 88 | // Otherwise, we would get 'Error: unable to intercept function at 0x9906f8ac; please file a bug' 89 | hook_ssl_verify_result(address); 90 | }, 91 | onError: function(reason){ 92 | console.log('[!] There was an error scanning memory'); 93 | }, 94 | onComplete: function() { 95 | console.log("All done") 96 | } 97 | }); 98 | } 99 | 100 | ``` 101 | 102 | ### 2.reflutter之patch 103 | [reFlutter开源地址](https://github.com/Impact-I/reFlutter) 104 | ![图片](_assets_21/ccffa5dc15c369ef1db76ef41a13bb903741.png) 105 | 1.pip3 install reflutter pip安装对应的库 106 | 2.输入命令:reflutter flutter.apk 107 | 选择1流量监控和拦截,输入PC端的IP地址后(cmd窗口输入ipconfig),将获取到release.RE.apk,但此apk尚未签名,需要我们手动签名(输入命令的过程需要全局代理) 108 | ![图片](_assets_21/cea0767af148752ed9b8fbee9084b9c53235.png) 109 | 110 | 3.使用MT管理器或者uber-apk-signer.jar签名,输入命令:_java -jar uber-apk-signer-1.2.1.jar --apk release.RE.apk_。然后将重签名的apk安装到真机或者模拟器上。 111 | 4.设置BurpSuite的代理,端口为8083,绑定所有地址,并且勾选All interfaces,使非代理意识的客户端直接连接到侦听器。 112 | [BurpSuitePro-2.1](https://github.com/TrojanAZhen/BurpSuitePro-2.1) 113 | ![图片](_assets_21/220f891dcbe0141f943329092d824e8f4823.png) 114 | ![图片](_assets_21/55c4c46ec2a7069adba004a951b6155f8883.png) 115 | 5.设置Drony的wifi代理主机名端口和BurpSuite一致,然后触发app就能抓到包了 116 | ![图片](_assets_21/eb0b10801f015a40537d6a47f65a81e64424.png) 117 | 118 | ### 3.Reqable&proxyPin(推荐) 119 | Reqable或者proxyPin直接抓包即可(工具下载看上一课) 120 | ![图片](_assets_21/b1f52f35ce477799124866bf8c2f03665392.png) 121 | ![图片](_assets_21/acbec70f90e02bc9b22e03329310dced8210.png) 122 | 123 | ## 4.Flutter反编译 124 | ### 1.快照 125 | 使用`readelf -s`命令读取保存快照信息的`libapp.so`将会输出下面的内容 126 | ``` 127 | Symbol table '.dynsym' contains 6 entries: 128 | Num: Value Size Type Bind Vis Ndx Name 129 | 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 130 | 1: 000000000014c000 29728 OBJECT GLOBAL DEFAULT 7 _kDartVmSnapshotInstructi 131 | 2: 0000000000153440 0x22bd30 OBJECT GLOBAL DEFAULT 7 _kDartIsolateSnapshotInst 132 | 3: 0000000000000200 15248 OBJECT GLOBAL DEFAULT 2 _kDartVmSnapshotData 133 | 4: 0000000000003dc0 0x147af0 OBJECT GLOBAL DEFAULT 2 _kDartIsolateSnapshotData 134 | 5: 00000000000001c8 32 OBJECT GLOBAL DEFAULT 1 _kDartSnapshotBuildId 135 | ``` 136 | “快照”指的是 Flutter 应用在编译过程中生成的特定数据结构,用于加速应用的启动和运行。具体来说,快照包括四种类型: 137 | - **`_kDartVmSnapshotData`**: 代表 isolate 之间共享的 Dart 堆 (heap) 的初始状态。有助于更快地启动 Dart isolate,但不包含任何 isolate 专属的信息。 138 | 139 | - **`_kDartVmSnapshotInstructions`**:包含 VM 中所有 Dart isolate 之间共享的通用例程的 AOT 指令。这种快照的体积通常非常小,并且大多会包含程序桩 (stub)。 140 | 141 | - **`_kDartIsolateSnapshotData`**:代表 Dart 堆的初始状态,并包含 isolate 专属的信息。 142 | 143 | - **`_kDartIsolateSnapshotInstructions`**:包含由 Dart isolate 执行的 AOT 代码。 144 | 145 | 其中`_kDartIsolateSnapshotInstructions`是最为重要的,因为包含了所有要执行的AOT代码,即业务相关的代码。 146 | 147 | ### 2.逆向方法 148 | 1.(静态)解析libapp.so,即写一个解析器,将libapp.so中的快照数据按照其既定格式进行解析,获取业务代码的类的各种信息,包括类的名称、其中方法的偏移等数据,从而辅助逆向工作。 149 | 关于Flutter快照的具体刨析只需要看下面引用的两篇文章 150 | [Reverse engineering Flutter apps (Part 1) (tst.sh)](https://blog.tst.sh/reverse-engineering-flutter-apps-part-1/) 151 | [Reverse engineering Flutter apps (Part 2) (tst.sh)](https://blog.tst.sh/reverse-engineering-flutter-apps-part-2/) 152 | 2.(动态)编译修改过的`libflutter.so`并且重新打包到APK中,在启动APP的过程中,由修改过的引擎动态链接库将快照数据获取并且保存。 153 | 154 | PS:不同版本的Dart引擎其快照格式不同,所以静态的方法就需要频繁跟着版本更新迭代,成本极高,而动态也需要重新编译对应版本的链接库。同时如果APP作者抹除版本信息和hash信息,则无从下手,且重打包APK极易被检测到。 155 | 156 | 静态方法推荐工具:[blutter](https://github.com/worawit/blutter) 157 | 动态方法推荐工具:[reFlutter](https://github.com/Impact-I/reFlutter) 158 | 159 | ### 3.blutter实战 160 | 环境:python3.10 161 | 1.首先安装git 162 | [下载地址](https://git-scm.com/downloads) 163 | ![图片|500](_assets_21/7ee730055cad5f62a71757086a60393e6576.png) 164 | 2.下载visual studio 165 | [下载地址](https://visualstudio.microsoft.com/zh-hans/) 166 | ![图片|500](_assets_21/2fe64e3f49905acfb778c9e768d877903919.png) 167 | 3.下载安装,在工作负荷里勾选"使用C++的桌面开发" 168 | ![图片](_assets_21/0a9a2100cf372797d71d6eef020f20995509.png) 169 | 170 | 4.clone项目(全程运行在代理环境否则会导致无法下载),或者下载解压到指定文件夹 171 | ``` 172 | git clone https://github.com/worawit/blutter --depth=1 173 | ``` 174 | 5.进入到blutter文件夹,cmd窗口运行初始化脚本 175 | ``` 176 | python .\scripts\init_env_win.py 177 | ``` 178 | ![图片](_assets_21/270791dea38b7180e01545da7451c4838629.png) 179 | 6.要打开`x64 Native Tools Command Prompt`,它可以在`Visual Studio`文件夹中找到 180 | ![图片](_assets_21/46ae4e01cb09f73cdcc08aa9d186a59f4749.png) 181 | 7.把需要反编译的flutterapp用压缩包打开,提取v8a里的`libflutter.so`和`libapp.so`(现在基本上是64位)解压到blutter文件夹,并创建一个输出结果的文件夹 182 | ![图片](_assets_21/2c99b38732db09c7c53ff41c01558c829480.png) 183 | 8.在刚才打开的x64窗口运行下面的命令(全局代理!),等待运行完后会在output文件下生成一些脚本信息 184 | PS:blutter目前支持最新的版本的dart快照解析,如果这个跑不起来可以参考第四步手动配置 185 | ``` 186 | python blutter.py .\arm64-v8a\ .\output 187 | ``` 188 | ![图片](_assets_21/8d1507667471fd97a56535605ee2f8394322.png) 189 | ![图片](_assets_21/cca5d2acd5a5489d4deabe0a8cb1075c7230.png) 190 | ``` 191 | asm 对dart语言的反编译结果,里面有很多dart源代码的对应偏移 192 | ida_script so文件的符号表还原脚本 193 | blutter_frida.js目标应用程序的 frida 脚本模板 194 | objs.txt对象池中对象的完整(嵌套)转储,对象池里面的方法和相应的偏移量 195 | pp.txt对象池中的所有 Dart 对象 196 | 197 | ``` 198 | 199 | 9.接下来ida加载libapp.so,然后ida左上角点击file,再点击Script file加载符号解析脚本 200 | ![图片](_assets_21/b3c57e78ebf7c0f4b78a7455d2d8202c9612.png) 201 | 10.至此可以看到so里的相关函数以显现 202 | ![图片](_assets_21/b558f9e5955df257c7a69fdf2674a32b7773.png) 203 | `协议实现:` 204 | ```python 205 | import hashlib 206 | import base64 207 | import requests 208 | 209 | headers = { 210 | 'user-agent': 'Dart/3.1 (dart:io)', 211 | 'content-type': 'application/json; charset=utf-8', 212 | 'accept-encoding': 'gzip', 213 | 'host': 'api.mandu.pro', 214 | 'Content-Length': '98', 215 | } 216 | def hash_and_encode(input_string): 217 | sha256_hash = hashlib.sha256() 218 | sha256_hash.update(input_string.encode('utf-8')) 219 | hash_bytes = sha256_hash.digest() 220 | base64_encoded = base64.b64encode(hash_bytes).decode('utf-8') 221 | return base64_encoded 222 | 223 | input_string = "md123456" 224 | result = hash_and_encode(input_string) 225 | 226 | json_data = { 227 | 'account': 'xxx@qq.com', 228 | 'type': 1, 229 | 'password': result, 230 | } 231 | 232 | response = requests.post('https://api.xxx.pro/user/session', headers=headers, json=json_data) 233 | print(response.text) 234 | ``` 235 | # 六、视频及课件地址 236 | 237 | 238 | [百度云](https://pan.baidu.com/s/1cFWTLn14jeWfpXxlx3syYw?pwd=nqu9) 239 | [阿里云](https://www.aliyundrive.com/s/TJoKMK6du6x) 240 | [哔哩哔哩](https://www.bilibili.com/video/BV1wT411N7sV/?spm_id_from=333.788&vd_source=6dde16dc6479f00694baaf73a2225452) 241 | [教程开源地址](https://github.com/ZJ595/AndroidReverse) 242 | PS:解压密码都是52pj,阿里云由于不能分享压缩包,所以下载exe文件,双击自解压 243 | 244 | # 七、其他章节 245 | [《安卓逆向这档事》一、模拟器环境搭建](https://www.52pojie.cn/thread-1695141-1-1.html) 246 | [《安卓逆向这档事》二、初识APK文件结构、双开、汉化、基础修改](https://www.52pojie.cn/thread-1695796-1-1.html) 247 | [《安卓逆向这档事》三、初识smail,vip终结者](https://www.52pojie.cn/thread-1701353-1-1.html) 248 | [《安卓逆向这档事》四、恭喜你获得广告&弹窗静默卡](https://www.52pojie.cn/thread-1706691-1-1.html) 249 | [《安卓逆向这档事》五、1000-7=?&动态调试&Log插桩](https://www.52pojie.cn/thread-1714727-1-1.html) 250 | [《安卓逆向这档事》六、校验的N次方-签名校验对抗、PM代{过}{滤}理、IO重定向](https://www.52pojie.cn/thread-1731181-1-1.html) 251 | [《安卓逆向这档事》七、Sorry,会Hook真的可以为所欲为-Xposed快速上手(上)模块编写,常用Api](https://www.52pojie.cn/thread-1740944-1-1.html) 252 | [《安卓逆向这档事》八、Sorry,会Hook真的可以为所欲为-xposed快速上手(下)快速hook](https://www.52pojie.cn/thread-1748081-1-1.html) 253 | [《安卓逆向这档事》九、密码学基础、算法自吐、非标准加密对抗](https://www.52pojie.cn/thread-1762225-1-1.html) 254 | [《安卓逆向这档事》十、不是我说,有了IDA还要什么女朋友?](https://www.52pojie.cn/thread-1787667-1-1.html) 255 | [《安卓逆向这档事》十二、大佬帮我分析一下](https://www.52pojie.cn/thread-1809646-1-1.html) 256 | [《安卓逆向这档事》番外实战篇1-某电影视全家桶](https://www.52pojie.cn/thread-1814917-1-1.html) 257 | [《安卓逆向这档事》十三、是时候学习一下Frida一把梭了(上)](https://www.52pojie.cn/thread-1823118-1-1.html) 258 | [《安卓逆向这档事》十四、是时候学习一下Frida一把梭了(中)](https://www.52pojie.cn/thread-1838539-1-1.html) 259 | [《安卓逆向这档事》十五、是时候学习一下Frida一把梭了(下)](https://www.52pojie.cn/thread-1840174-1-1.html) 260 | [《安卓逆向这档事》十六、是时候学习一下Frida一把梭了(终)](https://www.52pojie.cn/thread-1859820-1-1.html#/) 261 | [《安卓逆向这档事》十七、你的RPCvs佬的RPC](https://www.52pojie.cn/thread-1892127-1-1.html#/) 262 | [《安卓逆向这档事》番外实战篇2-【2024春节】解题领红包活动,启动!](https://www.52pojie.cn/thread-1893708-1-1.html#/) 263 | [《安卓逆向这档事》十八、表哥,你也不想你的Frida被检测吧!(上)](https://www.52pojie.cn/thread-1921073-1-1.html) 264 | [《安卓逆向这档事》十九、表哥,你也不想你的Frida被检测吧!(下)](https://www.52pojie.cn/thread-1938862-1-1.html) 265 | [《安卓逆向这档事》二十、抓包学得好,牢饭吃得饱(上)](https://www.52pojie.cn/thread-1945285-1-1.html) 266 | # 八、参考文档 267 | [[原创]Flutter概述和逆向技术发展时间线,带你快速了解](https://bbs.kanxue.com/thread-274981.htm) 268 | [blutter](https://github.com/worawit/blutter) 269 | [reFlutter](https://github.com/Impact-I/reFlutter) 270 | [[翻译]Flutter 逆向初探](https://bbs.kanxue.com/thread-275953.htm) 271 | [[原创]一种基于frida和drony的针对flutter抓包的方法](https://bbs.kanxue.com/thread-261941.htm) 272 | [Android-Flutter逆向](https://blog.lleavesg.top/article/Flutter-Reverse#9a5b45b33a1549a9a8d19f7fcc75384f) 273 | [Flutter Android APP 逆向系列 (一)](https://dawnnnnnn.com/2024/06/:/day/Flutter%20Android%20APP%E9%80%86%E5%90%91/) 274 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AndroidReverse 2 | 《安卓逆向这档事》 3 | 4 | 5 | 路过的师傅们,帮忙点个小星星! 6 | # 在线观看 7 | 8 | [![](_assets/9fa626afac76ce38386a510dc71a78682196.webp)](https://www.bilibili.com/video/BV1wT411N7sV/) 9 | 10 | # 目录 11 | 12 | [01第一课、模拟器环境搭建](https://github.com/ZJ595/AndroidReverse/blob/main/Article/01%E7%AC%AC%E4%B8%80%E8%AF%BE%E3%80%81%E6%A8%A1%E6%8B%9F%E5%99%A8%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA.md) 13 | [02第二课、初识APK文件结构、双开、汉化、基础修改](https://github.com/ZJ595/AndroidReverse/blob/main/Article/02%E7%AC%AC%E4%BA%8C%E8%AF%BE%E3%80%81%E5%88%9D%E8%AF%86APK%E6%96%87%E4%BB%B6%E7%BB%93%E6%9E%84%E3%80%81%E5%8F%8C%E5%BC%80%E3%80%81%E6%B1%89%E5%8C%96%E3%80%81%E5%9F%BA%E7%A1%80%E4%BF%AE%E6%94%B9.md) 14 | [03第三课、初识smali,vip终结者,一键三连](https://github.com/ZJ595/AndroidReverse/blob/main/Article/03%E7%AC%AC%E4%B8%89%E8%AF%BE%E3%80%81%E5%88%9D%E8%AF%86smali%EF%BC%8Cvip%E7%BB%88%E7%BB%93%E8%80%85%EF%BC%8C%E4%B8%80%E9%94%AE%E4%B8%89%E8%BF%9E.md) 15 | [04第四课、恭喜你获得广告&弹窗静默卡](https://github.com/ZJ595/AndroidReverse/blob/main/Article/04%E7%AC%AC%E5%9B%9B%E8%AF%BE%E3%80%81%E6%81%AD%E5%96%9C%E4%BD%A0%E8%8E%B7%E5%BE%97%E5%B9%BF%E5%91%8A%26%E5%BC%B9%E7%AA%97%E9%9D%99%E9%BB%98%E5%8D%A1.md) 16 | [05第五课、Jeb动态调试,Log插桩](https://github.com/ZJ595/AndroidReverse/blob/main/Article/05%E7%AC%AC%E4%BA%94%E8%AF%BE%E3%80%81Jeb%E5%8A%A8%E6%80%81%E8%B0%83%E8%AF%95%EF%BC%8CLog%E6%8F%92%E6%A1%A9.md) 17 | [06第六课、校验的N次方-签名校验对抗的多种姿势、PM代理、IO重定向](https://github.com/ZJ595/AndroidReverse/blob/main/Article/06%E7%AC%AC%E5%85%AD%E8%AF%BE%E3%80%81%E6%A0%A1%E9%AA%8C%E7%9A%84N%E6%AC%A1%E6%96%B9-%E7%AD%BE%E5%90%8D%E6%A0%A1%E9%AA%8C%E5%AF%B9%E6%8A%97%E7%9A%84%E5%A4%9A%E7%A7%8D%E5%A7%BF%E5%8A%BF%E3%80%81PM%E4%BB%A3%E7%90%86%E3%80%81IO%E9%87%8D%E5%AE%9A%E5%90%91.md) 18 | [07第七课、Sorry,会Hook真的可以为所欲为-Xposed快速上手(上)模块编写,Api详解](https://github.com/ZJ595/AndroidReverse/blob/main/Article/07%E7%AC%AC%E4%B8%83%E8%AF%BE%E3%80%81Sorry%EF%BC%8C%E4%BC%9AHook%E7%9C%9F%E7%9A%84%E5%8F%AF%E4%BB%A5%E4%B8%BA%E6%89%80%E6%AC%B2%E4%B8%BA-Xposed%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B(%E4%B8%8A)%E6%A8%A1%E5%9D%97%E7%BC%96%E5%86%99%EF%BC%8CApi%E8%AF%A6%E8%A7%A3.md) 19 | [08第八课、不好意思,会Hook真的可以为所欲为-xposed快速上手(下)常用Api,免root与快速Hook](https://github.com/ZJ595/AndroidReverse/blob/main/Article/08%E7%AC%AC%E5%85%AB%E8%AF%BE%E3%80%81%E4%B8%8D%E5%A5%BD%E6%84%8F%E6%80%9D%EF%BC%8C%E4%BC%9AHook%E7%9C%9F%E7%9A%84%E5%8F%AF%E4%BB%A5%E4%B8%BA%E6%89%80%E6%AC%B2%E4%B8%BA-xposed%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B(%E4%B8%8B)%E5%B8%B8%E7%94%A8Api%EF%BC%8C%E5%85%8Droot%E4%B8%8E%E5%BF%AB%E9%80%9FHook.md) 20 | [09第九课、密码学基础、算法自吐、非标准加密对抗](https://github.com/ZJ595/AndroidReverse/blob/main/Article/09%E7%AC%AC%E4%B9%9D%E8%AF%BE%E3%80%81%E5%AF%86%E7%A0%81%E5%AD%A6%E5%9F%BA%E7%A1%80%E3%80%81%E7%AE%97%E6%B3%95%E8%87%AA%E5%90%90%E3%80%81%E9%9D%9E%E6%A0%87%E5%87%86%E5%8A%A0%E5%AF%86%E5%AF%B9%E6%8A%97.md) 21 | [10第十课、不是我说,有了IDA还要什么女朋友?](https://github.com/ZJ595/AndroidReverse/blob/main/Article/10%E7%AC%AC%E5%8D%81%E8%AF%BE%E3%80%81%E4%B8%8D%E6%98%AF%E6%88%91%E8%AF%B4%EF%BC%8C%E6%9C%89%E4%BA%86IDA%E8%BF%98%E8%A6%81%E4%BB%80%E4%B9%88%E5%A5%B3%E6%9C%8B%E5%8F%8B%EF%BC%9F.md) 22 | [12第十二课、大佬帮我分析一下](https://github.com/ZJ595/AndroidReverse/blob/main/Article/12%E7%AC%AC%E5%8D%81%E4%BA%8C%E8%AF%BE%E3%80%81%E5%A4%A7%E4%BD%AC%E5%B8%AE%E6%88%91%E5%88%86%E6%9E%90%E4%B8%80%E4%B8%8B.md) 23 | [番外实战篇1-某电影视全家桶](https://github.com/ZJ595/AndroidReverse/blob/main/Article/%E7%95%AA%E5%A4%96%E5%AE%9E%E6%88%98%E7%AF%871-%E6%9F%90%E7%94%B5%E5%BD%B1%E8%A7%86%E5%85%A8%E5%AE%B6%E6%A1%B6.md) 24 | [13第十三课、是时候学习一下Frida一把梭了(上)](https://github.com/ZJ595/AndroidReverse/blob/main/Article/13%E7%AC%AC%E5%8D%81%E4%B8%89%E8%AF%BE%E3%80%81%E6%98%AF%E6%97%B6%E5%80%99%E5%AD%A6%E4%B9%A0%E4%B8%80%E4%B8%8BFrida%E4%B8%80%E6%8A%8A%E6%A2%AD%E4%BA%86(%E4%B8%8A).md) 25 | [14第十四课、是时候学习一下Frida一把梭了(中)](https://github.com/ZJ595/AndroidReverse/blob/main/Article/14%E7%AC%AC%E5%8D%81%E5%9B%9B%E8%AF%BE%E3%80%81%E6%98%AF%E6%97%B6%E5%80%99%E5%AD%A6%E4%B9%A0%E4%B8%80%E4%B8%8BFrida%E4%B8%80%E6%8A%8A%E6%A2%AD%E4%BA%86(%E4%B8%AD).md) 26 | [15第十五课、是时候学习一下Frida一把梭了(下)](https://github.com/ZJ595/AndroidReverse/blob/main/Article/15%E7%AC%AC%E5%8D%81%E4%BA%94%E8%AF%BE%E3%80%81%E6%98%AF%E6%97%B6%E5%80%99%E5%AD%A6%E4%B9%A0%E4%B8%80%E4%B8%8BFrida%E4%B8%80%E6%8A%8A%E6%A2%AD%E4%BA%86(%E4%B8%8B).md) 27 | [16第十六课、是时候学习一下Frida一把梭了(终)](https://github.com/ZJ595/AndroidReverse/blob/main/Article/16%E7%AC%AC%E5%8D%81%E5%85%AD%E8%AF%BE%E3%80%81%E6%98%AF%E6%97%B6%E5%80%99%E5%AD%A6%E4%B9%A0%E4%B8%80%E4%B8%8BFrida%E4%B8%80%E6%8A%8A%E6%A2%AD%E4%BA%86(%E7%BB%88).md) 28 | [17第十七课、你的RPCvs佬的RPC](https://github.com/ZJ595/AndroidReverse/blob/main/Article/17%E7%AC%AC%E5%8D%81%E4%B8%83%E8%AF%BE.%E4%BD%A0%E7%9A%84RPCvs%E4%BD%AC%E7%9A%84RPC.md) 29 | [番外实战篇2-【2024春节】解题领红包活动,启动!](https://github.com/ZJ595/AndroidReverse/blob/main/Article/%E7%95%AA%E5%A4%96%E5%AE%9E%E6%88%98%E7%AF%872-%E3%80%902024%E6%98%A5%E8%8A%82%E3%80%91%E8%A7%A3%E9%A2%98%E9%A2%86%E7%BA%A2%E5%8C%85%E6%B4%BB%E5%8A%A8%EF%BC%8C%E5%90%AF%E5%8A%A8!.md) 30 | [18第十八课、表哥,你也不想你的Frida被检测吧!(上)](https://github.com/ZJ595/AndroidReverse/blob/main/Article/18%E7%AC%AC%E5%8D%81%E5%85%AB%E8%AF%BE%E3%80%81%E8%A1%A8%E5%93%A5%EF%BC%8C%E4%BD%A0%E4%B9%9F%E4%B8%8D%E6%83%B3%E4%BD%A0%E7%9A%84Frida%E8%A2%AB%E6%A3%80%E6%B5%8B%E5%90%A7!(%E4%B8%8A).md) 31 | [19第十九课、表哥,你也不想你的Frida被检测吧!(下)](https://github.com/ZJ595/AndroidReverse/blob/main/Article/19%E7%AC%AC%E5%8D%81%E4%B9%9D%E8%AF%BE%E3%80%81%E8%A1%A8%E5%93%A5%EF%BC%8C%E4%BD%A0%E4%B9%9F%E4%B8%8D%E6%83%B3%E4%BD%A0%E7%9A%84Frida%E8%A2%AB%E6%A3%80%E6%B5%8B%E5%90%A7!(%E4%B8%8B).md) 32 | [20第二十课、抓包学得好,牢饭吃得饱(上)](https://github.com/ZJ595/AndroidReverse/blob/main/Article/20%E7%AC%AC%E4%BA%8C%E5%8D%81%E8%AF%BE%E3%80%81%E6%8A%93%E5%8C%85%E5%AD%A6%E5%BE%97%E5%A5%BD%EF%BC%8C%E7%89%A2%E9%A5%AD%E5%90%83%E5%BE%97%E9%A5%B1(%E4%B8%8A).md) 33 | [番外实战篇3-拨云见日之浅谈Flutter逆向](https://github.com/ZJ595/AndroidReverse/blob/main/Article/%E7%95%AA%E5%A4%96%E5%AE%9E%E6%88%98%E7%AF%873-%E6%8B%A8%E4%BA%91%E8%A7%81%E6%97%A5%E4%B9%8B%E6%B5%85%E8%B0%88Flutter%E9%80%86%E5%90%91.md) 34 | [21第二十一课、抓包学得好,牢饭吃得饱(中)](https://github.com/ZJ595/AndroidReverse/blob/main/Article/23%E7%AC%AC%E4%BA%8C%E5%8D%81%E4%B8%80%E8%AF%BE%E3%80%81%E6%8A%93%E5%8C%85%E5%AD%A6%E5%BE%97%E5%A5%BD%EF%BC%8C%E7%89%A2%E9%A5%AD%E5%90%83%E5%BE%97%E9%A5%B1(%E4%B8%AD).md) 35 | [22第二十二课、抓包学得好,牢饭吃得饱(下)](https://github.com/ZJ595/AndroidReverse/blob/main/Article/24%E7%AC%AC%E4%BA%8C%E5%8D%81%E4%BA%8C%E8%AF%BE%E3%80%81%E6%8A%93%E5%8C%85%E6%8A%93%E5%BE%97%E5%A5%BD%EF%BC%8C%E7%89%A2%E9%A5%AD%E5%90%83%E5%BE%97%E9%A5%B1(%E4%B8%8B).md) 36 | [23第二十三课、黑盒魔法之Unidbg](https://github.com/ZJ595/AndroidReverse/blob/main/Article/25%E7%AC%AC%E4%BA%8C%E5%8D%81%E4%B8%89%E8%AF%BE%E3%80%81%E9%BB%91%E7%9B%92%E9%AD%94%E6%B3%95%E4%B9%8BUnidbg.md) 37 | 38 | 39 | # 请作者喝杯咖啡 40 | ![图片](Article/_assets_23/微信图片_20240916205905.jpg) 41 | 42 | ## Stargazers over time 43 | 44 | [![Stargazers over time](https://starchart.cc/ZJ595/AndroidReverse.svg)](https://starchart.cc/ZJ595/AndroidReverse) 45 | 46 | 47 | -------------------------------------------------------------------------------- /_assets/9fa626afac76ce38386a510dc71a78682196.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZJ595/AndroidReverse/e1726e2a908ec3a1bbefc767130dfe1240e4e2cf/_assets/9fa626afac76ce38386a510dc71a78682196.webp -------------------------------------------------------------------------------- /scripts/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | 3 | -------------------------------------------------------------------------------- /scripts/download_images.mjs: -------------------------------------------------------------------------------- 1 | import fs from 'node:fs'; 2 | import path from 'node:path'; 3 | import { spawnSync } from 'node:child_process'; 4 | import { URL } from 'node:url'; 5 | 6 | import fetch from 'node-fetch'; 7 | 8 | const __dirname = import.meta.dirname; 9 | const postsDir = path.join(__dirname, '../Article/'); 10 | const CAN_USE_WEBP = testCanConvertWebp(); 11 | 12 | function testCanConvertWebp() { 13 | const { status } = spawnSync('cwebp', { stdio: 'ignore' }); 14 | return status === 0; 15 | } 16 | 17 | async function processDir(dirname) { 18 | const children = fs.readdirSync(dirname).map((f) => ({ 19 | name: f, 20 | path: dirname + '/' + f, 21 | stat: fs.statSync(dirname + '/' + f), 22 | })); 23 | 24 | const files = children.filter((f) => f.stat.isFile() && f.name.toLowerCase().endsWith('.md')); 25 | const dirs = children.filter((f) => f.stat.isDirectory()).map((f) => f.path); 26 | 27 | for (const dir of dirs) { 28 | await processDir(dir); 29 | } 30 | 31 | for (const f of files) { 32 | await processFile(f.path); 33 | } 34 | } 35 | 36 | async function processFile(filePath) { 37 | const fileName = path.basename(filePath); 38 | const filePrefix = fileName.match(/^\d+/)?.[0] || '00'; 39 | console.info(`process file: ${fileName}\n`); 40 | const content = fs.readFileSync(filePath, 'utf-8'); 41 | 42 | const regex = /!\[(.*?)\]\((https?:\/\/.+?)\)/g; 43 | const replacements = []; 44 | let m = null; 45 | while ((m = regex.exec(content)) !== null) { 46 | const [_, alt, url] = m; 47 | const imageName = path.basename(new URL(url).pathname); 48 | const imagePath = path.resolve(filePath, '..', `_assets_${filePrefix}`, imageName); 49 | fs.mkdirSync(path.dirname(imagePath), { recursive: true }); 50 | 51 | console.log('download from %s...', url); 52 | const buffer = await fetch(url, { 53 | headers: { 54 | Referer: url, 55 | }, 56 | }).then((resp) => resp.arrayBuffer()); 57 | fs.writeFileSync(imagePath, Buffer.from(buffer)); 58 | 59 | let finalImagePath = imagePath; 60 | if (CAN_USE_WEBP && imageName.toLowerCase().endsWith('.png')) { 61 | finalImagePath = finalImagePath.replace(/\.png$/i, '.webp'); 62 | const { status } = spawnSync('cwebp', ['-lossless', '-z', '9', '-m', '6', imagePath, '-o', finalImagePath], { 63 | stdio: 'inherit', 64 | }); 65 | if (status === 0) { 66 | fs.unlinkSync(imagePath); 67 | } else { 68 | console.warn(`cwebp exit with error ${status}`); 69 | } 70 | } 71 | 72 | const relativeImagePath = path.relative(postsDir, finalImagePath); 73 | replacements.push({ alt, path: relativeImagePath }); 74 | } 75 | 76 | if (replacements.length === 0) { 77 | // 没有要转存的图片 78 | return; 79 | } 80 | 81 | let replacement_id = 0; 82 | const fixedContent = content.replace(regex, () => { 83 | const replacement = replacements[replacement_id++]; 84 | return `![${replacement.alt}](${replacement.path})`; 85 | }); 86 | 87 | fs.writeFileSync(filePath, fixedContent, 'utf-8'); 88 | } 89 | 90 | console.info(`\n\n!!!start!!!\n`); 91 | processDir(postsDir); 92 | -------------------------------------------------------------------------------- /scripts/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "androidreverse", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "androidreverse", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "node-fetch": "^3.3.2" 13 | }, 14 | "devDependencies": { 15 | "prettier": "^3.2.5" 16 | } 17 | }, 18 | "node_modules/data-uri-to-buffer": { 19 | "version": "4.0.1", 20 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", 21 | "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", 22 | "engines": { 23 | "node": ">= 12" 24 | } 25 | }, 26 | "node_modules/fetch-blob": { 27 | "version": "3.2.0", 28 | "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", 29 | "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", 30 | "funding": [ 31 | { 32 | "type": "github", 33 | "url": "https://github.com/sponsors/jimmywarting" 34 | }, 35 | { 36 | "type": "paypal", 37 | "url": "https://paypal.me/jimmywarting" 38 | } 39 | ], 40 | "dependencies": { 41 | "node-domexception": "^1.0.0", 42 | "web-streams-polyfill": "^3.0.3" 43 | }, 44 | "engines": { 45 | "node": "^12.20 || >= 14.13" 46 | } 47 | }, 48 | "node_modules/formdata-polyfill": { 49 | "version": "4.0.10", 50 | "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", 51 | "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", 52 | "dependencies": { 53 | "fetch-blob": "^3.1.2" 54 | }, 55 | "engines": { 56 | "node": ">=12.20.0" 57 | } 58 | }, 59 | "node_modules/node-domexception": { 60 | "version": "1.0.0", 61 | "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", 62 | "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", 63 | "funding": [ 64 | { 65 | "type": "github", 66 | "url": "https://github.com/sponsors/jimmywarting" 67 | }, 68 | { 69 | "type": "github", 70 | "url": "https://paypal.me/jimmywarting" 71 | } 72 | ], 73 | "engines": { 74 | "node": ">=10.5.0" 75 | } 76 | }, 77 | "node_modules/node-fetch": { 78 | "version": "3.3.2", 79 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", 80 | "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", 81 | "dependencies": { 82 | "data-uri-to-buffer": "^4.0.0", 83 | "fetch-blob": "^3.1.4", 84 | "formdata-polyfill": "^4.0.10" 85 | }, 86 | "engines": { 87 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 88 | }, 89 | "funding": { 90 | "type": "opencollective", 91 | "url": "https://opencollective.com/node-fetch" 92 | } 93 | }, 94 | "node_modules/prettier": { 95 | "version": "3.2.5", 96 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", 97 | "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", 98 | "dev": true, 99 | "bin": { 100 | "prettier": "bin/prettier.cjs" 101 | }, 102 | "engines": { 103 | "node": ">=14" 104 | }, 105 | "funding": { 106 | "url": "https://github.com/prettier/prettier?sponsor=1" 107 | } 108 | }, 109 | "node_modules/web-streams-polyfill": { 110 | "version": "3.3.3", 111 | "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", 112 | "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", 113 | "engines": { 114 | "node": ">= 8" 115 | } 116 | } 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /scripts/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "androidreverse", 3 | "version": "1.0.0", 4 | "description": "《安卓逆向这档事》", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "node-fetch": "^3.3.2" 14 | }, 15 | "devDependencies": { 16 | "prettier": "^3.2.5" 17 | } 18 | } 19 | --------------------------------------------------------------------------------