12下一页
返回列表 发新帖

去ollvm混淆,得到Vmos pro消息解密算法

[复制链接]

4

主题

166

帖子

3598

积分

大学生

Rank: 5Rank: 5

金币
110
好评
16
贡献
0
发表于 2020-8-22 22:42:43 | 显示全部楼层 | 阅读模式
本帖最后由 meanwhile 于 2020-8-22 22:42 编辑

以vmos pro 为例, 练习一下去ollvm混淆来获得其消息解密的算法   
vmos pro 1.1.11之前消息都是明文传送的, 1.1.12开始加某数字壳和消息加密, 目前知道的破解方法主要有3种, 一种是直接使用mhook等方式hook函数返回, 这种方法最为方便, 只需要简单脱壳, 理一下程序的逻辑就可以了,另一种可以通过黄鸟注入服务器的返回值, 我觉得这个方法比较保险,因为在我的手机上发现它检测到框架后运行起来有些bug, 另外还有脱壳去签名重新打包, 这个方法最难, 只有白嫖其他大佬的成果了.  因为后面的版本加密算法都没有变, 这里就用最低版本1.1.12来测试  ,本次用到工具jeb、frida、ida、dwarf等   
首先脱掉某数字壳, 该应用是用Retrofit+Rxjava来实现网络请求, 找到GsonConverterFactory(好多开源的包都被混淆了,自己好好找吧)   
  
可以看到处理加密的函数为NativeUtil.decryptData(), 该函数是libnative-lib.so中的native函数, 然后解压apk得到so库用ida打开, 在导出表中没有直接找到该函数, 这一个jni动态注册的函数, 在string中搜索decrypt找到该函数的注册信息  
   
可以得到函数地址为0xa1a8, 由于函数被ollvm混淆了, 有大量寄存器跳转, ida不能正确确定函数的结尾地址, 需要自己手动确定函数的结束地址, 设置好之后函数的逻辑图如下:  
  
可以看到函数里有很多断掉的地方, 这些地方是混淆加入的包含"br x*" 、"blr x*"等指令的块,这些跳转是固定的, 我们去除混淆的思路就是找到它们真正的跳转地址然后patch成"b addr"的形式, 这样ida就能正常分析函数 , 先确定一下ollvm加入的控制块的基本格式  
  
