本帖最后由 低调(d-iao) 于 2021-6-26 15:09 编辑
准备工具:
1.反编译工具
2.抓包工具
3.IDA
4.vmos
演示软体:
轻启动 v2.18.3
软件保护
1.加固保护
2.软件保护
3.umeng保护
4.功能限制
5.时间暗桩
6.so保护
成品图:
教程分为2种方式破解:
1.工具党模式
2.手动党模式
工具模式:
首先 先来说说工具模式,如果你只为了破解而破解,并且只想快速处理,请选择工具模式,无需回复 即可观赏。
1.找个sandhook类的过签名工具 不必脱壳,然后选择完整包模式处理,即可过掉所有校验保护。
2.找个脱壳机对原版进行脱壳。
3.使用反编译工具进行反编译,搜索trial_millis 定位到关键类处,代码里有个boolean的方法名 赋值true即可完成破解。
(ps: 我只试了sandhook没问题,其余工具自行测试)
================================
好了 工具模式讲解完毕
现在来手动模式
手动模式:
依旧老规矩 看看软件的付费机制
图中可以看到部分功能有限制
随便找个功能点击 软件会进行联网验证
-网络验证第一想法就是进行抓包
那说明破解方面有思路了
那先来抓一下看看
关键url:
https://wpengapp.com/api/appuser
请求包部分内容(后面要用到)
返回包 (rsa加密)
so let do it...
1.加固保护
-软件使用腾讯御加固保护
-无论脱壳工具或ida dump 网上都有不少大神的教学 这里请自行处理。
2.软件保护
脱完壳修复好dex格式与入口,惯例的使用mt去除签名,运行后发现软件启动到splash后闪退 通知栏提示此版本不可用
很明显软件有防破保护
现在的app保护很少会放在dex里 所以先看看lib文件里有哪些so
可以发现只有一个 libreqen.so
这里直接用mt的hex模式查看吧
然后搜索签名看看 signature
可以看到有一个结果
在so里就得用ida了
载入后从函数名可以看出有 md5 有sign 之类的名称 很明显有保护
并且可以看到有3跳函数从java层调用 注: 以java_开头的
所以主要跟踪这3条函数走
第一条函数 getAppSign
图为流程图的分支线
图里的第一幅图 可以看到调用了apk_sign_md5
跟随进去后会来到第二幅图的地方
这里可以看到调用了2个重要函数
分别是load_apk_sign & sign_md5
先跟随load_apk_sign函数会来到左下角的地方 主要代码太长 这里f5转了一下方便阅读
从代码里可以看出 以char方式获取apk签名信息
所以这里主要只是获取签名值
获取完成后 程序会回到第二幅图继续往下执行 最后后来到sign_md5 也就是右下角的图里
这里主要就是把CharString的签名值转成md5值 到此getAppSign 分析完毕
结论: 这条函数主要就是获取apk签名的md5值
接下来要知道获取完使用在哪里呢?
那就需要回到java层
反编译dex搜索 getAppSign 定位到下图
觉得不好分析可以使用mt的混淆对抗
从代码里可以看出 程序先同样的方式从java层获取签名的md5
接着再从so里获取md5
然后 会对这2个结果进行比较 一样则继续 不一样则继续第二种比较
第二种则是比较 如果签名值 不等于
9371b39892df3b212e15cffc564cc4f2 且不等于
5d975cd6e7dd2e5db97eb3ccd9d74d61
就会闪退
结论: 签名要么一样 要么就和这2个值随意一组相同 就不会闪退
第一个校验保护 分析完毕
接下来第二条函数 getPubKey
图中可以看到会调用check_apk_sign进行验证
验证正确就会给出rsa key
从图里可以看到 套路基本一样
获取签名md5值 > 比较是否和原版的md5相同 > 相同则给出rsa key
结论: 第二个函数主要获取rsa key
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJGk132gxzKMEvt5dI+fI7P9LcJCx+ZTaaLTwyihXQCytPOMqTN6i+FPCBD7wwBhPgqopUcTQVdrRgRJgtxMJh
这个暂时不重要 dex那边就先不跟进 这里验证主要在so 如果apk的签名不等于so里的值就会闪退 且通知栏提示版本不可用
接下来到第三个函数 getSignature
图里的套路基本一样 这里直接说明这条函数的作用
这条函数主要就是 md5(数据 + @$^$%^fasd&%df&f||://)
结论: 从分析可以得出
第一条函数获取 sign md5
第二条函数获取 rsa public key
第三条函数则是 将数据 + @$^$%^fasd&%df&f||:// 再转成md5
意思是不是说明 这个so基本就没有其他作用了? 而且还带校验保护
那这里就直接抛弃它吧 把这些需要的数据直接java层处理吧 这样就也无需理会native层的保护了
首先把lib里的libreqen.so文件删除掉
然后把dex里的这句代码也删除掉 const-string v0, "reqen"
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
再把 getAppSign 与 getPubKey 给出固定值 并把getSignature整个方法删除掉
下图为修改前后
修改前:
修改后:
最后getSignature要怎么用写呢?
还记得java层获取签名md5的地方吗?
说明那边有句md5转换的代码所以可以直接拿来用
具体看修改前后吧
getSignature结果会有2条 2条都改吧
修改前:
修改后:
至此软件保护处理完毕
3.Umeng保护
修改好后运行发现 软件提示破解版
还记得上面的抓包图吗?
可以看到 channel=coolapk 渠道号
看过我之前的文章都知道这是umeng的伎俩
(那文章因版权问题,现在看不了)
所以我直接就锁定是umeng搞鬼
直接搜索 "channel" 会有几个结果 懒得一个一个分析 我直接全赋值coolapk
到此软件已可以正常运行了。
4.功能限制
现在可以开始破解了,从首次启动测试,已知软件是通过网络验证,并且从抓包中可以得知,返回数据是经过加密的,从pubkey得知,软件有使用rsa算法,
所以这里先从rsa入手
图中可以看到 橘色线调用了rsa算法 然后输出字符串
这里偷懒 直接在结果插了一句log 看看明文是什么内容
dex搜索trial_millis 定位到代码处
经过分析 只要status为1就是已注册 所以这里直接如图给status赋值1即可完成破解
至此破解完成,破解从来都不难,难的是围绕破解的保护。
5.时间暗桩
软件随机使用一段时间后会验证破解版,如果没通过,就会跳到和umeng一样的界面,禁止继续使用,从上篇文章中得知umeng会把验证结果写到当前软件data目录里,所以这里直接进data看看有没有什么问题
data需要root才能进入,这里借助vmos进行分析
来到data目录 经过分析发现 其中有一个参数的时间与提示盗版时间吻合
将其试试删除保存重运行软件后发现可以正常使用了
说明是这条参数禁止破解版使用。
resources.arsc找参数名 可以看到名称被混淆了
dex搜索id 得到名称为pw_gohom
图中可以看到 如果pw_gohom的值大于0就提示破解版
所以这里的跳转不可以实现 删除
(这里主要是禁止破解版使用功能)
经过分析 还有一处需要修改
作者狡猾 另一处使用了pw_gohom做定位
(这里就是跳网页提示破解版,和umeng那个图一样)
这里则判断大于0就打开网页提示破解版
所以这里的跳转必须实现 修改为goto即可
6.so验证
后来发现 导致第5错误的原因是so保护
从分析pw_gohom过程得知 软件提示破解版的时候会访问官方链接
http://wpengapp.com/lightstart/safetyreminder
所以可以从错误信息得方向入手 图中红线位置
跟随图中红线的代码来到了 另一个界面
这里画线处是获取 url链接的地方 继续跟进去
这里可以发现有个字符串被加密了 其实是des加密
红线位置就是进行解密 解密后得出 safetyreminder
我这里也偷懒直接log出来吧 如图 插一句log 输出p1内容
现在全局搜索 看看有多少个地方调用了加密的safetyreminder
一共有5条 其中导致错误的经过分析来自红圈那条
进去后可以发现 原来会验证so目录里的文件是否被修改
回想官方的so我已经删除了 如果so目录为空它就不会进行验证
接着又回想 我惯例的打了mt去签 所以so里又有别的文件了
哎呀 看来惯例有时候也不一定是好事。就因为加了mthook,所以就导致这验证触发
好了 居然知道了这问题 直接把着跳转删除即可。
到此 总算完成解锁了 现在可以正常使用了
最后 如果使用过程还有问题
就把第6里得到的5个结果也处理一遍吧
后记: 这软件这里不算完全分析 软件本身对我没有太大用处就不再深究,主要只是私信里有小伙伴让帮忙看看,至于有兴趣的可以更深入分析
0626补充:
后来发现有2个地方调用nativelibrarydir
都需要处理 |