前言
这看似是一个比较正常的视频软件,
也都可以看得到,但是出现了不太和谐的东西,点开之后都是需要花钱才能观看的内容。
脱壳
查壳,是某数字的,就不单独说了。
这里使用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就出现了点问题,后面再继续说吧~今天就到这。