跳转逻辑为先从数组中取得值,然后加上该函数块的基址,就为跳转地址, 而数组值在函数最开始确定, 然后编写ida python 脚本patch 函数, 因为ida装了keypatch插件附带keystone, 所以汇编使用keystone实现,脚本如下:  
  1. # -*- coding: utf-8 -*-
  2. import idc
  3. import idaapi
  4. import idautils
  5. from keystone import *

  6. ks=Ks(KS_ARCH_ARM64, KS_MODE_LITTLE_ENDIAN)
  7. def patch(addr,data,len):
  8.     ea=addr
  9.     for i in range(len):
  10.         idaapi.patch_byte(ea,data[i])
  11.         ea=ea+1


  12. def patch_function(begin_addr,end_addr,table):
  13.     graph=ida_gdl.FlowChart(None,(begin_addr,end_addr))
  14.     p = idaapi.node_info_t()
  15.     p.bg_color = 0xbbffff
  16.     for node in graph:
  17.         for addr in range(node.startEA,node.endEA,4):
  18.             isContrlBlock=False
  19.             if (GetDisasm(addr).startswith('BR') or GetDisasm(addr).startswith('BLR')) and GetDisasm(addr-4).startswith('ADD'):
  20.                 mov_addr=0
  21.                 n=0
  22.                 for i in range(8):
  23.                     asm=GetDisasm(addr-i*4)
  24.                     if(asm.startswith('MOV ')):#MOV x*,#
  25.                         mov_addr=addr-i*4
  26.                         isContrlBlock=True
  27.                         if asm.find('#')!=-1:
  28.                             n=int(asm[asm.find('#')+1:],16)
  29.                             break
  30.                 if isContrlBlock:
  31.                     idaapi.set_node_info2(begin_addr, node.id, p, idaapi.NIF_BG_COLOR | idaapi.NIF_FRAME_COLOR)
  32.                     data,count=ks.asm('nop')#MOV 到BR之间的指定基本我用,直接全填充nop
  33.                     patch(mov_addr,data*((addr-mov_addr)//4),addr-mov_addr)
  34.                     jumpaddr=node.startEA+table[n//8]
  35.                     if GetDisasm(addr).startswith('BR'):
  36.                         if abs(jumpaddr-addr)<0x10000000: ###防止跳转超过指令集上限,手动patch
  37.                             data,count=ks.asm('b '+str(jumpaddr),addr)
  38.                         else:
  39.                             print "addr "+hex(addr)+" need  analysis! "+"n="+str(n)
  40.                             data,count=ks.asm('b 0',addr)
  41.                     else:
  42.                         if abs(jumpaddr-addr)<0x10000000:
  43.                             data,count=ks.asm('bl '+str(jumpaddr),addr)
  44.                         else:
  45.                             print "addr "+hex(addr)+" need  analysis! "+"n="+str(n)
  46.                             data,count=ks.asm('bl 0',addr)
  47.                     patch(addr,data,len(data))
  48. table=[]

  49. patch(begin_addr,end_addr,table)
复制代码


当然也有少数例外的地方,这些地方需要自己手动修复,修复跳转后函数如下  
  
图中白色基本为程序的真实块,黄色的块为ollvm加入的控制块, 基本可以全部删除, 到这里可以基本确定程序的ollvm混淆方式为flat, 如果还有bcf混淆还需要进一步的分析(水平不够), 这里base64decode通过frida和dwarf调试分析函数的参数和返回值确定, 因为应用加壳, 常用的jeb、ida调试等都有反调试无法调试,反而用dwarf的hook框架的调试却很少出现问题  
接下来就是层层分析函数,去除ollvm, 最后得到解密方式为先base64解密, 然后与32位的密钥循环异或, 这里放个密钥前8位, 感兴趣可以自己自己抓包验证一下 (解密前几位应该能得到数据)  
[0xde,0xad,0x9c,0x09,0x20,0x3d,0xd6,0x0e]
觉得教程对你有一些帮助的话免费评个分吧,新人升级太难了


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
已有13人评分好评 金币 理由
㝱魇 + 1 + 1
daxia2002 + 1
小百ざ + 1 赞一个!
玄天 + 1 + 1
Away84 + 1
takpap + 1
豪♚雷 + 1 奥利给
尼斯湖水怪 + 1 + 5 必须给赞
北辰没有林安 + 1 + 1
小熊ctrl + 1 + 1
cheat + 1
快乐小牛 + 1 + 5
哔哩啪啦 + 1 + 1

查看全部评分 总评分:好评 +12  金币 +16 

回复

使用道具 举报

4

主题

166

帖子

3598

积分

大学生

Rank: 5Rank: 5

金币
110
好评
16
贡献
0
发表于 2020-8-22 23:10:12 | 显示全部楼层
我感觉这个帖子还是有一点点技术含量的啊,为什么没人给我个免费评分或则回复一下涨个热度啊
回复

使用道具 举报

74

主题

2922

帖子

1万

积分

版主

论坛萌新

Rank: 7Rank: 7Rank: 7

金币
3339
好评
170
贡献
1

考神MT论坛帅哥MT论坛活跃会员MT论坛最佳新人MT论坛侠客

QQ
发表于 2020-8-22 22:43:55 来自手机  | 显示全部楼层
这才是大佬操作啊,直接解密
回复

使用道具 举报

188

主题

2030

帖子

6546

积分

硕士生

大佬

Rank: 6Rank: 6

金币
412
好评
28
贡献
0

考神MT论坛最佳新人MT论坛帅哥MT论坛活跃会员

发表于 2020-8-22 22:44:17 来自手机  | 显示全部楼层
牛逼牛逼6666
回复

使用道具 举报

4

主题

166

帖子

3598

积分

大学生

Rank: 5Rank: 5

金币
110
好评
16
贡献
0
发表于 2020-8-22 22:45:05 | 显示全部楼层
快乐小牛 发表于 2020-8-22 22:43
这才是大佬操作啊,直接解密

大佬用你破解版好久了, 给个好友位吧
回复

使用道具 举报

3

主题

249

帖子

563

积分

初中生

Rank: 3Rank: 3

金币
178
好评
0
贡献
0

考神

发表于 2020-8-22 22:52:38 来自手机  | 显示全部楼层
看得懂的举手
回复

使用道具 举报

22

主题

3209

帖子

8346

积分

硕士生

滑稽

Rank: 6Rank: 6

金币
1306
好评
7
贡献
0
发表于 2020-8-22 23:05:12 来自手机  | 显示全部楼层
牛批牛批
回复

使用道具 举报

2

主题

145

帖子

1334

积分

高中生

Rank: 4

金币
203
好评
5
贡献
0

考神

发表于 2020-8-22 23:12:00 来自手机  | 显示全部楼层
活捉大佬一个,很像爱吾技术帖,
回复

使用道具 举报

1

主题

965

帖子

3354

积分

大学生

Rank: 5Rank: 5

金币
544
好评
2
贡献
1

考神MT论坛帅哥

QQ
发表于 2020-8-22 23:21:10 来自手机  | 显示全部楼层
可以真.大佬
回复

使用道具 举报

13

主题

2183

帖子

8081

积分

硕士生

Rank: 6Rank: 6

金币
211
好评
14
贡献
0

MT论坛最佳新人考神MT论坛活跃会员

QQ
发表于 2020-8-22 23:26:20 来自手机  | 显示全部楼层
ida万岁   
回复

使用道具 举报

317

主题

1万

帖子

3万

积分

版主

一个水怪

Rank: 7Rank: 7Rank: 7

金币
11199
好评
172
贡献
2

MT论坛灌水老大MT论坛最佳新人2019-5.1节快乐考神MT论坛侠客MT论坛活跃会员

发表于 2020-8-22 23:28:42 来自手机  | 显示全部楼层
牛批,必须给赞
回复

使用道具 举报

170

主题

6882

帖子

1万

积分

博士生

有点意思

Rank: 7Rank: 7Rank: 7

金币
2639
好评
202
贡献
1

考神MT论坛帅哥

发表于 2020-8-22 23:30:06 | 显示全部楼层
谢谢分享!!
回复

使用道具 举报

9

主题

1406

帖子

3486

积分

大学生

Greg

Rank: 5Rank: 5

金币
998
好评
2
贡献
0
QQ
发表于 2020-8-22 23:42:59 来自手机  | 显示全部楼层
坎坎坷坷看
回复

使用道具 举报

9

主题

1406

帖子

3486

积分

大学生

Greg

Rank: 5Rank: 5

金币
998
好评
2
贡献
0
QQ
发表于 2020-8-22 23:44:32 来自手机  | 显示全部楼层
牛逼
回复

使用道具 举报

98

主题

4440

帖子

9528

积分

硕士生

。。。

Rank: 6Rank: 6

金币
170
好评
122
贡献
1

考神MT论坛帅哥MT论坛活跃会员MT论坛侠客MT论坛最佳新人

发表于 2020-8-22 23:50:23 来自手机  | 显示全部楼层
不知道是不是前排
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表