APP逆向 day25unidbg中

news2025/4/7 7:42:26

一.前言

昨天我们讲了unidbg的上篇,都是一些之前讲过的简单案例,末尾还单独说了一个新案例海南航空,今天我们来讲的案例都是之前讲过的,主要是和大家说补环境

二.唯品会skey

大家如果不记得了,可以去看看前面的文章,这里给出文章地址

APP逆向 day19v品会逆向 part1-CSDN博客文章浏览阅读973次,点赞41次,收藏12次。今天我们任务是破解唯品会的搜索接口,这里给出地址https://mapi.appvipshop.com/vips-mobile/rest/shopping/search/product/list/v1我们打开charles抓包分析一下(这次抓包分析比较复杂,但是我讲不了那么细,只能把关键点和大家讲一下,最后再实操一下)这个接口就是我们要的搜索数据,这个接口需要破的参数有 authorization api_key mars_cid sessionhttps://blog.csdn.net/weixin_74178589/article/details/140669859?spm=1001.2014.3001.5501

当时我们找到这里,就没有带大家往里面读,而我们是通过hook得到的,发现怎么都是固定的,而当时我没给出他so文件的名字,这里我给大家贴出来

 是libkeyinfo.so,我们今天用unidbg跑出来,是不是还是很简单,我这里和大家说一下,这里和昨天是一样的,这个只是带大家回顾一下,而需要补环境的在后面,大家可以先试试自己写

两个参数大家也看到了,一个是content对象,另一个就是字符串skey,返回值是个固定值

6692c461c3810ab150c9a980d0c275ec

 然后就c个代码啦,现在我们来编写sign里的内容

这里给出代码

public void sign(){

        // 1 找到类
        DvmClass KeyInfo = vm.resolveClass("com/vip/vcsp/KeyInfo");
        // 2 找到方法
        String method = "getNavInfo(Landroid/content/Context;Ljava/lang/String;)Ljava/lang/String;";
        // 3 执行
        StringObject obj=KeyInfo.callStaticJniMethodObject(
                emulator,
                method,
                vm.resolveClass("android/content/Context").newObject(null),
                new StringObject(vm,"skey")
        );
        // 4 打印结果
        String  result = obj.getValue();
        System.out.println(result);

    }

运行结果和当时hook的一致 

三.唯品会api_sign

这个和skey是一天讲的,就不用给出链接地址了,这里给几张截图给大家回顾一下

发现最后是在gsNav方法,so和刚才是一个so文件,传的参数有四个,分别是

参数一:content对象

参数二:Map对象

参数三:字符串

参数四:布尔值

我这里给出当时hook的参数和结果

参数2:map==> {app_name=achievo_ad, app_version=7.83.3, channel=oziq7dxw:::, device=Pixel 2 XL, device_token=a9d1a2b9-2a79-36fd-a8ca-cbe24c03979d, manufacturer=Google, os_version=30, regPlat=0, regid=null, rom=Dalvik/2.1.0 (Linux; U; Android 11; Pixel 2 XL Build/RP1A.201005.004.A1), skey=6692c461c3810ab150c9a980d0c275ec, status=1, vipruid=, warehouse=null}

参数3 字符串 ==> null
参数4 布尔==> false

那我们就开始编写了,因为so文件还是一样的,所以初始化我们不需要更改,直接复制刚才的就好

3.1代码解释

这个代码发现和大家之前写的不太一样,这里我来具体解释

首先是Map new出来的是TreeMap是因为Map是一个接口,不能直接new出Map,不记得得可以去看看前面得java基础,都有说到,这个不是重点,我就不说了

然后就是比如那些类对应得jni签名大家不知道,这个时候就能借助gpt,问一下对应的全类名就好

举个栗子

然后把.换成/,前面加个L,用多了也就都记得了

接下来就是  ProxyDvmObject.createObject(vm,map)

