首页 > 其他分享 >记一次复现实战去付费-虚拟定位App孙悟空

记一次复现实战去付费-虚拟定位App孙悟空

时间:2024-10-17 15:15:29浏览次数:7  
标签:App v1 付费 复现 chen new message null local

这个APP需要通过直接去输入卡号,通过卡号付费实现虚拟定位的操作,同时虚拟定位的功能是在java层的静态代码块中实现的,所以直接去HOOK掉对应的检测卡密的过程就可以了

分析:

JEB实现反编译过程,通过搜索字符串('登录'),发现可以直接去查看到对应的函数位置

            public void run() {
                if(local.mCount != null && local.syms != null) {
                    local.mCount = (long)(((long)local.mCount) + 1L);
                    if(((long)local.mCount) > ((long)local.syms)) {
                        if(!"dqgb".equals("dqgb")) {
                            return;
                        }
                        System.exit(0);
                        return;
                    }
                    local.djsdx.postDelayed(this, 1000L);
                    return;
                }
                local.djsdx.postDelayed(this, 1000L);
            }
        };
        local.zx = new Runnable() {
            @Override
            public void run() {
                local.message = new Message();
                local.message.arg1 = 4;
                local.strpost("name=apk_z&c1=10002&c2=&c4=&c6=1");
                local.djsdx.postDelayed(this, ((long)(((int)local.xhjcfzs) * 60000)));
            }
        };

这里去复写了两个run()的执行函数,同时会去设置事件的同时,提交字符串

local.strpost("name=apk_z&c1=10002&c2=&c4=&c6=1");

这里是对应的strpost的函数实现,可以看到这里是有远程服务的网址的,其实可以考虑到是输入卡密的过程中,通过远程去实现卡密的检测,同时将这里的远程网址进行提交了之后会直接去判断,提交的网址进行local.load

!

这里load的代码我直接就copy到上面

public static void load(Context arg16) {
        local.context = arg16;
        local.jqm = local.getjqm();
        local.uuid = local.getuuid();
        local.ycuuid = local.getini("ycuuid.txt");
        Long v0 = (long)System.currentTimeMillis();
        AlertDialog v1 = local.dialog;
        if(v1 != null) {
            v1.dismiss();
            local.dialog = null;
        }
        AlertDialog.Builder v1_1 = new AlertDialog.Builder(local.context);
        v1_1.setTitle(local.title);
        v1_1.setCancelable(false);
        local.user = local.getini("card.txt");
        EditText v4 = new EditText(local.context);
        local.editText = v4;
        v4.setText(local.user);
        local.editText.setHint("请输入卡号...");
        v1_1.setView(local.editText);
        v1_1.setNegativeButton("解绑", null);
        v1_1.setPositiveButton("登录", null);
        v1_1.setNeutralButton("试用", null);
        AlertDialog v2 = v1_1.create();
        local.dialog = v2;
        v2.setCanceledOnTouchOutside(false);
        Long v2_1 = null;
        String v4_1 = local.getini("logintime.txt");
        if(!v4_1.isEmpty()) {
            v2_1 = (long)(((long)v0) - ((long)(((long)Long.parseLong(v4_1)))));
        }
        if(!local.jcdlzt().booleanValue()) {
            if(local.user.length() > 5) {
                Message v3 = new Message();
                local.message = v3;
                v3.arg1 = 1;
                local.message.arg2 = 2;
                local.strpost("name=apk_login&c1=" + local.rjbh + "&c2=" + local.user + "&c4=" + local.bbh + "&c5=" + local.jqm);
                return;
            }
            local.xsdlck();
            local.handler.obtainMessage();
            Message v6 = new Message();
            local.message = v6;
            v6.arg1 = 0;
            local.strpost("name=apk_qr&c1=" + local.rjbh + "&c2=");
            return;
        }
        if(((long)v2_1) > ((long)(((int)local.xhjcfzs) * 60 * 1000))) {
            Message v3_1 = new Message();
            local.message = v3_1;
            v3_1.arg1 = 1;
            local.message.arg2 = 2;
            local.strpost("name=apk_login&c1=" + local.rjbh + "&c2=" + local.user + "&c4=" + local.bbh + "&c5=" + local.jqm);
        }
    }
    // Detected as a lambda impl.
    public static void openBrowser(Context arg4, String arg5) {
        try {
            Intent v0_1 = new Intent();
            v0_1.setAction("android.intent.action.VIEW");
            v0_1.setData(Uri.parse(arg5));
            if(v0_1.resolveActivity(arg4.getPackageManager()) != null) {
                v0_1.resolveActivity(arg4.getPackageManager());
                arg4.startActivity(Intent.createChooser(v0_1, "请选择浏览器"));
                return;
            }
            arg4.startActivity(v0_1);
        }
        catch(Exception v0) {
            Toast.makeText(arg4.getApplicationContext(), "打开浏览器异常:" + v0.toString(), 0).show();
        }
    }

