Frida javascript hook 检测设备信息获取等

JS逆向 | hook劫持检测与应对策略 搞过某数的朋友应该知道,某数对 eval 函数有劫持检测,虽然说检测与反检测操作实现起来都很简单,但很多朋友还是没有遇到过,所以今天简单的提一下。就不拿 eval 函数举例了, 因为劫持检测思路适用于任何js原生函数。 正如下图所示,一个简单的油猴脚本,用于劫持 JSON.stringify 函数。 开启油猴脚本之后, 我们运行一段代码试试。 JSON.stringify 函数被hook到了,... 阅读详情

在这里插入图片描述

对 Android 应用进行 hook 常见的有 Xposed、Frida 等,Xposed 有时候可能不尽人意,或许您可以试试 Frida ~

frida -U -f com.primer.gamecerter -l hookStartActivity.js

TODO

  • 后续是否可以对检测数据(堆栈、类名、方法名、参数、返回值)进行收集和统计,数据经过进一步处理后格式化输出更好~
/**
 * 时间:2024年2月22日12:17:44
 * 作者:村长
 * 描述:合规检测 hook
 * 
 * 
 * 如何使用:
 *      1、确保设备启动 frida-service
 *          adb shell
 *          su                                      需要 root 设备
 *          cd data/local/tmp/                      firda-service 可执行文件存放位置
 *          ./frida-service*** &                    后台运行
 *          frida -U -f 【包名】 -l 【脚本路径】      注入脚本启动应用 
 * */


//全局配置
var runConfig = {
    "permission": false,
    "startActivity": false,
    "deviceId": true,
    "file": false,
    "ipAddress": false,
    "location": false,
    "other": false,
    "systemProperties": false,
    "packageList": false,
    "enablePrintStackTrace": false,
}


Java.perform(function x() {
    console.log(" --------- 启动检测 ----------");

    if (runConfig.permission) {
        checkPermission();
    }

    if (runConfig.startActivity) {
        checkStartActivity();
    }

    if (runConfig.deviceId) {
        checkAndroidId();
        checkIMEI();
        checkOtherId()
    }

    if (runConfig.file) {
        checkExternalFileRW();
    }

    if (runConfig.ipAddress) {
        checkIPAddress();
    }

    if (runConfig.location) {
        checkLocation();
    }

    if (runConfig.other) {
        checkOther();
    }

    if (runConfig.systemProperties) {
        checkSystemProperties();
    }

    if (runConfig.packageList) {
        checkPackageList();
    }


    console.log(" --------- 结束检测 ----------");
})



///////////////////////////////////////////////////////////////

function log() {
    if (runConfig.enablePrintStackTrace) {
        console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));
    }
}


////////////////////////////////////////////////////////////////

function checkPackageList() {
    console.log("----------- 应用安装列表检查 -----------")

    var ApplicationPackageManager = Java.use("android.app.ApplicationPackageManager")
    ApplicationPackageManager.getInstalledPackages.implementation = function (flags) {
        var list = this.getInstalledPackages(flags)

        console.log("ApplicationPackageManager 获取安装列表 " + list)
        log();
        return list;
    }

    ApplicationPackageManager.getPackageInfo
        .overload('java.lang.String', 'int')
        .implementation = function (pkg, flags) {
            var info = this.getPackageInfo(pkg, flags)

            console.log("ApplicationPackageManager 获取包名信息 " + info)
            log();
            return info;
        }

    ApplicationPackageManager.getPackageInfo
        .overload('android.content.pm.VersionedPackage', 'int')
        .implementation = function (pkg, flags) {
            var info = this.getPackageInfo(pkg, flags)

            console.log("ApplicationPackageManager 获取包名信息 " + info)
            log();
            return info;
        }


    ApplicationPackageManager.getLaunchIntentForPackage.implementation = function (pkg) {
        var intent = this.getLaunchIntentForPackage(pkg)

        console.log("ApplicationPackageManager 获取启动 intent: " + intent)
        log();
        return intent;
    }
}