给unidbg传参数时,需要包裹
    -之前咱们学的
        -字符串:new StringObject(vm,"")
        -布尔数字类型:直接传
        -其他自定义类型:vm.resolveClass("java/util/Map").newObject(map对象)
    -今天学到一个新的:无论对象什么类型,他能自动识别并匹配
        ProxyDvmObject.createObject(vm,对象)

而我们点开这个源码看一下

发现这个的本质就是读取传入参数的类型,然后给他new出对象,这个就十分的方便了,不需要再在里面写参数了,那我们接下来就有个问题,我们当时的content对象都给他当成是null传进去那么

vm.resolveClass("android/content/Context").newObject(null)
ProxyDvmObject.createObject(vm,null)

是不是一样的,第一个得到的是Context的对象,只是内容是空的

第二个它不是任何对象的对象,就是null,大家体会一下就知道了

只有拥有了content对象的时候,才能这么使用

而bool和数字也不能使用这个,因为他们直接传入就好,并不需要包裹

答疑完之后,我们运行一下

发现报错了

java.lang.UnsupportedOperationException: java/util/TreeMap->entrySet()Ljava/util/Set;
at com.github.unidbg.linux.android.dvm.AbstractJni.callObjectMethod(AbstractJni.java:921)

3.2 补环境

遇到这个错误说明我们得要来补环境了,意思就是callObjectMethod中传入ava/util/TreeMap->entrySet()Ljava/util/Set;找不到方法嘛,我们就需要来补这个环境

-在so中调用java代码时,会需要补环境
-TreeMap在调用entrySet方法时报错
-在so中,传入c代码中map--》map在调用entrySet时,报错了--》环境中没有--咱们需要补

那我们直接输入callObjectMethod然后按照tab,自动出这么多

然后在里面写要补的方法,具体就和我这么来就行

如果不知道执行方法的类型,也可以写object,object可以代指所有的泛型,再用

return ProxyDvmObject.createObject(vm,objct);,这个前面说过可以知道里面的具体类型

现在就不报刚才的那个错误了,我们接着补,我这里带大家补几个,发现这个还是在刚才的方法里面,直接再写个if判断

按照这个来嘛,我们再运行

 发现现在报callBooleanMethod这个错误,那我们写这个然后按tab

选择这个带signature的

 

我们再次运行

 

又回到刚才的位置写个if判断,这里我就

 

 

运行报这个错,我们再写if判断咯

 

 

运行报错,再写个if判断

 

运行结果

 

这就已经出值了,这就已经ok了,发现这个都是在补java的环境,这里我给出所有的补环境代码供大家学习


    @Override
    public DvmObject<?> callObjectMethod(BaseVM vm, DvmObject<?> dvmObject, String signature, VarArg varArg) {


        if(signature.equals("java/util/TreeMap->entrySet()Ljava/util/Set;")){
            // 1 拿到map对象
            //从dvmObject中拿到TreeMap的对象,通过getValue,返回的类型需要做强制类型转换
            TreeMap map=(TreeMap)dvmObject.getValue();

            // 2 调用map对象的 entrySet ,没有参数,返回值是Set类型
            // 报错可以知道 返回值:Ljava/util/Set;

            Set set=map.entrySet();
            // 3 包裹,返回给unidbg
            // return vm.resolveClass("java/util/Set").newObject(set);
            return ProxyDvmObject.createObject(vm,set);

        }

        else if(signature.equals("java/util/Set->iterator()Ljava/util/Iterator;")){
            // 获取对象,强制类型转换
            Set set=(Set) dvmObject.getValue();
            //执行方法 iterator
            Iterator it=set.iterator();
            //包裹返回
            return ProxyDvmObject.createObject(vm,it);
        }

        else if(signature.equals("java/util/Iterator->next()Ljava/lang/Object;")){
            Iterator it=(Iterator) dvmObject.getValue();
            Object obj=it.next();
            return ProxyDvmObject.createObject(vm,obj);
        }

        else if(signature.equals("java/util/Map$Entry->getKey()Ljava/lang/Object;")){
            Map.Entry me=(Map.Entry) dvmObject.getValue();
            Object obj=me.getKey();
            return ProxyDvmObject.createObject(vm,obj);
        }
        else if(signature.equals("java/util/Map$Entry->getValue()Ljava/lang/Object;")){
            Map.Entry me=(Map.Entry) dvmObject.getValue();
            Object obj=me.getValue();
            return ProxyDvmObject.createObject(vm,obj);
        }

        return super.callObjectMethod(vm, dvmObject, signature, varArg);
    }

    @Override
    public boolean callBooleanMethod(BaseVM vm, DvmObject<?> dvmObject, String signature, VarArg varArg) {

        if(signature.equals("java/util/Iterator->hasNext()Z")){
            Iterator it =(Iterator) dvmObject.getValue();
            boolean z=it.hasNext();

            //流程还是之前那样,只是bool类型不需要包裹返回,是不是感觉写sign还是很像
            return z;
        }

        return super.callBooleanMethod(vm, dvmObject, signature, varArg);
    }

