ollvm混淆的某apk题目的逆向分析
打开jadx,就发现了我们的老朋友数字壳

典型的类抽取壳,直接上fart脱就完事了,我这里使用的是fart的frida脚本,省去了刷机的步骤
这里的脱壳脚本,自行去github的寒冰大佬那边clone 一份下来,注意一点,就是fart.so和fart64.so copy在/data/local/tmp
下,或者sdcard下,直接拷到/data/data下面,没权限,所以先做个过渡,先把文件放到我们能控制的地方,再adb shell进入机子,su切换成root,再cp过去

筛选出dex

jadx打开dex,查看逻辑

native的函数对我们传入的字符串进行校验,ida直接安排上发现是静态注册,继续跟进去

发现函数都被加了ollvm,不过混淆的强度不是很高

耐心的看分发变量的取值,跟着逻辑走一遍,还是可以看出执行流程的,直接跟进核心逻辑

这里也可以和上面一样慢慢跟,但是有快的方法,这里想到是直接在每个函数中加个log,这样的话,当每次执行的
时候,log也会根据执行顺序打印出来。
7.

8. 因为写之前已经知道,考点是常用的加解密算法,所以我直接把参数和返回值dump出来看看

没法全部截图出来,这里也主要是记录下思路,发现返回值最后有两个等号,很有可能是base64,自己
本地解密后,和传入的参数比较,发现就是base64加密
9.发现这个函数,返回值都是16字节,说明是个哈希算法,盲猜md5,sha1之类

用fincrypt搜下常量,并没有搜到关于哈希的东西

反而是搜到aes,查看了下引用,发现就是在上面sub_D7EC函数中
10.怀疑是把常量嵌入到汇编中了,所以直接ida文本搜索下