function checkSystemProperties() {
    console.log("----------- 系统属性检查 -----------")
    var SystemProperties = Java.use("android.os.SystemProperties")
    SystemProperties.get
        .overload('java.lang.String').implementation = function (key) {
            var val = this.get(key)

            console.log("SystemProperties 获取系统属性 " + key + " -> " + val)
            log();
            return val;
        }

    SystemProperties.get
        .overload('java.lang.String', 'java.lang.String').implementation = function (key, def) {
            var val = this.get(key, def)

            console.log("SystemProperties 获取系统属性 " + key + " -> " + val + " " + def)
            log();
            return val;
        }
}



function checkOther() {
    console.log("----------- 剪切板检查 -----------")

    var ClipboardManager = Java.use("android.content.ClipboardManager")
    ClipboardManager.getPrimaryClip.implementation = function () {
        var val = this.getPrimaryClip()

        console.log("ClipboardManager 1 获取短信 " + val)
        log();
        return val;
    }

    ClipboardManager.getPrimaryClipDescription.implementation = function () {
        var val = this.getPrimaryClipDescription()

        console.log("ClipboardManager 1 获取短信 " + val)
        log();
        return val;
    }

    console.log("----------- 网络信息检查 -----------")

    var ConnectivityManager = Java.use("android.net.ConnectivityManager")
    ConnectivityManager.getActiveNetworkInfo.implementation = function () {
        var val = this.getActiveNetworkInfo()

        console.log("ConnectivityManager 获取网络信息 " + val)
        log();
        return val;
    }
}

/**
* 未完善,需要解析 content 判断属于哪一种类型
*/
function checkContentResolve() {

    var ContentResolver = Java.use("android.content.ContentResolver")
    ContentResolver.query
        .overload('android.net.Uri', '[Ljava.lang.String;', 'android.os.Bundle', 'android.os.CancellationSignal')
        .implementation = function (uri, strs, bundle, signal) {
            var val = this.query(uri, strs, bundle, signal)

            console.log("ContentResolver 1 获取短信 " + val)
            log();
            return val;
        }

    ContentResolver.query
        .overload('android.net.Uri', '[Ljava.lang.String;', 'java.lang.String', '[Ljava.lang.String;', 'java.lang.String')
        .implementation = function (uri, strs, str1, strs2, str3) {
            var val = this.query(uri, strs, str1, strs2, str3)

            console.log("ContentResolver 2  获取短信 " + val)
            log();
            return val;
        }

    ContentResolver.query
        .overload('android.net.Uri', '[Ljava.lang.String;', 'java.lang.String', '[Ljava.lang.String;', 'java.lang.String', 'android.os.CancellationSignal')
        .implementation = function (uri, strs1, str2, strs3, str4, signal) {
            var val = this.query(uri, strs1, str2, strs3, str4, signal)

            console.log("ContentResolver 3 获取短信 " + val)
            log();
            return val;
        }
}



function checkLocation() {
    console.log("----------- 定位检查 -----------")

    var LocationManager = Java.use("android.location.LocationManager")
    LocationManager.getLastLocation.implementation = function () {
        var location = this.getLastLocation()

        console.log("LocationManager 获取定位 " + location)
        log();
        return location;
    }

    LocationManager.getLastKnownLocation.implementation = function () {
        var location = this.getLastKnownLocation()

        console.log("LocationManager 获取定位 " + location)
        log();
        return location;
    }
}

function checkIPAddress() {
    console.log("----------- IP 地址检查 -----------")

    var NetworkInterface = Java.use("java.net.NetworkInterface")
    NetworkInterface.getInterfaceAddresses.implementation = function () {
        var addessList = this.getInterfaceAddresses()

        console.log("NetworkInterface 获取 IP 地址 " + addessList)
        log();
        return addessList;
    }

    var Inet4Address = Java.use("java.net.Inet4Address")
    Inet4Address.getHostAddress.implementation = function () {
        var address = this.getHostAddress()

        console.log("Inet4Address 获取主机地址 " + address)
        log();
        return address;
    }

    var Inet6Address = Java.use("java.net.Inet6Address")
    Inet6Address.getHostAddress.implementation = function () {
        var address = this.getHostAddress()

        console.log("Inet6Address 获取主机地址 " + address)
        log();
        return address;
    }
}

