0%

概述

AndroidGotHook项目中,对于ARM64架构,在重定位表中找不到目标符号,无法基于Segment进行GOT Hook

通过打印日志,与readelf -r的结果比对,最终发现,代码错误地解析了重定位表(将.rela.plt处理为了.rel.plt),导致偏移值查找失败。

查看git历史记录可知,Androidlinker5.0(API等级21)才开始支持DT_RELA。使用宏USE_RELA控制。

linker_common_types.h#38

1
2
3
4
// Android uses RELA for LP64.
#if defined(__LP64__)
#define USE_RELA 1
#endif

解决方案:ARM64架构下使用elf64_rela数据结构。

PS:也可以通过DT_PLTREL来判断使用的是哪种重定位表。

相关数据结构

1
2
3
4
5
6
7
8
9
10
typedef struct elf64_rel {
Elf64_Addr r_offset;
Elf64_Xword r_info;
} Elf64_Rel;

typedef struct elf64_rela {
Elf64_Addr r_offset;
Elf64_Xword r_info;
Elf64_Sxword r_addend;
} Elf64_Rela;

修复

linker.cpp代码即可。

使用宏定义进行条件判断,例如:

1
2
3
4
5
#if defined(__LP64__)
rela_plt = (ELFW(Rela) *) (moduleBase + dyn.d_un.d_ptr);
#else
rel_plt = (ELFW(Rel) *) (moduleBase + dyn.d_un.d_ptr);
#endif

.rela的适配见AndroidGotHook

编辑CaddyFile

v2

1
2
3
4
5
https://bd.xxx.com {
reverse_proxy https://www.baidu.com {
header_up Host {http.reverse_proxy.upstream.hostport}
}
}

v1

1
2
3
4
5
https://bd.xxx.com {
gzip
tls [email protected]
proxy / https://www.baidu.com
}

项目地址

完整项目见MIUICustom

注意:该模块仅测试于电池与性能 4.2.00,其他版本未测试。

概述

即使在设置中将屏幕刷新率设置为120Hz,对于某些应用(如哔哩哔哩)仍锁60帧。
通过Xposed Hook DisplayFrameSetting.isFeatureOn,实现全局高刷。

代码

1
2
3
4
5
6
7
8
9
10
11
// 4.2.00
Method mtd_isFeatureOn_4200 = XposedHelpers.findMethodExactIfExists("com.miui.powerkeeper.statemachine.DisplayFrameSetting",
lpparam.classLoader, "isFeatureOn");
if (mtd_isFeatureOn_4200 != null) {
XposedBridge.hookMethod(mtd_isFeatureOn_4200, new XC_MethodReplacement() {
@Override
protected Object replaceHookedMethod(MethodHookParam param) {
return false;
}
});
}

验证

打开设置-开发者选项-显示刷新频率

  1. 打开哔哩哔哩,帧率为60。
  2. LSPosed钟对电池与性能启动模块,并强行停止(长按)。
  3. 打开哔哩哔哩,帧率为120。

参考

[教程] MIUI 修改 反编译 全局高刷 教程

问题描述

编写内核驱动,使用mmap共享内存。发现读取到的数据不对。
联想到mmaplength会自动调整为PAGE_SIZE的倍数,猜测是因为mmap返回的是对应page的起始地址,导致存在偏移。

修复方式:初始化时,单独申请一块大小为PAGE_SIZE的内存,不使用数组。
并调用SetPageReserved,保留该页。

阅读全文 »

概述

某app使用了curl+openssl进行https通信,并开启了证书校验。
通过分析curl源码,定位到证书校验位置,Patch汇编代码,绕过证书校验。

原理

相关代码

SSL_CTX_set_verify定义:openssl/ssl/ssl_lib.c#L3551

1
2
3
4
5
6
void SSL_CTX_set_verify(SSL_CTX *ctx, int mode,
int (*cb) (int, X509_STORE_CTX *))
{
ctx->verify_mode = mode;
ctx->default_verify_callback = cb;
}

调用位置ossl_connect_step1curl/lib/vtls/openssl.c#L3200
相关变量verifypeercurl/lib/vtls/openssl.c#L2676

阅读全文 »

命令对照表

GDB to LLDB command map

环境

PC: Windows 10
NDK: 22.1.7171670

程序位置

GDB 8.3(位于<ndk>\toolchains\llvm\prebuilt\windows-x86_64\bin
lldb version 11.0.5(位于<ndk>\prebuilt\windows-x86_64\bin

Server

ARM

<ndk>\prebuilt\android-arm64\gdbserver
<ndk>\toolchains\llvm\prebuilt\windows-x86_64\lib64\clang\11.0.5\lib\linux\arm\lldb-server

ARM64

<ndk>\prebuilt\android-arm\gdbserver
<ndk>\toolchains\llvm\prebuilt\windows-x86_64\lib64\clang\11.0.5\lib\linux\aarch64\lldb-server

阅读全文 »

问题描述

使用insmod安装内核模块后,在appNative层访问驱动,提示Permission Denied
设置驱动权限,绕过DAC权限检查:chmod 666 /dev/helloworld
再次调用,仍然失败。
执行dmesg -w | grep "avc: denied",查看SELinux日志。

1
[23292:logd.auditd]type=1400 audit(1651503112.740:5320): avc: denied { read write } for comm="exp.hellokernel" name="helloworld" dev="tmpfs" ino=297747 scontext=u:r:priv_app:s0:c227,c256,c512,c768 tcontext=u:object_r:device:s0 tclass=chr_file permissive=1

关闭SELinux后,成功调用驱动。

添加allow规则,调用仍失败,查阅资料得知需要设置为mlstrustedsubject

最终基于magiskpolicy,实现了自定义SELinux规则的添加。

PS:笔者将apk放到了system/priv-app目录下,所以rolepriv_app,而非untrusted_app

阅读全文 »

报错信息

Log

1
2
3
4
logcat: Unexpected EOF!

This means that either the device shut down, logd crashed, or this instance of logcat was unable to read log
messages as quickly as they were being produced.

LSPosed

1
2
Logd maybe crashed, retrying in 1s...
Logd crashed too many times, trying manually start...

修复

开发者选项-日志记录器缓冲区大小修改为16M