首页 > 其他分享 >一次安卓逆向记录

一次安卓逆向记录

时间:2022-12-07 21:12:52浏览次数:67  
标签:逆向 wristband Lcom models 安卓 记录 database meizu smart

前言

前段事件,因为公司附近有了确诊病例,我刚好与确诊人员有时空交错,所以被居家隔离,于是开启了相对漫长的居家隔离状态,在这段无所事事的时间中,我开始了之前一直想做,但是没有做的小想法——逆向魅族手环app

为什么要逆向这个APP呢?因为之前买过一个魅族手环,但是在2021的时候,官方的app登录服务器停止服务,没法打登录,也就没法实现数据同步,就连基本的时间同步都没法实现,也就没有了任何价值,为了让这个手环还能实现一些价值,于是我趁着这个相对漫长的无所事事的时间,逆向了官方app,同时也幸运地取得了成功,所以也就有了今天的内容。本来这块的内容前几天就打算分享的,但是由于工作和一些主观的原因,迟迟一直没有花时间来做一个总结,所以一次又一次地拖,一直拖到今天。

这个手环颜值还是可以的:

逆行过程

项目描述

本项目是基于魅族手环H1安卓APP的一个逆向工程,通过逆向修改,解决了官方停服之后,无法登陆的问题(进行了免登处理),确保打开APP直接进入应用首页。
当然,本项目也是我的第一个安卓逆向工程,后续看个人兴趣,会继续探索学习。

环境及工具

本次用到了AndroidKiller,版本v1.3.1,这是一个逆向集成工具,可以直接将apk文件的核心源码反编译为smail工程文件,然后我们通过修改smail文件,达到自己APP魔改的需求。
该工具同时集成了编译、打包、ABD调试等功能,用起来很顺手,后续我会专门出一期使用教程。

相关内容已经梳理到个人知识库:
androidkiller工具使用指南

smail基本语法

因为我们这里直接修改的是smail文件,所以学习一些基本语法也是必须的。作为一个java后端开发,我的安卓开发经验基本为零,所以在smail源码的过程中,踩了很多坑,当然也成长很多,后面我会把本次踩坑的知识点梳理下分享出来。

相关内容已经梳理到个人知识库:
smail基本语法示例

修改内容

这块主要是说明APP的修改能容,算是给各位喜欢琢磨的小伙伴提供一个破解思路,当然仅供参考。
这里先贴几张图,大概说下修改的内容:

StartActivity

这里主要是保存用户信息,同时跳转到RegistInfoActivity,确保用户信息落库。

对应的smail源码如下:

const-string v2, "syske"
new-instance v1, Lcom/meizu/smart/wristband/models/database/servers/LoginInfoServer;
invoke-direct {v1, p0}, Lcom/meizu/smart/wristband/models/database/servers/LoginInfoServer;-><init>(Landroid/content/Context;)V
invoke-virtual {v1, v2, v2}, Lcom/meizu/smart/wristband/models/database/servers/LoginInfoServer;->saveLoginInfo(Ljava/lang/String;Ljava/lang/String;)V

new-instance v1, Lcom/meizu/smart/wristband/models/database/servers/UserInfoServer;
invoke-direct {v1, p0}, Lcom/meizu/smart/wristband/models/database/servers/UserInfoServer;-><init>(Landroid/content/Context;)V
new-instance v0, Lcom/meizu/smart/wristband/models/newwork/response/Logindata;
invoke-direct {v0}, Lcom/meizu/smart/wristband/models/newwork/response/Logindata;-><init>()V
invoke-virtual {v1, p0, v2, v0}, Lcom/meizu/smart/wristband/models/database/servers/UserInfoServer;->saveUserInfo(Landroid/content/Context;Ljava/lang/String;Lcom/meizu/smart/wristband/models/newwork/response/Logindata;)Z

.line 168
new-instance v0, Landroid/content/Intent;

const-class v2, Lcom/meizu/smart/wristband/meizuUI/login_regist/RegistInfoActivity;

invoke-direct {v0, p0, v2}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class;)V

完整源码可以直接去库里看。

这里原本是参照某乎大佬修改的,但是发下改了之后没啥用,还是会报错,所以我想着能不能直接改查询接口,于是我直接找到models/database/servers包下的LoginInfoServerUserInfoServer,并修改对应方法。