function checkExternalFileRW() {
    console.log("----------- 外部文件读写检查 -----------")

    var ContextImpl = Java.use("android.app.ContextImpl")
    ContextImpl.getExternalFilesDirs.implementation = function (type) {
        var files = this.getExternalFilesDirs(type)

        console.log("ContextImpl 获取外部文件目录 " + type)
        log();
        return files;
    }

    ContextImpl.getExternalMediaDirs.implementation = function () {
        var files = this.getExternalMediaDirs()

        console.log("ContextImpl 获取媒体文件目录")
        log();
        return files;
    }

    ContextImpl.getExternalCacheDirs.implementation = function () {
        var files = this.getExternalCacheDirs()

        console.log("ContextImpl 获取缓存目录")
        log();
        return files;
    }



    var Environment = Java.use("android.os.Environment")
    Environment.getExternalStorageDirectory.implementation = function () {
        var file = this.getExternalStorageDirectory()

        console.log("ContextImpl 获取外部存储目录")
        log();
        return file;
    }

}


function checkIMEI() {

    console.log("----------- imei 检查 -----------")

    var TelephonyManager = Java.use("android.telephony.TelephonyManager")

    //getDeviceId    
    TelephonyManager.getDeviceId.overload("int").implementation = function (slotIndex) {
        var iemi = this.getDeviceId(slotIndex)
        console.log("TelephonyManager 获取 IMEI getDeviceId slotIndex = " + slotIndex + "  iemi = " + iemi)
        log();
        return iemi;
    }
    TelephonyManager.getDeviceId.overload().implementation = function () {
        var iemi = this.getDeviceId()
        console.log("TelephonyManager 获取 getDeviceId IMEI = " + iemi)
        log();
        return iemi;
    }

    //getMeid
    TelephonyManager.getMeid.overload("int").implementation = function (slotIndex) {
        var iemi = this.getMeid(slotIndex)
        console.log("TelephonyManager 获取 IMEI getMeid slotIndex = " + slotIndex + "  iemi = " + iemi)
        log();
        return iemi;
    }
    TelephonyManager.getMeid.overload().implementation = function () {
        var iemi = this.getMeid()
        console.log("TelephonyManager 获取 getMeid IMEI = " + iemi)
        log();
        return iemi;
    }


    //getImei
    TelephonyManager.getImei.overload("int").implementation = function (slotIndex) {
        var iemi = this.getImei(slotIndex)
        console.log("TelephonyManager 获取 IMEI getImei slotIndex = " + slotIndex + "  iemi = " + iemi)
        log();
        return iemi;
    }

    TelephonyManager.getImei.overload().implementation = function () {
        var iemi = this.getImei()
        console.log("TelephonyManager 获取 getImei IMEI = " + iemi)
        log();
        return iemi;
    }

}


function checkOtherId() {


    console.log("----------- mac 检查 -----------")

    var NetworkInterface = Java.use("java.net.NetworkInterface")
    NetworkInterface.getHardwareAddress.implementation = function () {
        var mac = this.getHardwareAddress()
        console.log("NetworkInterface 获取 MAC = " + mac)
        log();
        return mac;
    }

    var WifiInfo = Java.use("android.net.wifi.WifiInfo")
    WifiInfo.getMacAddress.implementation = function () {
        var mac = this.getMacAddress()
        console.log("WifiInfo 获取 MAC = " + mac)
        log();
        return mac;
    }

    console.log("----------- SSID 检查 -----------")
    WifiInfo.getSSID.implementation = function () {
        var ssid = this.getSSID()
        console.log("WifiInfo 获取 ssid = " + ssid)
        log();
        return ssid;
    }


    console.log("----------- oaid 检查 -----------")

    var OAID_LIST = ["com.bun.supplier.IdSupplier",
        "com.bun.miitmdid.provider.DefaultProvider",
        "com.bun.miitmdid.supplier.IdSupplier",
        "com.bun.miitmdid.interfaces.IdSupplier"]

    for (let index in OAID_LIST) {
        try {
            var oaid = Java.use(OAID_LIST[index])
            oaid.getOAID.implementation = function () {
                var result = this.getOAID()

                console.log('获取 oaid   = ' + result);
                log();
                return result
            }

        } catch (e) {

        }
    }

    console.log("----------- IMSI 检查 -----------")
    var TelephonyManager = Java.use("android.telephony.TelephonyManager")
    TelephonyManager.getSubscriberId.overload().implementation = function () {
        var imsi = this.getSubscriberId()
        console.log("TelephonyManager 获取 imsi = " + imsi)
        log();
        return imsi;
    }

    TelephonyManager.getSubscriberId.overload('int').implementation = function (index) {
        var imsi = this.getSubscriberId(index)
        console.log("TelephonyManager 获取 1 imsi = " + imsi)
        log();
        return imsi;
    }

    console.log("----------- SN 检查 -----------")
    var Build = Java.use("android.os.Build")
    Build.getSerial.implementation = function () {
        var sn = this.getSerial()
        console.log("TelephonyManager 获取 sn = " + sn)
        log();
        return sn;
    }
}