四.识货案例

这个案例和我们之前讲的案例不太一样,这个主要是和大奖讲补环境方法,这个是识货的老接口,当时搜索的数据都是加密的,我们这次来破这个,大家不知道其实也没关系,主要是学习补环境

我们把写好sign之后,可能很多人要问我,为什么要把字符串拼接这么多次,不麻烦吗,当然很麻烦啦,但是java有字符串限制,不能一下创建很长的字符串,所以要把字符串一个个添加进去,那我们现在来运行一下

4.1补安卓环境

那我们接着补

 

这个是安卓中的方法,拿不到,直接按照这个补空返回,如果后期这个还报错,就接着补

报错这个,我们接着补

 还是和刚才一样,我们接着运行接着补

 

运行

 这就出结果了,说明校验不严格 

4.2 系统对象

在补环境时候,会有java和安卓的对象
    -java的对象--》jdk提供了--》unidbg中会自带--》entrySet--》jdk自带的
    -安卓的对象--》安卓的sdk提供--》unidbg中没有--》我们统一都返回空对象
    -后期还会遇到--》app中自己写的类的对象--》把人家的类copy出来--》放到unidbg中
    
安卓的一个对象[context,Application,ActivityThread]--->其实很难伪造出来--》安卓中独有的
    -我们没有安卓的sdk,造不出来的,它的源码极为复杂
    -我们统一都返回 vm.resolveClass("android/app/ActivityThread").newObject(null);
    -context。。本质都是为了:拿蓝牙信息,设备id号,sdk版本,包名。。。。
    -补到最后,写死即可

4.3 安卓sdk

常见对象,如果不知道,就是搜索
ActivityThread: 
安卓程序的主线程或UI线程,ActivityThread的main方法是整个APP的入口

Application:
当前应用对象(本质是context),一般获取手机信息(蓝牙,网络),应用信息(包名,权限),数据传递,数据共享 ,数据缓存等

PackageManager:
    1、安装,卸载应用 
    2、查询permission相关信息 
    3、查询Application相关信息(application,activity,receiver,service,provider及相应属性等) 
    4、查询已安装应用 
    5、增加,删除permission 
    6、清除用户数据、缓存,代码段等 
                        
4 注意
以后遇到安卓系统的常见对象,我们先搜索,它作用是什么,先设置为null(vm.resolveClass("android/content/pm/PackageManager").newObject(null)),后续需要什么,通过hook或者写死再补环境 

 

五.总结 

这一期的案例写了我很久,主要是摆烂去了,星露谷物语太好玩了,沉迷其中,不过只有几节课就完结了,争取先完结再去玩吧,明天和大家讲一下unidbg的下期,我会和大奖讲补环境稍微难的了,案例大家拭目以待吧

 补充

有不懂的地方可以主页咨询我,有求必应

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1968015.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一个函数统一238个机器学习R包,这也太赞了吧

