【Android逆向】某python环境app回编译后的This copy of software is corrupted and is not safe to use问题分析

本文主要是介绍【Android逆向】某python环境app回编译后的This copy of software is corrupted and is not safe to use问题分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

前言

一、分析思路

1、谁在做校验

2、用来校验的是什么

3、发送错误信息的方式

4、修改思路

二、修改后的效果

1.pip已经能正常使用

2.个别库安装还是有些问题,个别sample脚本运行还有问题

总结



前言

前一篇博文【五一创作】【Android逆向】某python环境app的PREMIUM内容展示分析_疑燃的博客-CSDN博客讲到,界面按钮虽然修改成功了,但实际上是运行不起来的,apk做了包校验,库不能安装成功,提示This copy of software is corrupted and is not safe to use.
To fix this error, uninstall your copy and do a clean install of this app from an official source (e.g. Google Play)

最近花了一些时间分析和验证这件事,主要是寻找这个是被谁校验了,校验的什么,怎样发出的这种错误信息,以及怎样解决。


一、分析思路

1、谁在做校验

在logcat日志里搜一下这个报错信息,发现日志除了打印这个信息,前面还有pip:out:的关键字:

 在反编译的代码里面找一下这个关键字,找到对应代码位置:

 继续分析代码,发现python脚本是通过java的Runtime.getRuntime().exec来调用的:

 所以构造日志,把拼接的命令打印出来,方法是去修改smali,这个在上一篇博文提到过,这里就不再多说了:

public void m51b(String str) {ProgressBar progressBar = new ProgressBar(m14462f(), null, 16842874);progressBar.setTag("progress_bar_tag");this.f14851Z.addView(progressBar);this.f14856e0 = new StringBuilder();PowerManager.WakeLock newWakeLock = ((PowerManager) m14462f().getSystemService("power")).newWakeLock(536870918, "pip:wakelock");newWakeLock.acquire();this.f14862k0 = true;this.f14851Z.setOnTouchListener(new View.OnTouchListener() { // from class: .pipactivity.f@Override // android.view.View.OnTouchListenerpublic final boolean onTouch(View view, MotionEvent motionEvent) {return C4866r.this.m59a(view, motionEvent);}});this.f14852a0.post(new RunnableC4868b());try {Process exec = Runtime.getRuntime().exec(C4821a.m165f((Activity) m14462f()) + " sh ", (String[]) null, new File(C4821a.m149o(m14462f())));try {BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(exec.getOutputStream()));String str2 = C4821a.m152l(m14462f()) + " ; /data/user/0/XXXX/files/busybox sh /storage/emulated/0/pd_before_act/pd_before_act.sh && /data/user/0/XXXX/files/aarch64-linux-android/bin/python " + str + " ; exit\n";Log.d("===", str2);bufferedWriter.write(str2);bufferedWriter.flush();Log.d("execBench", "writed");} catch (Exception e) {this.f14857f0 = false;e.printStackTrace();}Handler handler = new Handler();new Thread(new RunnableC4869c(exec)).start();new Thread(new RunnableC4870d(exec, handler, newWakeLock)).start();new Thread(new RunnableC4872e(exec)).start();} catch (Exception e2) {e2.printStackTrace();}}

这里需要说明的是:

a.日志以===开头,是便于查找,大家也可以根据自己的喜好,使用其他的关键字;

b.修改命令拼接串,加入的 /data/user/0/XXXX/files/busybox sh /storage/emulated/0/pd_before_act/pd_before_act.sh 是为了方便调试,添加的一个外接脚本,好处是可以不重新回编译,就可以通过在脚本里面加shell命令,来达到调试的目的,只要功能一运行到这里,就会执行脚本里面的语句。

c.busybox和python路径是怎么找到的:也是通过日志插桩确定的,但如果使用的是模拟器,而且root了,就方便多了,可以看得到文件路径。

 加日志是一个好方法,工作量小,比动态调试的动静小多了,这个的效果如下,拼接的命令打印出来就很清楚了:

 

在调试中发现,其他的shell命令都能正常执行,但只要一碰到运行python,就会报错,那问题应该就出在这里,apk的作者应该是对python做了一些修改。但是改的哪里,是python主文件还是so文件,需要确定。apk自带的python3.8,依赖libpython3.8.so.1.0这个库文件,为了确定是哪个被修改了,我另外找了一个python3.8,把LD_LIBRARY_PATH改成apk的python的lib路径,运行就会报错,这就确定了是libpython3.8.so.1.0被改了。

 走到这一步,就基本已经确定了方向,为此耗费了大量的时间。

2、用来校验的是什么

这个需要从分析libpython3.8.so.1.0这个so文件入手,但这个使用IDA反编译出来,搜索不到报错信息,需要用动态调试来做了,但是这个是python的so,并不是apk的so,apk的动态调试方法可能并不适用,而且汇编,哎。。。太过枯燥,就放弃了。大家如果有兴趣,可以自行研究一下。

回到问题本身,如果没办法从代码找到证据确定校验内容,也可以猜测一下。一般这种校验会校验些什么。我能想到的最明显的一个就是签名和原来的包不一致,可能会用来做校验;另外,反编译出来之后,会和原来包里的同一文件出现不一致的情况,暂时还想不到。

3、发送错误信息的方式

确定了修改点之后,发送方式基本也就确定了,那就是so文件回复的内容。

4、修改思路

如果对so文件反编译,而且有兴趣去研究汇编和动态调试,那可以尝试修改so文件,这样的副作用是最小的,至少包的依赖不会出现问题;

另一种方法,把libpython3.8.so.1.0替换掉,可以另外找一个,甚至可以自己编译一个,但是因为不能确定apk中的so的编译参数,所以用别的so文件来替换,可能会出现一些未知的问题。我暂时先用这种方法,替换了libpython3.8.so.1.0和_posixsubprocess.cpython-38.so。对这件事,做到这一步,就可以告一段落了,再去编译一个python,再去调apk本身的功能,这明显已经超纲了,之后有时间再尝试吧。

二、修改后的效果

1.pip已经能正常使用

2.个别库安装还是有些问题,个别sample脚本运行还有问题

这些问题就没有一个一个的去试了,按照具体错误提示,分析修改就行了。


总结

花了很多时间,终于把报错的原因分析出来了,作者的校验思路和校验点真是出乎意料。虽然距离真正解决这个错误,还有一小段路要走,但对于apk的逆向来说,该做的都已经做了。在这个过程中,通过填坑,也积累了不少经验教训,这个apk在包校验上也算得上一个逆向分析教科书式的存在了。

修改后的apk暂时还没有打包上传,这个事情近期应该会完成,如果有需要,可以联系我获取。

这篇关于【Android逆向】某python环境app回编译后的This copy of software is corrupted and is not safe to use问题分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/221099

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss