0%

项目地址

SoftApHelper

Hook点

仍然是android.net.ip.IpServerrequestIpv4Address函数。

IpServer.java#655

1
2
3
4
5
6
7
8
9
private LinkAddress requestIpv4Address(final boolean useLastAddress) {
if (mStaticIpv4ServerAddr != null) return mStaticIpv4ServerAddr;

if (mInterfaceType == TetheringManager.TETHERING_BLUETOOTH) {
return new LinkAddress(BLUETOOTH_IFACE_ADDR);
}

return mPrivateAddressCoordinator.requestDownstreamAddress(this, useLastAddress);
}

参数增加了一个boolean useLastAddress,加上即可。

通过反射调用getDeclaredMethods获取方法,从而适配安卓11和12。

Hook代码

见GitHub:MainHook.java

概述

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代码即可。

增加对DT_RELADT_RELASZ的处理,并使用宏定义进行条件判断,例如:

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

完整代码见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

阅读全文 »