这里我ida抽风了,之前可以搜到,刚刚又搜不到,但是查看引用,实锤了那个函数就是md5
11.基本逻辑差不多就捋清楚了,先经过md5加密,然后base64,然后aes,然后base64
至于密文,直接hook libc中的strcmp函数,把参数dump出来就好了,但是注意这个是系统的api,hook的话,
会有很多app调用这个函数,所以手法就是在hook最后一个执行函数后,再进行hook,这样就不会又那么多的
干扰
12.放下我hook脚本
function hookStrcmp()
{
var libcmodule=Process.findModuleByName("libc.so");
var strcmp_addr=libcmodule.findExportByName("strcmp");
Interceptor.attach(strcmp_addr,{
onEnter:function(args){
console.log("strcmp_addr_args[0]->",hexdump(args[0]));
console.log("strcmp_addr_args[1]->",hexdump(args[1]));
},onLeave:function(retval)
{
console.log("strcmp_addr_retval->",retval);
}
})
}
function main()
{
/*
sub_428BC(*(_DWORD *)(v9 - 8), v32);
sub_42888(v10);
sub_8748(v32, 16);
sub_D7EC(&unk_540C5, *v33); // 第二块的代码
strcmp(*v34, *v37);
*/
var libnativemodule=Process.findModuleByName("libnative-lib.so");
var libnativebaseadd=Module.findBaseAddress("libnative-lib.so");
var testjni=libnativemodule.findExportByName("Java_com_kanxue_test2_MainActivity_jnitest");
var sub_428BC=libnativebaseadd.add(0x428BC).add(0x1);
Interceptor.attach(sub_428BC,{
onEnter:function(args){
console.log("get into sub428BC:arg0->",hexdump(args[0]));
console.log("get into sub428BC:arg1->",hexdump(args[1]));
},onLeave:function(retval)
{
console.log("end into sub428BC:retval->");
}
});
var sub_42888=libnativebaseadd.add(0x42888).add(0x1);
Interceptor.attach(sub_42888,{
onEnter:function(args){
console.log("get into sub42888:arg0->");
},onLeave:function(retval)
{
console.log("end into sub42888:retval->");
}
});
var sub_8748=libnativebaseadd.add(0x8748).add(0x1);
Interceptor.attach(sub_8748,{
onEnter:function(args){
console.log("get into sub_8748:arg0->",hexdump(args[0]));
console.log("get into sub_8748:arg1->",16);
},onLeave:function(retval)
{
console.log("end into sub_8748:retval->",hexdump(retval));
}
});
var sub_D7EC=libnativebaseadd.add(0xD7EC).add(0x1);
Interceptor.attach(sub_D7EC,{
onEnter:function(args){
console.log("get into sub_D7EC:arg0->",hexdump(args[0]));
console.log("get into sub_D7EC:arg1->",hexdump(args[1]));
},onLeave:function(retval)
{
console.log("end into sub_D7EC:retval->",hexdump(retval));
hookStrcmp();
}
});
}
ollvm混淆的某apk题目的逆向分析的更多相关文章
- Android应用安全防护和逆向分析 ——apk反编译
概述 最近一直在学习Android应用安全相关和逆向分析的知识.现在移动app在安全方面是越来越重视了,特别是那些巨头企业涉及到钱的应用,那加密程度,简直是丧心病狂,密密麻麻.从这里可以看出,对于应用 ...
- Android逆向分析(2) APK的打包与安装背后的故事
前言 上一次我们反编译了手Q,并遇到了Apktool反编译直接crash的问题,虽然笔者很想在这次解决这个问题,但在解决途中,发现该保护依赖于很多知识,所以本次先插入一下,正所谓知其然知其所以然,授之 ...
- Android逆向分析(2) APK的打包与安装
http://blog.zhaiyifan.cn/2016/02/13/android-reverse-2/ 2/18日增加对aidl和java编译的描述. 前言 上一次我们反编译了手Q,并遇到了Ap ...
- Android Studio(十一):代码混淆及打包apk
Android Studio相关博客: Android Studio(一):介绍.安装.配置 Android Studio(二):快捷键设置.插件安装 Android Studio(三):设置Andr ...
- 一文了解安卓APP逆向分析与保护机制
"知物由学"是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道."知物 ...
- 20145307陈俊达_安卓逆向分析_dex2jar&jd-gui的使用
20145307陈俊达_安卓逆向分析_dex2jar&jd-gui的使用 引言 这次免考选择了四个项目,难度也是从简到难,最开始先写一个工具的使用 想要开发安卓首先要会编写代码,但是想要逆向分 ...
- [Android Security] Smali和逆向分析
copy : https://blog.csdn.net/u012573920/article/details/44034397 1.Smali简介 Smali是Dalvik的寄存器语言,它与Java ...
- 20145307陈俊达_安卓逆向分析_Xposed的hook技术研究
20145307陈俊达_安卓逆向分析_Xposed的hook技术研究 引言 其实这份我早就想写了,xposed这个东西我在安卓SDK 4.4.4的时候就在玩了,root后安装架构,起初是为了实现一些屌 ...
- 20145307陈俊达_安卓逆向分析_APKtools分析smail
20145307陈俊达_安卓逆向分析_APKtools分析smail 引言 真刺激呢!到了第二篇博客了,难度开始加大,之前是简单的dex2jar和有图形界面的jd-gui,现在来隆重介绍强大的反汇编工 ...
随机推荐
- 【备忘】ffmpeg推流命令
1 组播推流 ffmpeg -re -i "D:\\OTT\\adghg2323.mp4" -vcodec libx264 -vprofile baseline -level 30 ...
- BLDC 无刷电机FOC驱动 STM32官方培训资料
STM32 PMSM FOC SDK V3.2 培训讲座一http://v.youku.com/v_show/id_XNTM2NjgxMjU2.html?from=s1.8-1-1.2STM32 PM ...
- Docker的镜像理解以及容器的备份、恢复和迁移操作
Docker的镜像理解以及容器的备份.恢复和迁移操作 这篇文章主要介绍了Docker的镜像理解以及容器的备份.恢复和迁移操作,覆盖很多原理知识以及容器的重要操作步骤,极力推荐!需要的朋友可以参考下 D ...
- DLL重定向处理
说明 目前正在做的项目批次功能涉及第三方插件,而第三方插件需依赖4.* 版本的Newtonsoft.Json.dll,由于现有功能已经使用6.*版本的Newtonsoft.Json.dll,故采用了d ...
- python 判断对象是否相等以及eq函数
当对两个点的实例进行值的比较时,比如p1=Point(1,1) p2=Point(1,2),判断p1==p2时__eq__()会被调用,用以判断两个实例是否相等.在上述代码中定义了只要x和y的坐标相同 ...
- maven工具使用json-lib时,JSONArray.fromObject()不能执行的解决方案
前端代码我就不展示了 ,下面说明下我遇到问题的情况,如果不想看可以直接划到黄色字体部分直接找解决方法哦~~(相关jar包我会放在云中,想要的自己下载哦,链接在视频最下面!!) 我的pom文件,如下,导 ...
- docker仓库登录 配置insecure-registries
1. 配置/etc/docker/daemon.json # cat /etc/docker/daemon.json { "registry-mirrors": ["ht ...
- Step By Step(Lua迭代器和泛型for)
Step By Step(Lua迭代器和泛型for) 1. 迭代器与Closure: 在Lua中,迭代器通常为函数,每调用一次函数,即返回集合中的"下一个"元素.每个迭代器都 ...
- GO语言复合类型01---指针
package main /* %T 类型占位符 %v 值占位符 %p 地址(指针)占位符,只有地址才能替换%p &value 对值取地址 *addr 对地址取值 **int 指向int型指针 ...
- OneFlow系统设计
OneFlow系统设计 本文的主要内容如下: OneFlow 的设计目标 OneFlow 的特色一:Actor 机制 OneFlow 的特色二:SBP 机制 总结 一.OneFlow 的设计目标 On ...