android jni 反调试,[原创]逆向分析反调试+ollvm混淆的Crackme

最近学了点ollvm相关的分析方法,正好之前朋友发我一个小demo拿来练练手.

38fe5cbab18b51b49ebb38e33d57be05.png

看上去很简单 就是找flag用jadx打开发现加壳了

808372011c0e26f6a5acdc57772ac0b7.png

然后想试试直接用fridadexdump脱壳的时候发现frida上就崩了

480dfc2227057626d5c8fbb98181d622.png

上葫芦娃的strongfrida 直接重启了!....

这只能去过反调试了,打开so找了下.init和.initarray(反调试常见位置,so比较早的加载时机)

099a7b09d42f61ce902abadaf19c1814.png

ctrl+s 打开 initarray里面有两个奇怪的函数 decode,这就是ollvm默认的字符串加密

5bab8f1ee7a60d17fdad084288e70aa2.png

导出函数中搜索init 找到里面也有函数定义,创建了一个线程执行反调试函数,进入这个函数看到字符串都被加密了

1af29bda4dc26bed8e02b2117be1b9c6.png

看了下代码 有个kill函数,一开始就行hook kill函数不让他自杀,发现没用...

e60db751655dfa42ef147af1d1699849.png

然后我继续找了下发现有个strstr函数 这有点可疑,拿来比较字符串的,直接hook一波

b2a13d81167bdd9188333dce1add85ca.png

从代码中得知str2是我们要关心的对象,是个char*类型直接readCstring打印

然后发现出现很多frida 然后进程就崩了

045fc34b0afa03868aa9ebae58ab0bed.png

所以接下来就有两种方法 直接hook create_pthread不让这个线程程起来 和 hook strstr,我这就直接hook str了.

e5a438f99b498ab847b3218f47df43c9.png

然后就不崩了,可以愉快的frida了~

先拖个壳,Fridadexdump一波(可以直接fart脱的全,但是懒的刷机,直接用这个了..),hook events定位

7315d43c523559f48163bbaca9510673.png

065374245291de840161dd7a8a464822.png

oncreate直接是native化了 应该是360的vmp, 这里肯定不是让你逆360的vmp,盲猜一波就是check方法,先hook一下.

6d2174f1122ac06f787376b7db310109.png

直接返回false,应该是true就会拿到flag,为了不每次都手动输入 直接写个主动调用.

7fb153990d958453f49ef11e9ae61d97.png

接下来去看so了,导出函数就这几个..肯定是动态注册,先直接hook

1ab238e46b6522e79ba4faa7d111298e.png

a11f83b58aad83b56f5ddaa30f6f7873.png

hook到了偏移,去so看一下

b7f9c02e9d52d02fea5e2531d289a592.png

改了些名字后 操作流程就是将输入的jstring转为char* 然后判断长度是否为20看到很多都是unk_开头的,这些就是被ollvm加密后的字符串,要怎么看他解密后的内容呢?因为他加载到内存的时候肯定是解密状态,直接读这个地址打印cstring就可以得到解密后的字符串了.

664d3d13d3c836ee7bc5c2a2ed2da08f.png

然后继续改名,改完名字就是这样

e057c556e7b63b7b871a445b27ce74c4.png

发现他重新对check的方法进行了动态注册,然后sub_1234 里面也进行了动态注册里面嵌套了好几次动态注册,然后用strcmp比较 输入的值和 &unk_5100(解密后为kanxue) 如果相等那就返回true. 但是输入要20个字符 kanxue 只有6个字符,我们hook一下这个比较的地方看看,

直接hook strcmp蹦的比较厉害,我选择inlinehook,按tab切换到汇编,打开opcode,s1的值给到了R0 我选择在0x1564进行hook,因为是 2个opcode 所以为thumb指令,需要地址+1

2859a280af7a9001e9dd0927671d3603.png

10300f61fa3b57f659554bcab77d7569.png

27233d02b5f346474ef94de0f09c7483.png

我们输入了kanxue00000000000000,hexdump打印s1,发现s1就是kanxue,但是程序没提示通过,然后hook registernative hook到他又进行了2次动态注册,根据这个地址 我们往前找

dfae7ac2b76df187e892299d243d26ff.png

ee21cd4b539695cd0211282b2440976d.png

发现第二次动态注册的和最开始的代码很像,第三次就短了很多,然后仔细一看第二次动态注册中又注册了sub_1148, 原来就是嵌套了3次动态注册,注册了3个函数,根据一开始的分析 对strcmp这里的字符串解密

8b1f9951859d0a3c6101bf4c1a6ec974.png

然后inlinehook剩下几个分别strcmp验证下

6fbf75e11677711ae644f96a0fb874ed.png

发现第二次比较是输入的8个0 这样区分不了是第几个输入,我们用abcd来实验,输入kanxueabcdefghieklfn 20个字符

ca67ec14a90496d1c6ce67dd69d66224.png

是abcdefgh 这8个,所以是加到kanxue后面的,然后真正的字符串之前我们已经解密了,是unk_50F7(即为training),然后后面猜也猜得到剩下6个字符是之前解密的unk_5096(即为course) 为了保证严谨性,我就在inlinehook一次

55a5102f470a9eaa30ec130146e789b1.png

果然就是我们最后六位进行比较 所以答案前面的解密的字符合起来,就是 kanxuetrainingcourse

638812dbb406d061393b28581a019cf7.png

24c6bf7e7eecb7644b0ac865f40270c5.png

这里有个bug 每次输错都要重启一次,不然到最后答案就变成course或者trainingcourse了~

上传的附件:

2、找出flag.apk

(2.36MB,44次下载)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值