function checkAndroidId() {
    console.log("----------- android id检查 -----------")

    var ANDROID_ID = "android_id"
    var Secure = Java.use("android.provider.Settings$Secure")
    Secure.getString.implementation = function (resolver, name) {
        var result = this.getString(resolver, name);
        console.log("getString  name = " + name + " val =" + result)
        if (ANDROID_ID == name) {
            console.log("getString 获取 androidID")
            log();
        }
        return result;
    }

    Secure.getStringForUser.implementation = function (resolver, name, userHandle) {
        var result = this.getStringForUser(resolver, name, userHandle);
        console.log("getStringForUser  name = " + name + " val =" + result)
        if (ANDROID_ID == name) {
            console.log("Secure getStringForUser 获取 androidID")
            log();
        }
        return result;
    }

    var SecureSystem = Java.use("android.provider.Settings$System")
    SecureSystem.getStringForUser.implementation = function (resolver, name, userHandle) {
        var result = this.getStringForUser(resolver, name, userHandle);
        console.log("System getStringForUser  name = " + name + " val =" + result)
        if (ANDROID_ID == name) {
            console.log("System getStringForUser 获取 androidID")
            log();
        }

        return result;
    }
}

function checkPermission() {
    console.log("----------- 权限检查 -----------")

    var ActivityCompat = Java.use("android.app.Activity")
    ActivityCompat.requestPermissions.overload("[Ljava.lang.String;", "int")
        .implementation = function (permissions, requestCode) {
            console.log("requestPermissions 2 requestCode = " + requestCode + "  permissions = " + permissions)

            log();
            this.requestPermissions(permissions, requestCode)
        }

    var Fragment = Java.use("android.app.Fragment")
    Fragment.requestPermissions.implementation = function (permissions, code) {
        console.log('权限申请  android permissions = ' + permissions + "  code = " + code);
        log();

        this.requestPermissions(permissions, code)
    }

    var Fragmentx = Java.use("androidx.fragment.app.Fragment")
    Fragmentx.requestPermissions.implementation = function (permissions, code) {
        console.log('权限申请 androidx permissions = ' + permissions + "  code = " + code);
        log();

        this.requestPermissions(permissions, code)
    }
}