LoginInfoServer

LoginInfoServer我改的是getLoginInfo的实现,直接实例化一个新的LoginInfo对象返回。

对应smail源码如下:

# virtual methods
.method public getLoginInfo()Lcom/meizu/smart/wristband/models/database/servers/LoginInfoServer$LoginInfo;
    .locals 5

    .prologue
    const/4 v4, 0x0

    .line 47
    iget-object v3, p0, Lcom/meizu/smart/wristband/models/database/servers/LoginInfoServer;->context:Landroid/content/Context;

    invoke-static {v3}, Lcom/meizu/smart/wristband/utils/SharePreferencesUtil;->getSharedPreferences(Landroid/content/Context;)Landroid/content/SharedPreferences;

    move-result-object v2

    .line 49
    .local v2, "preferences":Landroid/content/SharedPreferences;
    const/4 v1, 0x0

    .line 50
    .local v1, "entity":Lcom/meizu/smart/wristband/models/database/servers/LoginInfoServer$LoginInfo;
    const-string v3, "account"

    invoke-interface {v2, v3, v4}, Landroid/content/SharedPreferences;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;

    move-result-object v0

    .line 51
    .local v0, "account":Ljava/lang/String;
    invoke-static {v0}, Ldolphin/tools/util/StringUtil;->isBlank(Ljava/lang/String;)Z

    move-result v3

    .line 52
    new-instance v1, Lcom/meizu/smart/wristband/models/database/servers/LoginInfoServer$LoginInfo;

    .end local v1    # "entity":Lcom/meizu/smart/wristband/models/database/servers/LoginInfoServer$LoginInfo;
    invoke-direct {v1}, Lcom/meizu/smart/wristband/models/database/servers/LoginInfoServer$LoginInfo;-><init>()V

    .line 53
    .restart local v1    # "entity":Lcom/meizu/smart/wristband/models/database/servers/LoginInfoServer$LoginInfo;
    invoke-virtual {v1, v0}, Lcom/meizu/smart/wristband/models/database/servers/LoginInfoServer$LoginInfo;->setAccount(Ljava/lang/String;)V

    .line 54
    const-string v3, "pwd"

    invoke-interface {v2, v3, v4}, Landroid/content/SharedPreferences;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;

    move-result-object v3

    invoke-virtual {v1, v3}, Lcom/meizu/smart/wristband/models/database/servers/LoginInfoServer$LoginInfo;->setPwd(Ljava/lang/String;)V

    .line 57
    
    const-string v4, "syske"    
    
    new-instance v1, Lcom/meizu/smart/wristband/models/database/servers/LoginInfoServer$LoginInfo;
    .restart local v1    # "entity":Lcom/meizu/smart/wristband/models/database/servers/LoginInfoServer$LoginInfo;
    invoke-direct {v1}, Lcom/meizu/smart/wristband/models/database/servers/LoginInfoServer$LoginInfo;-><init>()V
    
    invoke-virtual {v1, v4}, Lcom/meizu/smart/wristband/models/database/servers/LoginInfoServer$LoginInfo;->setAccount(Ljava/lang/String;)V
    invoke-virtual {v1, v4}, Lcom/meizu/smart/wristband/models/database/servers/LoginInfoServer$LoginInfo;->setPwd(Ljava/lang/String;)V
     
    return-object v1
.end method
UserInfoServer

UserInfoServer也是类似的方法,主要是解决空指针异常:

对应smail源码:

