样本: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输出正常
到此改包完成
完美撒花 感谢各位大佬观看
整篇比较啰嗦 如有错误 还请海涵
共同进步
[完]