function checkStartActivity() {
    console.log("----------- startActivity 检查 -----------")


    var Instrumentation = Java.use('android.app.Instrumentation');
    Instrumentation.execStartActivity
        .overload(
            'android.content.Context',
            'android.os.IBinder',
            'android.os.IBinder',
            'android.app.Activity',
            'android.content.Intent',
            'int',
            'android.os.Bundle')
        .implementation =
        function (
            who, contextThread, token, target, intent, requestCode, options) {
            console.log(
                '【当前应用 1   Instrumentation】 启动 execStartActivity  intent = ' +
                intent);
            var pkg = intent.getPackage()
            console.log('pkg = ' + pkg)
            if (pkg != undefined && pkg != NULL && pkg == 'com.xiaomi.market') {
                intent.setPackage('com.heytap.market')
            }

            log();

            return this.execStartActivity(
                who, contextThread, token, target, intent, requestCode, options);
        }

    Instrumentation.execStartActivity
        .overload(
            'android.content.Context',
            'android.os.IBinder',
            'android.os.IBinder',
            "java.lang.String",
            'android.content.Intent',
            'int',
            'android.os.Bundle')
        .implementation =
        function (
            who, contextThread, token, target, intent, requestCode, options) {
            console.log(
                '【当前应用 2   Instrumentation】 启动 execStartActivity  intent = ' +
                intent);
            var pkg = intent.getPackage()
            console.log('pkg = ' + pkg)
            if (pkg != undefined && pkg != NULL && pkg == 'com.xiaomi.market') {
                intent.setPackage('com.heytap.market')
            }

            log();

            return this.execStartActivity(
                who, contextThread, token, target, intent, requestCode, options);
        }

    Instrumentation.execStartActivity
        .overload(
            'android.content.Context',
            'android.os.IBinder',
            'android.os.IBinder',
            "java.lang.String",
            'android.content.Intent',
            'int',
            'android.os.Bundle',
            "android.os.UserHandle"
        )
        .implementation =
        function (
            who, contextThread, token, resultWho, intent, requestCode, options, user) {
            console.log(
                '【当前应用 3   Instrumentation】 启动 execStartActivity  intent = ' +
                intent);
            var pkg = intent.getPackage()
            console.log('pkg = ' + pkg)
            if (pkg != undefined && pkg != NULL && pkg == 'com.xiaomi.market') {
                intent.setPackage('com.heytap.market')
            }

            log();

            return this.execStartActivity(who, contextThread, token, resultWho, intent, requestCode, options, user)
        }

    Instrumentation.checkStartActivityResult.implementation = function (res, intent) {
        console.log('【checkStartActivityResult 启动  intent = ' + intent);

        log();

        return this.checkStartActivityResult(res, intent)
    }
}
Android逆向-Frida的Hook之旅 有多长,所以我读取了256个字节,那这256个字节肯定不是我全想要的,我们知道文件名中肯定不能存在0x00字节,而且C语言中字符串是要以0x00**‘\0’作为截断的,所以我用 split(b’\x00’)[0]分割字符串并且取列表中的第一项输出到文件。细心的同学可能会发现,我这次没有用spawn()函数来启动chrome应用,因为如果你想hook的动作如果不是在程序开始就进行的话,而是可控的动作,那么你直接attach到其相应的进程上就好了,这样可以避免我从程序一开始就大量hook open, 阅读详情

相关推荐

frida反检测

frida的检测原理及其对抗

weixin_40306397的博客 3063

记录安装mysql5.7 ODBC组件失败解决方法

在安装mysql5.7时 ODBC模块安装失败,日志显示: 1: Error 1918.Error installing ODBC driver MySQL ODBC 5.3 ANSI Driver, ODBC error 13: 无法加载 MySQL ODBC 5.3 ANSI Driver ODBC 驱动程序的安装例程,因为存在系统错误代码 126: 找不到指定的模块。 原因:缺少Microsoft visual C++ 2013 解决办法:在网上下个Microsoft visual C++ 2.

sinat_35960326的博客 1300

从零构建Frida Hook环境:实战绕过安卓Root检测的完整指南

本文详细介绍了如何从零构建Frida Hook环境,并实战绕过安卓应用中的Root检测机制。通过环境搭建、Root检测原理分析、Frida Hook技术实战及综合绕过方案设计,帮助安全工程师掌握动态分析工具Frida的核心应用,有效应对安卓逆向工程中的安全挑战。

f0g1h2的博客 794

frida 精髓:hook 参数、修改结果、参数构造、方法重载、隐藏函数的处理、远程调用(RPC)、互联互通、动态修改

hook参数、修改结果、参数构造、方法重载、隐藏函数的处理、远程调用(RPC)、互联互通、动态修改

freeking101的博客 1万+

Frida Hook技术实战:绕过安卓应用反Hook检测的完整方案

Hook技术作为动态分析的核心手段,通过在程序运行时拦截和修改函数调用,实现对应用行为的深度监控与定制。其原理基于内存注入和函数重定向,能够在不修改源码的情况下改变程序执行流。这项技术在移动安全研究、逆向工程和自动化测试领域具有重要价值,常用于分析加密算法、绕过验证逻辑等场景。然而,随着应用安全防护的升级,反Hook检测机制日益普遍,通过检测Frida运行环境、校验代码完整性等手段识别Hook行为。本文聚焦于安卓平台,针对常见的反Hook检测手段,提供了一套完整的Frida绕过方案,涵盖端口隐藏、内存痕迹清

