Wish App逆向分析app_device_id字段生成算法

概述

本文对Wish App进行了反编译,对应用中app_device_id字段的生成算法进行了逆向分析。

使用到的工具有:

1. Apktool:获取资源文件和smali 反汇编代码

2. dex2jar:反编译apk,将其中的classes.dex转化成jar文件

3. jd-gui:打开jar文件,查看java源码

反编译环境:mac osx

apk反编译获得java代码和smali反汇编代码

1. 从google play下载Wish.apk

2. 使用dex2jar把apk解包,将其中的classes.dex转换为jar文件

打开终端,执行命令: d2j-dex2jar Wish.apk ,如下图,得到Wish-dex2jar.jar

3. 使用jd-gui查看Wish-dex2jar.jar文件,即java源代码

在jd-gui中打开Wish-dex2jar.jar文件,得到Java的源代码,如下图:

4. 使用Apktool反编译apk,得到smali反汇编代码

终端执行命令: apktool d -f Wish.apk -o Wish , 如下图:

此时,得到Wish文件夹,里面包含apk中的xml、切图等资源文件和可供分析的smali反编译代码。

分析app_device_id字段生成算法

1. 快速定位app_device_id字段代码位置

jd-gui使用search功能快速定位app_device_id在代码中的位置,如下图:

可知,关键代码为:

paramHttpRequestParams.put(“app_device_id”, getDeviceId());

应用在每次进行网络请求的时候会上传app_device_id字段,字段对应的值为getDeviceId()方法中返回的值。所以接下来对该方法进行分析。

2. getDeviceId()方法分析

我们来先看getDeviceId()的代码实现:

从代码中可以很明显的将整个获取DeviceId的过程分为三部分:

(1)从SharedPreferences存储中取出DeviceUuid。

代码段为:

(2)如果SharedPreferences中没有保存DeviceUuid值的话,就从本地的文件夹中取,文件地址具体地址为/Document/Wish/device_data_。若得到值以后,通过SharedPreferences保存起来。

代码段为:

(3)如果本地文件中也没有的话,就创建一个(此时的情况跟安装应用后第一次进入的情形一样)。创建的过程使用了随机产生的方式,即java.util.UUID类中提供的randomUUID()方法。格式为:23c2add6-aa30-4442-97c8-81930766f089。 然后将得到的值以SharedPreferences的方式保存起来。

代码段为:

当获取到随机值后,新开线程将值保存在本地固定文件夹/Docment/Wish/device_data_下。

代码段为:

由于在run方法中出现/Error/,run()方法中的代码无法进行反编译。所以用smali进行验证。

3. smali代码分析新开线程保存DeviceUuid值在本地device_data的过程

smali文件夹中包含一下文件:

找到com.contextlogic.wish.api.core中的WishApi.smali,打开该文件定位到getDeviceId方法下,如图:(代码太多,故中间省略。)

逐步定位到新开线程的代码处:

从代码中可以看到,定义了一个局部变量writeableDeviceId来保存DeviceUuid值,然后开启一个线程,跳转到WishApi2.smali中去。打开WishApi2.smali代码,

代码中就只有一个run()方法。

在run()方法中,一共就干了两件事,

(1)定位到/Document/Wish/device_data。如果存在,就直接定位到该文件下;如果不存在,就新建Wish文件夹,新建device_data。

(2)打开FileOutputStream将值写入到device_data_文件中去。

总体流程

大致流程图如下:

在手机中路径/Docment/Wish/devicedata保存下来的值:

与抓包得到的数值吻合:

总结:

由于app_device_id字段对应的值是随机产生的,但是由上述代码分析可知,每一次访问网络的时候都要发送app_device_id字段,这就要求对应值要是唯一的,以确保进行操作的设备是安全的。而这里对实现唯一的方法就是永远只随机产生一次,通过SharedPreferences和File方式分别把值分别保存下来。只有当应用卸载重新安装并且删除本地文件device_data的时候才会重新随机产生一个app_device_id值,然后一般用户是不会在删除应用的时候同时找到它所保存的文件路径并删除,这就达到了设备ID的唯一性。

时间: 2024-10-25 18:32:57

Wish App逆向分析app_device_id字段生成算法的相关文章

一文了解安卓APP逆向分析与保护机制

"知物由学"是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道."知物由学"希望通过一篇篇技术干货.趋势解读.人物思考和沉淀给你带来收获的同时,也希望打开你的眼界,成就不一样的你. 以下为文章正文: 想知道Android App常见的保护方法及其对应的逆向分析方法吗? 网易云易盾资深安全工程师 钟亚平 3月17日,安卓巴士全球开发者论坛在重庆举办,网易资深安全工程师钟

CLion注冊码算法逆向分析实录(纯研究)

