免密登录调研

前言

近期运营提出一个需求:实现租号玩免密登录游戏功能,然后集成进交易虎 App,用户在 App 里面进行租号,我们不需要将用户名密码给到用户,而是只提供一个打开游戏的按钮,用户点击后自动打开游戏,并直接进去区服选择界面。这样既方便了用户,同时也使得卖家的账号信息不被泄漏。 我负责前期调研,通过脱壳、反编译破解了租号玩 App,实现了 QQ、微信免密登录。注:说说是免密,实际上只是我们代替用户去登录,然后把登录信息给到 App。

本次得到的收获

Xposed 相关

Xposed 框架可以实现任意方法以及资源的 Hook, Xposed 只支持到 Android 7.0,而我的手机是 Android 10.0 因此不能使用,于是考虑使用 EdXposed 其支持 Android 8.0 ~ 11.0 ,不过安装方式没有 Xposed 那么简单。

安装

首先需要 Root 手机(小米手机首先用官方自带的方式解锁,然后刷入开发版即可),然后需要安装 Magisk ,安装完毕后在其内部再安装 Riru 以及 Riru-EdXposed 模块然后重启手机就发现 EdXposed 以及安装完毕,然后后续操作与 Xposed 基本一致。

使用

API 低于 26 的机型可以结合 Xposed 框架以及以下三个方法实现脱壳。注:成功实现腾讯加固的脱壳

  • ClassLoader.loadClass(String, boolean)
  • Class.getDex()
  • Dex.getBytes()
class UnShellHook : Hook {
private val getDexMethod =
getMethod("java.lang.Class", "getDex")
private val getBytesMethod =
getMethod("android.dex.Dex", "getBytes")
override fun isSupportVersion(apiVersion: Int): Boolean {
return apiVersion < Build.VERSION_CODES.O
}
override fun hook(param: PackageParam) {
XposedHelpers.findAndHookMethod(
ClassLoader::class.java, "loadClass", Boolean::class.java, object : MethodHook() {
override fun afterHookedMethod(param: MethodHookParam) {
val clazz = param.args[0] as Class<*>
val dex = getDexMethod.invoke(clazz)
val bytes = getBytesMethod.invoke(dex) as ByteArray
val context = AndroidAppHelper.currentApplication()
val dexFile = File(context.getExternalFilesDir("dex"), "dex${bytes.size}")
if (!dexFile.exists()) {
dexFile.outputStream().use {
it.write(bytes)
}
}
}
})
}
}

Smali 相关

Smali 也能进行动态调试,这非常有利于分析代码。

操作步骤

  1. 要能调试首先该应用的 AndroidManifest.xml 中的 application 节点下,必须存在 android:debuggable = “true” 否则无法进行调试,修改这个也简单,反编译一下修改后回编译签名就行。

  2. 接着使用 adb 启动该应用,该命令执行后,就会打开该应用,然后显示等待 debugger attach 上。

    adb shell am start -D -n com.hefuwei.demo/com.hefuwei.demo.MainActivity # 包名/入口 Activity 全类名
  3. 接着再使用 adb 获取 pid。

    adb shell ps |grep demo # demo 表示过滤条件
  4. 接着再设置 adb 进行端口转移。

    adb forward tcp:8700 jdwp:16939 # 8700 为调试端口号随意 16939 为应用的 pid
  5. 使用 apktool 反编译 apk,并将 smali、smali_classN 合并到 smali 文件夹下,然后将该文件夹名称修改为 src,并将其放入 demo 文件夹下(名称任意)。

  6. 使用 as 导入 demo 文件夹,然后安装插件 ideasmali 插件,下载地址 https://bitbucket.org/JesusFreke/smalidea/downloads/ 安装完毕后重启。

  7. 然后添加一个 run configurations,类型为 Remote 端口号为刚才指定的端口号。

    Screen Shot 2021-06-30 at 4.35.20 PM

  8. 打开 smali 文件打上断点,点击启动调试即可。

0%