weixin_30482383的博客 417

Frida Hook进阶:如何绕过安卓应用的Root检测(实战案例解析)

本文深入解析如何利用Frida Hook技术绕过安卓应用的Root检测机制,涵盖Java层和Native层的实战案例。通过动态插桩和环境搭建,详细展示了如何对抗文件系统检查、属性验证等复杂检测手段,为移动安全研究提供实用解决方案。

julia4scientist的博客 836

【FridaHook整理】Frida安装及Hook安卓常用脚本

1 概述 在逆向过程中,Frida是非常常用的Hook工具,这个工具在日常使用的过程中,有很多通用方法,这里记录一下,方便查阅,部分函数使用的时候,可能需要稍微修改一下,本文记录是Android的方法,不涉及其他的 主要是搬迁的一下参考文章的片段 Android逆向之旅—Hook神器家族的Frida工具使用详解 Frida官方文档 看雪 Frida官方手册 - JavaScript API(篇一) 看雪 Frida官方手册 - JavaScript API(篇二) Js中几种String Byte转换方法

杰孑的博客 4万+

Android应用逆向实战:使用Frida Hook技术定位加密函数与提取API密钥

在移动应用安全领域,动态代码插桩技术是分析应用运行时行为、理解其安全机制的核心方法。其原理是通过在目标进程运行时注入代码,拦截并修改函数调用,从而实现对应用逻辑的深度观察与控制。这项技术的核心价值在于,它能够绕过静态混淆和加密,直接洞察应用的真实执行流程,对于安全评估、漏洞挖掘和协议分析至关重要。典型的应用场景包括分析网络通信加密、定位身份认证逻辑、研究代码保护方案等。本文以Android平台为例,聚焦于使用Frida这一主流动态插桩框架,通过Hook技术层层深入,实战演示如何定位应用中的加密函数,并最终提

weixin_30335353的博客 1226

frida的hook代码:在python中格式,以及常用hook方法

简单的聊了一些frida在python中使用的格式: Java.perform(),以及Java.use或者Java.choose ,还有对重载方法的调用。

u011863822的博客 4118

Android应用Root检测绕过实战:Frida动态Hook与逆向分析

在移动应用安全领域,逆向工程与动态分析是理解应用安全机制的核心技术。其基本原理是通过分析应用代码逻辑,在运行时修改关键函数行为,从而绕过安全检测。这项技术的价值在于帮助安全研究人员评估应用防护强度,发现潜在漏洞。在实际应用场景中,金融类APP常部署多层防护机制,包括Java层和Native层的Root检测。通过Frida等动态注入工具,可以Hook关键检测函数,篡改返回值,实现环境伪装。本文聚焦于Root检测绕过,详细介绍了从静态分析定位检测点到动态Hook修改逻辑的完整流程,并分享了Frida脚本编写与反

weixin_34015336的博客 511

iOS抓包实战:利用Frida Hook绕过CFNetwork代理检测

在移动应用开发和逆向工程中,网络抓包是分析通信协议、调试接口的关键技术。其核心原理是通过代理服务器拦截和转发网络请求,从而实现对数据包的捕获与分析。然而,许多iOS应用会通过系统API主动检测代理设置,一旦发现流量被重定向,便会触发防御机制,导致抓包失败。这种技术对抗在安全研究和测试中尤为常见。Frida作为一款强大的动态代码插桩工具,提供了在运行时修改函数行为的解决方案,能够有效应对此类检测。通过Hook CFNetwork框架中的关键函数,可以实时篡改其返回值,从而绕过代理检测,确保网络流量正常流经抓包

weixin_30751947的博客 398

Frida Hook 常用函数、java 层 hook、so 层 hook、RPC、群控

Frida Hook 常用函数、java 层 hook、so 层 hook、RPC、群控

freeking101的博客 2万+

【Frida Android】实战篇19:Frida检测绕过实战