Caret 是一个试图标准化机器学习过程的一个包。Caret 对 R 中最常用的机器学习方法 (目前支持238个R包)提供了统一的接口。 进行数据预处理 实现机器学习方法流程化模型构建 通过参数组合和交叉验证评估模型的参数 选择最优模型 评估模型性能 一键满足各种掉包&#xff0c…

带通采样定理

一、采样定理 1.1 低通采样定理(奈奎斯特采样) 低通采样定理&#xff08;奈奎斯特采样&#xff09;是要求大于信号的最高上限频率的两倍 1.2 带通采样定理 带通信号的采样频率在某个时间小于采样频率也能无失真恢复原信号 二、频谱混叠 对一个连续时域信号&#xff0c;采…

【网络安全】CVSS 10信息披露+图片元数据不适当处理

未经许可,不得转载。 文章目录 漏洞1漏洞2漏洞1 app.redacted.com,是一个在线学习应用程序,适用于企业。但其仅限于会员。尝试使用wappalyzer分析其技术堆栈。 首先想到的是对敏感文件进行目录模糊测试。主要使用 dirsearch 和 ffuf 进行此操作。 首先,我运行了 dirsear…

嵌入式人工智能(39-基于树莓派4B的震动传感器和霍尔传感器)

这两个传感器实验比较简单&#xff0c;也都属于力传感器&#xff0c;就放一起做了。 1、震动传感器 震动传感器是一种用于检测和测量物体震动、振动和冲击的设备。它通常由一个敏感元件和一个信号处理单元组成。敏感元件可以是压电材料、光电材料、加速度传感器等。当物体发生…

day 18流的定位、文件IO以及Linux系统中时间的获取

流的定位 偏移量&#xff1a;读和写都在偏移量的位置进行 文件IO 相对于标准IO来说&#xff0c;文件IO直接在Linux的内核中操作&#xff0c;也更加的简洁精炼 对文件的操作也是三个部分 1.打开文件 open 2.读写文件 read write 3.关闭文件 close 还有一些其他的函数接口…

Msf安装

环境安装 渗透测试&#xff1a;CentOS 7 环境下 MSF 工具部署&#xff08;Metasploit 渗透测试框架安装&#xff09;_msfconsole安装-CSDN博客https://blog.csdn.net/zatongtong/article/details/135744217?ops_request_misc&request_id&biz_id102&utm_term%E6%9…

stack和list

前言 stack和list的使用就不讲了&#xff0c;讲一下模拟实现&#xff0c;然后讲一下deque&#xff0c;最后讲一下优先队列 1. stack的模拟实现 template<class T,class container>//这个container是vector&#xff0c;或者list或者deque&#xff08;后面会说&#xff0…

基于树莓派的收银系统-KwickPOS

基于树莓派的收银系统在繁忙的餐厅和零售场所大受欢迎 低成本、功能强大、紧凑和稳定的Raspberry Pi计算模块提供平滑的收银解决方案&#xff0c;为北美和中美洲的数千名KwickPOS客户提供不间断的运行时间。 解决方案 Compute Module 3 Compute Module 4 企业规模 中小企业…

java之抽象类以及如何优化

