某视频APP的脱壳、hook逆向

前言

这看似是一个比较正常的视频软件,
在这里插入图片描述
也都可以看得到,但是出现了不太和谐的东西,点开之后都是需要花钱才能观看的内容。
在这里插入图片描述

脱壳

在这里插入图片描述
查壳,是某数字的,就不单独说了。

这里使用frida-unpack进行脱壳。
用法在READM.md中说的很清楚了,这里不做过多叙述了。
这里有两个注意点:

  • 一、看OpenMemory函数点
    看代码。
'use strict';
/**
 * 此脚本在以下环境测试通过
 * android os: 7.1.2 32bit  (64位可能要改OpenMemory的签名)
 * legu: libshella-2.8.so
 * 360:libjiagu.so
 */
Interceptor.attach(Module.findExportByName("libart.so", "_ZN3art7DexFile10OpenMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_10OatDexFileEPS9_"), {
    onEnter: function (args) {
      
        //dex起始位置
        var begin = args[1]
        //打印magic
        console.log("magic : " + Memory.readUtf8String(begin))
        //dex fileSize 地址
        var address = parseInt(begin,16) + 0x20
        //dex 大小
        var dex_size = Memory.readInt(ptr(address))

        console.log("dex_size :" + dex_size)
        //dump dex 到/data/data/pkg/目录下
        var file = new File("/data/data/dupdex/" + dex_size + ".dex", "wb")
        file.write(Memory.readByteArray(begin, dex_size))
        file.flush()
        file.close()
    },
    onLeave: function (retval) {
        if (retval.toInt32() > 0) {
            /* do something */
        }
    }
});

/system/lib/libart.so中存在OpenMemory函数,注意上面脚本中的_ZN3art7DexFile10OpenMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_10OatDexFileEPS9_这段字符串,不一定是你模拟器或者Android手机对应的OpenMemory函数对应的地方,所以如果脚本提示找不到对应的OpenMemory函数位置,最好按照流程来,把自己的函数位置替换掉脚本里的。

adb pull /system/lib/libart.so
nm libart.so| grep OpenMemory

在这里插入图片描述

  • 要注意版本问题。我们看脚本,在Android7.x之后,脱壳点就不再是OpenMemory了,8.x的基本都是OpenCommon,可以用同样的方法找到OpenCommon函数位然后把OpenMemory替换掉即可。

还有要修改这段22行的代码:
在这里插入图片描述
这是脱壳后dex存放文件的地方,你可以自己命名,并给予目录读写权限,例如我的就是/data/data/dupdex/
在这里插入图片描述
在这里插入图片描述
执行脱壳流程。可以看到我们的目录多了dex文件。
在这里插入图片描述

hook成土豪

逻辑主要在5619552.dex中,这里我们破解积分的问题。
一般可以查看有没有UserInfo的内容,这里找到后发现,有
在这里插入图片描述
那我们就可以hook这个方法了,主要思路是当APP调用getJifen方法时直接返回我们想要的数字就可以了。

var userinfo = Java.use("com.cz.babySister.javabean.UserInfo");
userinfo.getJifen.implementation  = function(){   
    return "100000";
}

我也是这样执行了,但是发现总是报错。
在这里插入图片描述
在这里插入图片描述
后来发现hook加固的函数时不能这么直接hook。
分为三步:

  • 第一步是拿到加载应用本身dex的classloader;
  • 第二步是通过这个classloader去找到被加固的类;
  • 第三步是通过这个类去hook需要hook的方法
    具体原理见这里。不在多说了。

这里直接贴上脚本。

'use strict'
//frida -U -f com.cz.babySister -l jifen.js --no-pause
if(Java.available){
    Java.perform(function(){
        var application = Java.use("android.app.Application");
        var reflectClass = Java.use("java.lang.Class");
        
        console.log("application: " + application);

        application.attach.overload('android.content.Context').implementation = function(context){
            var result = this.attach(context); // 先执行原来的attach方法
            var classloader = context.getClassLoader(); // 获取classloader
            Java.classFactory.loader = classloader;
            var userinfo = Java.classFactory.use("com.cz.babySister.javabean.UserInfo"); //这里能直接使用Java.use,因为java.use会检查在不在perform里面,不在就会失败
            console.log("UserInfo: " + userinfo);
            
            userinfo.getJifen.implementation  = function(){   
                return "100000";
            }
            return result;
        }
    });
}

frida -U -f com.cz.babySister -l jifen.js --no-pause

这里就能看到效果了。
在这里插入图片描述
在这里插入图片描述
这时你就是拥有100000积分的土豪了,想怎么看就怎么看。
但是我这里破解VIP就出现了点问题,后面再继续说吧~今天就到这。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值