ELF 动态链接中的符号查找
概述在程序进行动态链接的时候,需要通过符号名字进行符号的查找。ELF 动态链接库中,动态链接所需的符号(动态符号)及字符串位于 .dynsym 节(section)和 .dynstr 节中,可以通过动态节(Dynamic Section)获取地址。由于这些节都位于需要被加载到内存的段(segment)中,因此 ELF 被映射到内存后即可直接从内存中访问动态符号的信息。
在加载 ELF 后,ELF 基址指向的就是 ELF Header (这也是 ELF 文件头部),其中包含程序头表(Program Header Table) 地址,而动态节的地址偏移可以从程序头表中获得(类型为 PT_DYNAMIC)。其中动态符号表(.dynsym)偏移的类型为 DT_SYMTAB ,字符串表(.dynstr)偏移类型为 DT_STRTAB 。
查找符号即通过符号名字,找到其在动态符号表的位置的过程。这个位置可能是 0 ,表示没有找到符号。动态符号表的第 0 个符号一般不表示任何实际的符号(类型是 NOTYPE ,value 是 0),可以认为是逻辑上的 NULL 。
由于 ELF 中可能包含大量的动态 ...
记 LSPosed 的一个随机崩溃的调查过程
记 LSPosed 的一个随机崩溃的调查过程LSPosed 已经停更数个月,由于缺少维护,问题不断显现。从上个月开始,就看到有不少用户汇报 LSPosed 存在导致系统概率性 crash 或 bootloop 的问题,然而原因却让人摸不着头脑。在最近,经过几天的与问题用户的跟踪调查,总算有了眉目。
初见收到的 crash dump 往往具有下面的特征:
1234567891011121314151617181920212223Process uptime: 13sZygotePid: 8731Cmdline: system_serverpid: 8968, tid: 9054, name: PackageManager >>> system_server <<<uid: 1000tagged_addr_ctrl: 0000000000000001 (PR_TAGGED_ADDR_ENABLE)signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x000000000001001f x0 ...
Android arm64 在 ptrace 中使用硬件断点
Android arm64 在 ptrace 中使用硬件断点ARM64内核研究(五) | Ylarod’s Blog
gdb 系列(1) (hwbreakpoint\watchpoint)
正文为了跟踪相应地址发生的事件(读、写、执行)是哪一条指令造成的,我们可以使用硬件断点来达成这一目标。
准备条件需要内核启用 CONFIG_HAVE_HW_BREAKPOINT 和 CONFIG_HAVE_ARCH_TRACEHOOK
gki 上应该是默认打开的
https://cs.android.com/android/kernel/superproject/+/common-android-mainline:common/arch/arm64/Kconfig;l=217;drc=661dc19066ef0fdcb2db3e2542c45744a4067e87
注册断点在 arm64 上,使用 PTRACE_GET/SETREGSET 调用来设置断点。内核的处理逻辑如下:
common/arch/arm64/kernel/ptrace.c
12345678 ...
在 AVD 上使用 KernelSU - 第二回 -
编译兼容内核模块的版本前篇 已经成功编译出了适合 avd 使用的内核,然而同时需要编译兼容的内核模块,过于复杂。经过一番探索,发现只要找到正确的源码,还是能编译出与发布的 avd 镜像兼容的内核。
认识版本号还是回到 /proc/version 上,内核的版本号提供了很多信息,比如 -g 后跟着的是一个 12 位 16 进制数,表示编译的内核的源码树的提交 hash ,此外还有编译器版本。
1Linux version 6.1.23-android14-4-00257-g7e35917775b8-ab9964412 (build-user@build-host) (Android (9796371, based on r487747) clang version 17.0.0 (https://android.googlesource.com/toolchain/llvm-project d9f89f4d16663d5012e5c09495f3b30ece3d2362), LLD 17.0.0) #1 SMP PREEMPT Mon Apr 17 20:50:58 ...
在 AVD 上使用 KernelSU
在 AVD 上使用 KernelSU曾经尝试过给 AVD 构建带有 KernelSU 的内核,方便开发测试,但是发现内核模块不兼容,现在的方法是同时构建内核模块,略为复杂。
构建内核https://source.android.com/docs/setup/build/building-kernels?hl=zh-cn
Android 14 的 AVD 内核版本:
1Linux version 6.1.23-android14-4-00257-g7e35917775b8-ab9964412 (build-user@build-host) (Android (9796371, based on r487747) clang version 17.0.0 (https://android.googlesource.com/toolchain/llvm-project d9f89f4d16663d5012e5c09495f3b30ece3d2362), LLD 17.0.0) #1 SMP PREEMPT Mon Apr 17 20:50:58 UTC 2023
根据 KernelSU C ...
记一次 LSPosed Native Hook 偶现崩溃
记一次 LSPosed Native Hook 偶现崩溃发现故障昨天(12-05)调试 HMA 的时候重启手机,发现某些加载了 LSPosed 模块的 app 总是无法启动,除非禁用作用于它的所有模块,它们的 tombstone 全指向了同一处地址的 SIGSEGV 。
重启后恢复正常,于是我赶紧去翻查 tombstone ,发现 backtrace 来自某个 zygisk 模块,并且堆栈回溯到这里断掉了。
12345signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x7196fa5224backtrace: #00 pc 00000000000859b0 /apex/com.android.runtime/lib64/bionic/libc.so (__memcpy+96) (BuildId: a790cdbd8e44ea8a90802da343cb82ce) #01 pc 000000000001c57c /memfd:jit-cache (deleted)
既然是 LSPosed 模块导致了 ...
Android 安装系统证书
Android 安装系统证书抓包的时候通常需要安装特定的 CA 证书以便中间人解密,本文以安装 mitmproxy 证书为例介绍如何准备证书文件和临时安装(挂载)证书到特定的 app 。
准备证书这里可以直接参考 mitmproxy 给出的流程
System CA on Android Emulator
mitmproxy CA 证书位于 ~/.mitmproxy/mitmproxy-ca-cert.cer (Windows: %UserProfile%\.mitmproxy\mitmproxy-ca-cert.cer) ,Android 接受这种格式的证书,不过需要重命名为特定的名字。
命令 openssl x509 -inform PEM -subject_hash_old -in mitmproxy-ca-cert.cer 第一行输出证书的 hash ,本例中为 c8750f0d ,因此复制一份 mitmproxy-ca-cert.cer ,将其重命名为 c8750f0d.0 ,即可得到 Android 上可用的证书。
挂载到系统目录对于 Android 13 和之前的版本, ...
在树莓派上部署 Tachidesk Server
在树莓派上部署 Tachidesk Server & Suwayomi 插件体验最近想在手机上看本子,但是想看的内容重达 8G ,即使处理成 webp ,压缩到了 600M ,但几千张也不是小数目,实在不太好放在手机上。突然想到自己尘封数个月的三手树莓派,于是拿出来搭建了个 WebDAV ,把本子传上去,这样就能舒服地躺在床上用手机看了。剩下的问题就是阅读器。手机上支持 WebDAV 的文件管理器普遍看图效果差,而 Tachiyomi 虽然看漫画好用却没有 WebDAV 源。现在发现 Tachidesk 通过 Suwayomi 插件可以作为 Tachiyomi 的图源,决定在树莓派上部署。
安装Suwayomi/Tachidesk-Server: A rewrite of Tachiyomi for the Desktop
首先安装 makedeb
makedeb - A simplicity-focused packaging tool for Debian archives
1bash -ci "$(wget -qO - 'https:// ...
My new blog ...
My new blog …终于还是用 hexo + gh pages 搭了个博客。
原本希望用 my-notes 作博客,用 github 自带的 actions 生成,然而效果不佳,最大的问题是没有首页,自己又懒于研究,于是就一直挂在那了,想必没人会看吧(笑)。
开这个新的博客,也是希望另起炉灶,因为原先的 my-notes 堆积了大量的口水话,我还是希望新的 blog 内容更有质量一些,少一些记录性的内容。
现在我已经从 my-notes 搬运了一些我认为相对来说好一些的内容到这里。也许将来 my-notes 的作用就是草稿箱,如果有成品就会放到这里来。
LSPass 学习
LSPass 学习前置知识ART 对象表示在 ART 中,一个 Java 对象与一个 art::mirror::Object 一一对应,此外一些系统的特殊类会和 mirror Object 的派生类对应,如 java/lang/Class 对应 art::mirror::Class 。
mirror::Object 对象所包含的内容就是 instance field 的内容,因此它的大小和类的 instance field 有关。之所以叫 mirror ,是因为这些 mirror 类中定义的成员和 Java 类的字段(field)是一致的。
一般的类的对象对应的都是 art::mirror::Object ,访问 field 是通过对象地址 + field offset 实现的。如果一个类继承另一个类,则内存布局上子类的 field 排在父类的后面,这和结构体继承的内存布局是一致的。
例如 art::mirror::Object 只有两个成员:
12345// art/runtime/mirror/object.h // The Class representin ...