抽象类的作用是什么: 当我们抽取共性时候,无法确定方法体,就把方法定义为抽象的,强制让子类按照某种格式重写,抽象方法所在的类,必须是抽象类.我们先定义一个抽象类 ,abstract的意思就是抽象类, 一般来说,在抽象类里面定义的方法也是抽象方法. public abstract class Animal {p…

【Linux操作系统】关于系统中内存文件与进程的关系以及文件描述符fd、重定向的理解

目录 一、关于文件和进程关系的简介二、了解文件操作的系统接口和C语言文件操作接口1.C语言文件操作接口2.文件操作的系统接口 三、关于C语言接口和系统接口的关系四、文件描述符&#xff08;fd&#xff09;1.FILE* 结构体2.文件描述符表&#xff08;fd的本质&#xff09;3.文件…

透明显示屏方案介绍

透明显示屏方案是一种创新的显示技术解决方案&#xff0c;它结合了透明材料和高性能显示技术&#xff0c;实现了在显示内容的同时保持屏幕背后物体或场景的可见性。以下是对透明显示屏方案的详细介绍&#xff1a; 一、技术原理 透明显示屏方案主要采用了LED透明屏和OLED透明屏两…

基于PHP+MySQL组合开发的微信活动投票小程序源码系统 带完整的安装代码包以及搭建部署教程

系统概述 在当今数字化时代&#xff0c;微信作为社交媒体的巨头&#xff0c;为企业和个人提供了丰富的互动营销平台。其中&#xff0c;投票活动作为一种有效的用户参与和互动方式&#xff0c;被广泛应用于各种场景。为了满足这一需求&#xff0c;我们推出了一款基于PHPMySQL组…

zabbix“专家坐诊”第249期问答

问题一 Q&#xff1a;zabbix server服务每次重启监控主机就会触发大量的“10分钟未获取到数据”的告警&#xff0c;同时还会触发zabbix的history进程繁忙的告警。&#xff08;后面检查实际上监控主机在告警时间段内是有数据的&#xff09;感觉是server一重启&#xff0c;数据库…

Python | ValueError: invalid literal for int() with base 10: ‘example’

Python | ValueError: invalid literal for int() with base 10: ‘example’ 在Python编程中&#xff0c;遇到ValueError: invalid literal for int() with base 10: example这样的错误通常意味着你试图将一个字符串转换为整数&#xff0c;但该字符串包含非数字字符。这种错误…

美团 AIGC产品经理面经(已拿 offer)

背景&#xff1a;211本科毕业&#xff0c;毕业之后在北京一家中型电商公司做了3年商家后台产品经理&#xff0c;目前通过老薛的朋友关系拿到了美团的offer。 目前还有几家在面试流程中&#xff0c;继续加油&#x1f4aa; 美团AIGC产品面经-业务面 &#x1f4a5;1、自我介绍&a…

找不到vcruntime140_1.dll,无法执行此代码

电脑运行某些软件提示&#xff1a;由于找不到vcruntime140_1.dll,无法继续执行代码 解决方法 1、下载这个软件 https://download.csdn.net/download/szdenny/89605688 2、 通过这个网址下载软件修复&#xff1a;http://xn--dll-8n0e103b00dgy4e.site/

前端:Vue学习 - 智慧商城项目

前端&#xff1a;Vue学习 - 智慧商城项目 1. vue组件库 > vant-ui2. postcss插件 > vw 适配3. 路由配置4. 登录页面静态布局4.1 封装axios实例访问验证码接口4.2 vant 组件 > 轻提示4.3 短信验证倒计时4.4 登录功能4.5 响应拦截器 > 统一处理错误4.6 登录权证信息存…

ArcGIS导出的shp不带prj文件怎么办?

0序 遇到了好多个做测绘的朋友&#xff0c;拿到的shp文件都没有prj文件&#xff0c;在图新地球当中无法加载。 而prj文件是其他软件解析shp&#xff0c;和地图做叠加的核心。否则就不知道shp要素的坐标按照什么坐标去解析。 经过排查发现&#xff0c;大部分是在arcgis中导出sh…

数据同步策略概览

数据同步在业务开发中比较普遍&#xff0c;例如 订阅MySQL的binlog将数据同步至异构数据库。数据同步方案需要考虑一下几点&#xff1a; 数据实时性要求数据量级是否有数据转换逻辑 可分为两种模式 发布订阅模式&#xff1a;分为订阅数据库log还是订阅应用层发的消息点对点模…

适合印刷企业使用的MES管理系统具备哪些特点

在当今竞争激烈的印刷行业中&#xff0c;提高生产效率、优化资源配置、确保产品质量与交期已成为企业生存与发展的关键。为此&#xff0c;引入一套高效、智能的印刷企业MES管理系统显得尤为重要。MES管理系统作为连接企业资源计划ERP系统与车间生产现场的桥梁&#xff0c;其设计…