本章以一个具备加解密核心功能的示例APK为分析对象,该APK被接入了开源加壳工具dpt-shell的加固逻辑,其中内置了针对性的Frida检测机制——一旦检测到Frida注入行为,会直接触发应用进程崩溃。不依赖脱壳技术,仅通过Frida动态Hook的方式绕过加壳层的Frida检测逻辑,并成功Hook到应用的加解密函数,获取加解密过程中的明文、密文信息。本章节使用的示例 APK、相关工具如下:链接: https://pan.baidu.com/s/1aK9UKvLcfJi3Yek_E0WFOQ。

水滴石穿 1611

App逆向Frida--hook

说到逆向APP,很多人首先想到的都是反编译,但是单看反编译出来的代码很难得知某个函数在被调用时所传入的参数和它返回的值,极大地增加了逆向时的复杂度,有没有什么办法可以方便地知道被传入的参数和返回值呢?

zjl10110916的博客 2997

matlab物元可拓模型程序,熵权可拓物元模型

1 概述物元分析方法是中国学者蔡文于20世纪80年代提出的用于解决矛盾问题的技术方法,是研究物元及其变化规律,解决现实世界中不相容问题的有效方法,可应用于生态环境,水资源承载力,农用地分级和土地生态水平等综合评价研究中.本文主要介绍了熵权可拓物元模型的相关概念与该模型的建立过程.2 概念2.1 物元物元分析法的主要思想是把事物用"事物,特征,量值"(分别用N,C,V表示)3个要素以有序三元组的形式...

weixin_33823399的博客 4118

大唐豪侠服务器列表文件格式错误,关于大唐豪侠一键端的一些问题心得

有人问了大唐豪侠架设方面的问题,我简单研究了一下,做了个整理,现放出来大家一起研究讨论,我是把服务端的解压到了D盘里面了。第一个问题:架设成功后,运行客户端提示获取服务器列表失败,这个原因是因为压缩的一键端是整理过的,我们需要把服务器列表等解压出来,详见截图首先到这个目录里面找到package.zip,找到这个以后这里要注意,解压路径里面一定不要有package,这个解压成功后就有了服务列表等...

weixin_42530536的博客 1528

Android Hook之Frida安装使用

Frida 是一个动态检测框架,允许开发人员在 Windows、macOS、Linux、iOS 和 Android 上的原生应用程序中注入 JavaScript 或 Python 脚本。该框架可用于操纵应用程序的行为、从中提取信息或与其进行通信。Frida 通常被安全研究人员和渗透测试人员用来对应用程序进行动态分析,并执行钩子函数调用、跟踪函数调用和反向代码等任务。对于移动应用开发人员来说,它也很有用,可以用来进行测试或自动化等任务。

专注于Python编程技术的分享与交流,致力于帮助开发者提升编程技能,解决实际问题,探索Python的无限可能。 4808

Python数据分析案例——宏观经济指标与沪深指数实证研究分析

沪深300指数与宏观经济指标关联性研究:2015-2024实证分析 摘要:本文基于2015-2024年月度数据,采用多元回归方法分析宏观经济指标对沪深300指数的影响。研究发现,市场情绪(SEN)、美国利率(STY)、美元指数(DXY)、狭义货币供应量(M1)和CPI对指数具有显著解释力(P<0.05),而GDP、LPR等传统指标影响不显著。模型解释力达62%(R²=0.62),表明A股短期走势更受资金流动、投资者心理和国际金融条件驱动。研究为投资者提供了除基本面外的市场预判指标,建议关注M1增速、美

weixin_50902344的博客 1406

Frida Hook 安卓 app 快捷入口

Frida 是一款强大的动态分析工具,可用于 Hook 应用、分析加密逻辑、截取运行时信息等。本文结合真实场景,讲解如何使用 Frida 分析 App 中的页面跳转行为,并通过 ADB 模拟跳转。

qq_19127205的博客 1552

思科网络进阶——多生成树协议(MSTP)配置的一课一得