# virtual methods
.method public getLoginUser()Lcom/meizu/smart/wristband/models/database/entity/User;
    .locals 6
    .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/sql/SQLException;
        }
    .end annotation

    .prologue
    .line 53
    new-instance v3, Lcom/meizu/smart/wristband/models/database/servers/LoginInfoServer;

    iget-object v4, p0, Lcom/meizu/smart/wristband/models/database/servers/UserInfoServer;->context:Landroid/content/Context;

    invoke-direct {v3, v4}, Lcom/meizu/smart/wristband/models/database/servers/LoginInfoServer;-><init>(Landroid/content/Context;)V

    invoke-virtual {v3}, Lcom/meizu/smart/wristband/models/database/servers/LoginInfoServer;->getLoginInfo()Lcom/meizu/smart/wristband/models/database/servers/LoginInfoServer$LoginInfo;

    .line 54
    new-instance v1, Lcom/meizu/smart/wristband/models/database/entity/User;
    invoke-direct {v1},  Lcom/meizu/smart/wristband/models/database/entity/User;-><init>()V

    .line 55
    const-string v5, "syske"
    invoke-virtual {v1, v5}, Lcom/meizu/smart/wristband/models/database/entity/User;->setId(Ljava/lang/String;)V
    
    .line 56
    const/4 v5, 0x0

    invoke-static {v5}, Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;

    move-result-object v5

    invoke-virtual {v1, v5}, Lcom/meizu/smart/wristband/models/database/entity/User;->setSync(Ljava/lang/Boolean;)V
    invoke-virtual {v1, v5}, Lcom/meizu/smart/wristband/models/database/entity/User;->setIsEmpty(Ljava/lang/Boolean;)V
    
    const-string v5, "180"
    invoke-virtual {v1, v5}, Lcom/meizu/smart/wristband/models/database/entity/User;->setWeight(Ljava/lang/String;)V
    invoke-virtual {v1, v5}, Lcom/meizu/smart/wristband/models/database/entity/User;->setHeight(Ljava/lang/String;)V 
    
    return-object v1
.end method

结语

至此,免登app的改造基本上完成了,是不是很简单,但是就是这几行简简单单的代码,我愣是研究了好几天,然后一点点踩坑,一点点进步,一点点成长,才完成,但是整个过程还是成就感满满的,特别是第一次进入首页的那一刻,感觉一切都是值得的,奥里给
最后附上改造完成的app演示视频:

  • 未破解前:首次进入app是需要登陆的

  • 破解之后:首次进入直接进入(会白屏,这里是因为网络连接失败,重新打开就好了)

标签:逆向,wristband,Lcom,models,安卓,记录,database,meizu,smart
From: https://www.cnblogs.com/caoleiCoding/p/16964549.html

相关文章

  • linux 中 shell 记录程序运行时间
      001、[root@PC1test]#start=`date+%s`##从1970年1月1日00:00:00UTC到目前为止的秒数(时间戳)[root@PC1test]#echo$start1670412402[root@......
  • 记录--微信小程序获取用户信息的最新方法记录
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助微信小程序获取用户信息的几种方式以下三种方式都无法获取到用户的openID1.开放组件获取用户信息<open-......
  • mybatis-plus异常记录:org.apache.ibatis.binding.BindingException Invalid bound st
    问题描述我们在使用mybatis或mybatis-plus作为持久化框架的时候,通过dao层接口调用xml中配置好的sql时,常常会遇到​​org.apache.ibatis.binding.BindingExceptionInvalidb......
  • 0-1个人网站搭建记录【1】
    使用阿里云ECS尝试搭建个人网站,在此记录,以作参考。在网上搜索教程发现此类教程往往具有时效性,很多操作步骤随着软件的更新可能会不太一样,所以当你看到这篇文章时如果间隔......
  • yolov3/4 转换为caffemodel 并且验证检测图片功能 简单记录遇到的一个问题
    过程需要设计github上的caffe、darknet2caffe、caffe-yolov3等资源,具体编译安装过程可以参考网络上的其他资源。注意这个过程有一个很关键的地方,就是caffe-yolov3的实现是......
  • k8s上部署redis哨兵记录
    -k8s界面使用kuboard-部署使用1主1备1哨兵-使用思路为master节点部署后,slave节点使用master的serviceip与master节点进行互通,哨兵进程与master、slave使用serviceip......
  • 记录:nvm 安装与使用
    遇到新老项目使用的node版本不一致时,为了方便版本切换所以使用了node版本管理工具--nvm一、nvm安装下载下载:https://github.com/coreybutler/nvm-windows/releases......
  • Python 日志记录-loguru
    Python日志记录-loguru使用logging模块时用python写代码时,logging模块最基本的几行配置,如下:importlogginglogging.basicConfig(level=logging.INFO,format='%(ascti......
  • JS逆向之webpack 通用扣取思路
    本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!标题......
  • 7.6. 语句记录
    1."offbase”常喻指“荒谬的,错的太离谱(尤指基于错误前提之上的错误言行)”,如:Thestoriesareoffbase(报道完全失实);Hisdescriptionoftheaccountingsystemwastotall......