在混淆的so中寻找sign签名函数

admin 2024年9月25日09:57:49评论23 views字数 2855阅读9分31秒阅读模式
在混淆的so中寻找sign签名函数

声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!

在混淆的so中寻找sign签名函数

逆向这门手艺,真是越学越让人摸不着头脑。最大的感受就是神仙打架凡人遭殃。行业顶端的大佬,一边搞加固,一边搞破解,把需要学习的知识累得高高的。
我们这些小虾米,还能做什么呢,只能适应环境,慢慢学了。

简述

本篇类似学习笔记,具体的APK和版本参考https://mp.weixin.qq.com/s/A4EllU2PxSB91Orpliqkzw 。这里不过多赘述。原文中对如何从混淆的so中找到sign签名,说的比较简单。我打算在此基础上,说一下我是怎么做的。以及IDA插件findhash怎么用,在网上找了半天的资料,才勉强把流程走完。

混淆so

apk采用的是腾讯乐固以及VMP混淆

在混淆的so中寻找sign签名函数

在so上的体现就是,真是壮观ovo

在混淆的so中寻找sign签名函数

经过分析,sign生成位置在showstart_net.so ,native中函数名称被混淆了

在混淆的so中寻找sign签名函数

该apk的sign值是这样子的

在混淆的so中寻找sign签名函数

如果有经验的,我们一眼可以看出这是md5加密,但不确定有没有进行魔改以及传入的参数是什么。
根据经验fuzz 我们假设这是标准的md5,一般来说,md5加密的携带的可能是md5(str(参数+时间戳))之类的,但这种并不靠谱,因为开发只需要随便加点字符就会导致结果大不一样。

接下来的任务就是判断

  • md5是不是标准的,有没有魔改

  • hash的参数是什么

IDA plugin findhash

下载地址:https://github.com/Pr0214/findhash
下载两个文件,放到ida的plugin目录下

在混淆的so中寻找sign签名函数

在混淆的so中寻找sign签名函数

然后打开IDA,等待一阵子,一开始可能不会出现,需要缓一会

在混淆的so中寻找sign签名函数

会不断反编译弹窗,时间可能比较长,耐心等待

在混淆的so中寻找sign签名函数

编译完成

在混淆的so中寻找sign签名函数

在混淆的so中寻找sign签名函数

查看生成的frida js ,直接运行报错
frida -f

在混淆的so中寻找sign签名函数

因为直接加载的时候,可能so还没有加载,UF启动不会有这个问题

可以写一个函数,检测到so被加载了的时候执行


// 其中没有过frida的脚本,如果没有尝试使用florida-server-16.1.2
function main() {
hook_dlopen_so();
}

setImmediate(main);

/*
* hook 加载so的函数,
* */

function hook_dlopen_so() {
var android_dlopen_ext = Module.findExportByName(null, "android_dlopen_ext");
Interceptor.attach(android_dlopen_ext, {
onEnter: function (args) {
var so_name = args[0].readCString();
if (so_name.indexOf("libshowstart_net.so") >= 0) this.call_hook = true;
}, onLeave: function (retval) {
if (this.call_hook) demo();
}
});
}

function demo() {
var targetSo = Module.findBaseAddress('libshowstart_net.so');
hook_suspected_function(targetSo);
}

在混淆的so中寻找sign签名函数

如果报错,把下面这一个删了

在混淆的so中寻找sign签名函数

加入hook_native_addr(funcPtr);

在混淆的so中寻找sign签名函数

function print_arg(addr) {
var module = Process.findRangeByAddress(addr);
if (module != null) {
return hexdump(addr) + "n";
} else {
return ptr(addr) + "n";
}
}

function hook_native_addr(funcPtr) {
var module = Process.findModuleByAddress(funcPtr);
Interceptor.attach(funcPtr, {
onEnter: function(args) {
// console.log(Thread.backtrace(this.context, Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join("n"));
this.args0 = args[0];
this.args1 = args[1];
this.args2 = args[2];
this.args3 = args[3];
this.logs = [];
this.logs.push("call " + module.name + "!" + ptr(funcPtr).sub(module.base) + "n");
this.logs.push("this.args0 onEnter: " + print_arg(this.args0));
this.logs.push("this.args1 onEnter: " + print_arg(this.args1));
this.logs.push("this.args2 onEnter: " + print_arg(this.args2));
// this.logs.push("this.args3 onEnter: " + print_arg(this.args3));
},
onLeave: function(retval) {
this.logs.push("this.args0 onLeave: " + print_arg(this.args0));
this.logs.push("this.args1 onLeave: " + print_arg(this.args1));
this.logs.push("this.args2 onLeave: " + print_arg(this.args2));
// this.logs.push("this.args3 onLeave: " + print_arg(this.args3));
this.logs.push("retval onLeave: " + print_arg(retval));
this.logs.push("retval onLeave: " + retval + "n");
console.log(this.logs);
}
});
}

在登陆界面输入账号密码,查看console.log的日志

在混淆的so中寻找sign签名函数

抓包得到的

在混淆的so中寻找sign签名函数

在混淆的so中寻找sign签名函数

完全一致,也就是这里做到的,接下来判断传入的参数

均是从arg1取值,将arg1的所有值拼接起来,然后md5

在混淆的so中寻找sign签名函数

结果和md5以及抓包得到的一致,是标准的md5

在混淆的so中寻找sign签名函数

成功根据hook找到了so中sign签名的入口和返回点

参考链接

md5在ida中的识别及使用方法 https://mp.weixin.qq.com/s/QdiLQSV4bOipbhBaIN61EA
记录一次秀动APP的逆向 https://mp.weixin.qq.com/s/A4EllU2PxSB91Orpliqkzw

原文始发于微信公众号(进击的HACK):在混淆的so中寻找sign签名函数

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年9月25日09:57:49
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   在混淆的so中寻找sign签名函数https://cn-sec.com/archives/3205985.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息