APP逆向百例|02|某app签名验证去除

简介: APP逆向百例|02|某app签名验证去除
样本:aHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL3MvaEszbTd0akZ3d3I=

观前提示:

本文章仅供学习交流,切勿用于非法通途,如有侵犯贵司请及时联系删除

0x1 重新签名

这次app是随机找的一个例子 学习下来 个人感觉还不错

先把apk安装到手机上看看正常是咋样的

这个时候打开是正常的

本次用到的工具有apktool,AndroidKiller

这里为了触发验证 那我就直接对app签名啦

打开AndroidKiller->工具->APK签名

导入apk并选择签名AndroidKiller执行即可得到一个带_sign后缀的apk


将重新签好名的apk安装到手机上打开看看效果

这里就是触发签名验证了 每次打开立刻崩溃


0x2 Smali插桩

打开AndroidKiller导入apk

一般的签名验证都会在MainActivity的onCreate中做检测 或者在so的JNIonload做检测 至于我为啥这么说 因为这是网上告诉我的

找到onCreate 看看做了啥骚操作

好像有很多 图都截不完

那去掉不可疑的代码 看看还有多少

public void onCreate(Bundle bundle) {
        ADRTLogCatReader.onContext(this, "com.aide.ui");
        super.onCreate(bundle);
        setContentView(R.layout.main);
        qian(226776851);
        this.eee = bug();
        if (this.eee.equals("")) {
            Toast.makeText(this, 1, 1).show();
        }
    }

其中的qian bug这俩个东西就很可疑 要想代码能执行到哪一个步骤可以用log插桩

只需要在smali代码对应位置插入log代码即可

const-string v0, "linnnn-step1"
invoke-static {v0}, Lcom/android/killer/Log;->LogStr(Ljava/lang/String;)V

记得在相应的位置放入android.killer.Log包 否则是会报错的

这个包是AndroidKiller里面有的 可以去软件里面找

刚开始 我是用AndroidKiller的回编译 但是每次都失败了

更换了版本 更换了ShakaApktool.jar 一样是失败

后面我改用apktool.jar 来回编译就成功了

这告诉我 不能在一棵树上撞死 要多换几棵树 万一成了呢

反编译
java -jar apktool.jar d apk路径
回编译
java -jar apktool.jar b apk路径 -o apk输出路径

这里我插入了四个位置

分别是qian运行前和运行后

分别是bug运行前和运行后


插好后回编译装机测试

打开android_studio->Logcat

信息很多 过滤一下 我这里就输入我输出的标识linnnn

到这里就插好Log了


0x3 监测点剔除

从上图可以看到输出内容到了step1就截止了 也就是说qian这个方法做了操作

jadx-gui打开看看

这里流程很明了 就是签名的hashcode和传入的i做对比

如果不对 就触发崩溃方法

Toast.makeText(this, 1, 1).show()

那直接改Smali 代码 把 != 改为 ==即可

也就是

参考文章:https://blog.csdn.net/qq_24490341/article/details/104239234

修改后重新回编译重新签名装机测试看Logcat输出

app运行后没崩溃 也没正常运行

Logcat里面循环输出 step1 2 3


看来 bug还是有问题 看jadx-gui

public native String bug();

居然是native函数

static {        System.loadLibrary("bug");    }

加载了libbug.so 该上我们的大姐姐了

等待ida加载完后点击Exports查看导出函数列表

一眼就看到了bug这个静态注册的方法 双击进去

再按下tab 或者 f5转为伪c代码

可以看到函数不复杂 先先File->Load File->Parse C header file导入一下jni.h

然后a1右键选择Convert to struct*

选择JNIEnv即可

变量名也可以配合rename来分析哦

效果如图

接着进去getSignHashCode这个方法看看

能看到这个方法有俩个变量 而上面的图中没有 不用太怀疑 是ida识别的问题

习惯就好

getSignHashCode里面的a1需要改为JNIENV 然后就可以开始看代码流程了

流程清晰明了 反正就是调用了各种方法取sign取hashcode的操作最后和 226776851这个数值做对比 如果对不上 就exit(0)

知道要怎么做了就动手啦

Tab回到IDA View-A

看到exit语句这里下面有显示地址

MOVS    R0, #0          ; int     ->00000D0CBLX     exit->00000D0E

单击语句 跳到Hex-View 1 即可看到高亮处

右键->Edit

将上面高亮处改为00 00

右键->Apply changes 保存修改

改完效果

回到伪代码中可以看到 if语句包括里面的exit都给干掉了

最后保存修改好的so即可

Edit->Patch Program->Apply patch to input file

输出好后替换原先的libbug.so 重新回编译重新签名装机测试

app正常运行

Logcat输出正常

到此改包完成

完美撒花 感谢各位大佬观看

整篇比较啰嗦 如有错误 还请海涵

共同进步


[完]

相关文章
|
6月前
|
开发者 iOS开发
【教程】无法验证 app 需要互联网连接以验证是否信任开发者
【教程】无法验证 app 需要互联网连接以验证是否信任开发者
|
6月前
|
存储 Java API
Android 浅度解析:mk预置AAR、SO文件、APP包和签名
Android 浅度解析:mk预置AAR、SO文件、APP包和签名
821 0
|
Android开发 iOS开发 MacOS
APP备案公钥、证书MD5指纹/签名MD5值获取最简单方法
APP备案公钥、证书MD5指纹/签名MD5值获取方法,Android安卓平台、Windows平台、macOS平台,三个平台获取方法, Android平台使用 APP备案助手,各大安卓应用市场搜索 APP备案助手 即可,Windows/macOS平台使用jadx-gui工具。
3436 2
|
Web App开发 iOS开发
无法安装此app,因为无法验证其完整性 ,解决方案
无法安装此app,因为无法验证其完整性 ,解决方案
|
API 开发工具 Android开发
解决 Android App 上架 Google play后 ,签名变更,第三方sdk无法登录
解决 Android App 上架 Google play后 ,签名变更,第三方sdk无法登录
289 0
|
开发工具 Android开发 iOS开发
2023年APP备案操作教程 阿里云APP备案试列 APP公钥sha1签名获取方法
核心要点:A,域名之前是哪里备案的,APP备案就到哪里去做,方便简单;B,APP备案核心预存信息为APP包名、MD5指纹(安卓)、sha1签名(IOS)、公钥;这3个信息请找APP开发人员获取;一门开发的可以自行到开发者后台【配置】-【证书与包名】获取对应安卓、苹果APP信息。
|
9天前
|
C# Windows
【Azure App Service】在App Service for Windows上验证能占用的内存最大值
根据以上测验,当使用App Service内存没有达到预期的值,且应用异常日志出现OutOfMemory时,就需要检查Platform的设置是否位64bit。
32 11
|
3月前
|
API C#
【Azure App Service】验证App Service接受HTTP 2.0请求
【Azure App Service】验证App Service接受HTTP 2.0请求
|
3月前
|
开发框架 安全 前端开发
【Azure 应用服务】应用代码需要客户端证书进行验证,部署到App Service后,如何配置让客户端携带证书呢?
【Azure 应用服务】应用代码需要客户端证书进行验证,部署到App Service后,如何配置让客户端携带证书呢?
|
3月前
|
网络协议 Linux Shell
【Azure 应用服务】App Service For Linux 中安装paping, 用于验证从App Service向外请求的网络连通性
【Azure 应用服务】App Service For Linux 中安装paping, 用于验证从App Service向外请求的网络连通性