我们可以找到这里的对应的创建对话提示框的位置(输入卡号的位置)

        AlertDialog.Builder v1_1 = new AlertDialog.Builder(local.context);
        v1_1.setTitle(local.title);
        v1_1.setCancelable(false);
        local.user = local.getini("card.txt");
        EditText v4 = new EditText(local.context);
        local.editText = v4;
        v4.setText(local.user);
        local.editText.setHint("请输入卡号...");
        v1_1.setView(local.editText);
        v1_1.setNegativeButton("解绑", null);
        v1_1.setPositiveButton("登录", null);
        v1_1.setNeutralButton("试用", null);
        AlertDialog v2 = v1_1.create();
        local.dialog = v2;
        v2.setCanceledOnTouchOutside(false);
        Long v2_1 = null;
        String v4_1 = local.getini("logintime.txt");

其实这里我们可以试试直接去HOOK这个load方法了,看看能不能不去创建这个对话框,直接进入程序

Java.perform(function()
{
    var local = Java.use("yz.local");
    local.load.implementation=function(){
        console.log("----------------Hook--------------------");
        return;
    }
})
frida -U -f xu.ux.zheror -l demo.js 

其实发现可以直接过检测了

或者python来实现frida

import frida
import sys
jsCode ="""
    Java.perform(function()
    {
        var local = Java.use("yz.local");
        local.load.implementation=function(){
            console.log("----------------Hook--------------------");
            return;
        }
    });
"""
def on_message(message,date):
    print(message)
device = frida.get_usb_device()
app_name ='xu.nx.zheror'
pid = device.spawn([app_name])
process = device.attach(pid)
script = process.create_script(jsCode)
script.on('message',on_message)
script.load()
device.resume(pid)
sys.stdin.read()

这里一样是可以实现去检测的

重解包,硬改smali,重签名打包

搞完直接重打包,先解包

java -jar apktool.jar d  app.apk

改smail代码

找到对应的yz.local的源码位置 具体的位置是在 apktool\suwukong\smali_classes9\yz\locla.smail 的smail代码

.method public static load(Landroid/content/Context;)V
    .locals 16
    return-void
.end method

把load里面全部删了,就留个返回

生成APK

java -jar apktool.jar b 对应的文件夹

重签名

 keytool -genkey -v -keystore .\abc.keystore -alias new_name -keyalg RSA -keysize 2048 -validity 10000
输入密钥库口令:
您的名字与姓氏是什么?
  [Unknown]:  chen
您的组织单位名称是什么?
  [Unknown]:  chen
您的组织名称是什么?
  [Unknown]:  chen
您所在的城市或区域名称是什么?
  [Unknown]:  chen
您所在的省/市/自治区名称是什么?
  [Unknown]:  chen
该单位的双字母国家/地区代码是什么?
  [Unknown]:  chen
CN=chen, OU=chen, O=chen, L=chen, ST=chen, C=chen是否正确?
  [否]:  y

正在为以下对象生成 2,048 位RSA密钥对和自签名证书 (SHA256withRSA) (有效期为 10,000 天):
         CN=chen, OU=chen, O=chen, L=chen, ST=chen, C=chen
输入 <new_name> 的密钥口令
        (如果和密钥库口令相同, 按回车):
        