三、实验拓扑1)设计一个网络架构,要有核心层和接入层,都使用思科交换机。2)企业有4个部门,要求这四个部门都可以上网,但分属不同的VLAN中,这样今后可以做其它安全策略以确保网络安全,这些策略如今后学到的访问控制列表ACL。3)网络架构的设计要具有冗余,防止一条线路或一台设备终端导致的业务中断。4)由于硬件冗余而产生的环路要处理好,也就是要在逻辑上(或者说通过配置)防止物理环路的产生。5)不能因为防止物理环路而导致某端口没有流量,这样浪费端口资源及设备间互联的带宽资源。

zhu52010的博客 3398

正点原子lwIP实战指南——从FreeRTOS移植到网络应用开发

本文详细介绍了如何将轻量级TCP/IP协议栈lwIP移植到FreeRTOS实时操作系统上,并基于正点原子STM32开发板进行网络应用开发。内容涵盖从使用STM32CubeMX快速搭建工程、核心概念解析(RAW/NETCONN/Socket API),到关键的系统适配、驱动实现,并通过TCP Echo服务器和云台控制两个实战案例,手把手指导读者完成从移植到应用开发的全过程,帮助嵌入式开发者快速掌握lwIP在FreeRTOS环境下的稳定部署与开发技巧。

s4t5u6v的博客 1000

Android hook工具Frida安装与使用

Android hook工具主要有Xposed、Substrate和Frida,Xposed用于hook java层,Substrate用于hook Native层,Frida既能用户hook java层,又能用于hook Native层。这三款工具中Frida配置环境简单,兼容性好,用户逆向破解非常方便。 本文中配置环境为: PC端:win10 Android端:基于arm64 python:2...

littlecjx 7686

不用Root也能抓包?Android高版本HTTPS抓包的3种替代方案(含Charles技巧)

本文针对Android高版本HTTPS抓包难题,提供了三种无需Root权限的实战解决方案:利用VirtualXposed等虚拟沙盒环境、配置Postern等系统级代理工具,以及通过修改应用源码或网络安全配置。文章还详细解析了Charles抓包工具在非Root环境下的高级配置与排错技巧,帮助开发者在遵守安全规范的前提下,有效进行网络调试与监控。

http9protocoller的博客 648

Frida iOS Hook 使用指南

--- ## 安装指南 ### 系统要求 本工具支持MacOS、Linux以及Windows操作系统,推荐使用Python环境3.x版本。 #### 获取工具 你可以通过两种方式获取最新版本的`frida-ios-hook`: 1. 直接从**GitHub Releases**页面下载最新版本。 2. 通过Git克隆开发分支:`git clone -b dev https://github....

gitblog_01294的博客 1912

基于Simulink的鲸鱼优化算法(WOA)MPPT仿真

摘要:本文介绍了基于Simulink的鲸鱼优化算法(WOA)在光伏MPPT控制中的应用。WOA模拟座头鲸的"气泡网捕食策略",通过包围猎物、螺旋收缩和随机搜索三阶段动态平衡全局探索与局部开发能力,有效解决局部阴影导致的多峰P-V曲线问题。文章详细讲解了WOA-MPPT的Simulink建模过程,包括多峰光伏阵列建模、WOA控制器实现和Boost变换器控制。仿真结果显示,在三种典型工况下,WOA-MPPT的追踪效率>99.3%,动态响应时间<0.15s,性能优于传统算法。最后提出了混合WO

amy_mhd的博客 73

SAPGUI 与 ADT 的时代分野:在多云架构下,谁还能代表现代 SAP 开发

摘要(149字) SAP开发工具正经历代际更迭:SAPGUI基于专有协议(NI/DIAG)的厚客户端架构难以适配多云环境,而ADT(ABAP Development Tools)通过HTTP(S)协议和Eclipse生态成为ABAP Cloud/RAP开发的唯一入口。关键差异体现在:ADT支持CDS、行为定义等云原生对象建模,天然对齐BTP的零信任网络;集成ATC、Git等DevOps工具链;而SAPGUI无法创建RAP核心对象,在跨平台、自动化方面存在硬限制。官方文档明确将ADT作为Clean Core战

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 392
上一篇: 从 AGP 4.1.2 到 7.5.1——自定义混淆映射失效?
下一篇: 鸿蒙 DevEco Studio 代码补全没提示?
Primer@.com
博客等级 码龄9年 524粉丝 292原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值