声明 CLion程序版权为jetBrains全部.注冊码授权为jetBrains及其付费用户全部,本篇仅仅从兴趣出发,研究其注冊码生成算法. 不会释出不论什么完整的源码. 网上查了下.已有注冊机,所以想要key的同学不要找我:p 背景 打算学习cocos2dx,奈何vim仅仅会ggvG,被jetBrains惯坏了,找到了CLion,试了下,果然神器.我等菜鸟正好能够拿来愉快地学习书写c++了. 可是,试用版有30天的限制.又没有学生授权.懒得折腾,看下它的注冊算法吧. 本篇用到的主要工具和命令:

Android无需权限显示悬浮窗, 兼谈逆向分析app

最近UC浏览器中文版出了一个快速搜索的功能, 在使用其他app的时候, 如果复制了一些内容, 屏幕顶部会弹一个窗口, 提示一些操作, 点击后跳转到UC, 显示这个悬浮窗不需要申请android.permission.SYSTEM_ALERT_WINDOW权限. 如下图, 截图是在使用Chrome时截的, 但是屏幕顶部却有UC的view浮在屏幕上. 我使用的是小米, 我并没有给UC授悬浮窗权限, 所以我看到这个悬浮窗时是很震惊的. 截图 悬浮窗原理 做过悬浮窗功能的人都知道, 要想显示悬浮窗, 要

CLion注册码算法逆向分析实录(纯研究)

声明 CLion程序版权为jetBrains所有.注册码授权为jetBrains及其付费用户所有,本篇只从兴趣出发,研究其注册码生成算法. 不会释出任何完整的源代码. 网上查了下,已有注册机,所以想要key的同学不要找我:p 背景 打算学习cocos2dx,奈何vim只会ggvG,被jetBrains惯坏了,找到了CLion,试了下,果然神器,我等菜鸟正好可以拿来愉快地学习书写c++了. 但是,试用版有30天的限制,又没有学生授权,懒得折腾,看下它的注册算法吧. 本篇用到的主要工具和命令: jd

逆向分析之定位算法的一些经验

当开始逆向分析一个300M的图像处理软件的一个功能时,才发现之前玩逆向都是小打小闹,一个多月的奋斗,终于搞定了.很希望遇到问题,因为这样才能学到新的东西,事实上确实遇到了不少问题,也学到了很多经验. 之前的逆向都是直接扔到OD就开始调试,而现在知道在虚拟机里运行,因为这么大的软件不是一两个小时就可以搞完的,在虚拟机里直接快照拍摄,就像游戏存档一样,这样可以避免每次运行软件的注册激活,避免重复之前的分析,避免内存地址动态变化等等,好处多多. 分析算法的难点之一是定位核心算法.对于有软件保护的软件就

逆向分析智能窗帘频射协议

近来我热衷于对家庭自动化设备的破解,然后将它们添加到我的Homekit集成包之中.这事情要从几个月前说起,当时我爸订购了大批量的RAEX 433MHz射频电动窗帘,以替代老式的手动式窗帘. 注意:你可以在Spotlight网店搜索Motion Motorised Roller Blind找到该窗帘. 我对这个电动窗帘非常满意,有了它我就不用跑上跑下的去打开/关闭窗户,可是为了控制它们,你需要购买RAEX的遥控器.RAEX有许多不同类型的遥控器产品,其中我选择购买了以下两种遥控器: R 型遥控器

Android逆向分析(2) APK的打包与安装

http://blog.zhaiyifan.cn/2016/02/13/android-reverse-2/ 2/18日增加对aidl和java编译的描述. 前言 上一次我们反编译了手Q,并遇到了Apktool反编译直接crash的问题,虽然笔者很想在这次解决这个问题,但在解决途中,发现该保护依赖于很多知识,所以本次先插入一下,正所谓知其然知其所以然,授之鱼不如授之以渔,只有知道一些基本原理,才能让我们以后能自行解决更多问题. 那么,你知道么?从我们在Android Studio中,点击run,

“金山杯2007逆向分析挑战赛”第一阶段第二题

注:题目来自于以下链接地址: http://www.pediy.com/kssd/ 目录:第13篇 论坛活动 \ 金山杯2007逆向分析挑战赛 \ 第一阶段 \ 第二题 \ 题目 \ [第一阶段 第二题] 题目描述: 己知是一个 PE 格式 EXE 文件,其三个(section)区块的数据文件依次如下:(详见附件)  _text,_rdata,_data 1. 将 _text, _rdata, _data合并成一个 EXE 文件,重建一个 PE 头,一些关键参数,如 EntryPoint,Imp

“金山杯2007逆向分析挑战赛”第一阶段第一题分析

题目来自于如下网址: http://www.pediy.com/kssd/ 第13篇 论坛活动 \ 金山杯2007逆向分析挑战赛 \ 第一阶段 \ 第一题 \ 题目 \ [第一阶段 第一题]: 现将此题目概述粘贴如下: CrackMe.exe 是一个简单的注册程序,见附件,请写一个注册机: 要求: 1. 注册机是KeyGen,不是内存注册机或文件Patch 2. 注册机可以使用ASM,VC,BC,VB,Delphi等语言书写,其他谢绝使用. 3. 注册机必须可以运行在Windows系统上. ..