#这里有写对应的别名 new_name
#补上签名:
 jarsigner -verbose -keystore .\abc.keystore -signedjar new.apk apktool\apktool\suwukong\dist\瀛欒鑰�.apk new_name 

这里生成的APK就可以直接使用了

通过百度网盘分享的文件:孙行者.apk
链接:https://pan.baidu.com/s/1PH29tMyYuRPw4Ww_uQw0PQ?pwd=asdk
提取码:asdk
--来自百度网盘超级会员V4的分享

复现来源:https://www.52pojie.cn/forum.php?mod=viewthread&tid=1904103&extra=page%3D1%26filter%3Dlastpost%26orderby%3Dlastpost

标签:App,v1,付费,复现,chen,new,message,null,local
From: https://www.cnblogs.com/ovo-fisherman/p/18472345

相关文章

  • 2024全新v3Pro付费进群主题,无视风控扩列交友同城助眠全新模版
    付费进群系统是由wordpress开发的主题。通过在线支付,支付成功之后跳转隐藏的二维码进行加群拥有8个默认模板新增模块化布局(60模块)可自定义设置页面,站群页面,定制属于自己的付费进群页面,适用于所有场景新增域名防封,防封效果超级好演示地址:手机扫码查看演示部分截图展示......
  • python+flask框架的党建appapp8(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着信息技术的飞速发展,党建工作也逐渐向数字化、智能化方向转型。关于党建信息化的研究,现有研究主要以传统党建模式与信息技术的融合为主......
  • 智慧养老认证 app:开启便捷养老新时代
    在当今数字化高速发展的时代,智慧养老认证app应运而生,为老年人的生活带来了全新的变革与便利。它犹如一把钥匙,开启了便捷养老的新时代大门。然而,如同任何新兴事物一样,智慧养老认证app在发展过程中也面临着一些问题与挑战。一、可能面临的问题技术接受度问题:许多老年人对新技......
  • APP举报
    ......
  • 基于SpringBoot+Vue+uniapp的互助学习小程序的详细设计和实现(源码+lw+部署文档+讲解
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • WhatsApp防死号应该怎么做?
    “WhatsApp又死号了”——外贸人的噩梦每天都会上演。号损是小事,重要是是成千上万的客户累计与聊天记录被一扫而空,所以相信我,当你准备好最WhatsApp,那么WhatsApp账号养成的操作从一开始就要注意并且牢记!下面给大家整理了100+外贸人的共同WhatsApp账号经验,建议收藏。WhatsApp......
  • 2-STM32F103+ML307(中移4G Cat1)OTA升级篇(自建物联网平台)-STM32通过ML307使用http或
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/ZLIOTB/ML307/myota.html"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p>  说明前面......
  • Ouroboros3D-一种通过3D感知递归扩散生成3D模型的框架在win10系统上的复现流程
    本文将全程记录自己的Ouroboros3D(以下简称o3d)的环境配置以及训练过程,遇到的问题及解决办法。(Windows)目录一、o3d的安装及环境配置1.下载o3d项目2.anaconda、vscode安装及环境创建3.CUDA安装及环境变量的配置4.相应版本的pytorch的安装(1)在anaconda终端(2)在其他终端如vsco......
  • 基于.NET8 + Vue/UniApp前后端分离的快速开发框架,开箱即用!
    前言今天大姚给大家分享一款基于.NET8+Vue/UniApp前后端分离的快速开发框架,开箱即用:ZR.Admin.NET。开源免费(基于MITLicense开源协议)、代码量少、学习简单、通俗易懂、功能强大、易扩展、轻量级,让web开发更快速、简单高效(从此告别996),解决70%的重复工作,专注您的业务,轻松开......
  • APP视频活体检测API代码示例-动作活体检测开发
    视频活体检测技术是一种用于判断摄像头前的对象是否为真实活人的方法。传统的面部识别技术虽然能够有效地识别面部特征,但在面对照片、视频甚至是高精度的3D面具时,却显得力不从心。视频活体检测技术通过分析面部的微表情、皮肤纹理以及光线反射等多维度信息,能够有效地区分真实......