运用smali自动注入技术分析android应用程序行为

app安卓逆向之smali代码log注入与原代码修改 文章目录1.背景分析2.概述3.开始3.1smali代码基础知识普及3.2apktool的基本使用3.3构建个人Log类并且反编译成Smali文件注入到某电商App中3.4重编译修改后的App项目,安装到模拟器中运行并使用注入的代码打印日志总结 1.背景分析 在安卓逆向的过程中常常会面临三个场景 想要了解某个方法是否有被调用 经过常规的代码分析后,想要知道App某些方法内部某些变量的值 App在Jave层的一些安全检测代码在我们的研究阶段需要屏蔽及修改 以上第一、第二个场景使用Xposed、 阅读详情

       现在android开发者社区里,除了app开发外,还有很多周边的工具类产品,比如安全、性能等,app产品

已经出现了巨无霸,但是工具类的产品,目前还没有出现规模比较大的公司,大部分还处于创业阶段,这可能

是创业者的下一个机会。工具类的产品相对app开发有比较高的技术门槛,从事这方面开发的技术人员需要掌

握的基本功如下:

1、熟悉android app的编译过程,了解jvm的bytecode与dalvik bytecode的区别;

2、熟悉android framework,读过部分代码,比如系统启动过程,zygote进程相关逻辑,熟练使用ndk,

      掌握inline hook的基本原理;

3、熟练使用脚本语言,比如python,脚本语言在一些分析工具的开发中还是有很大优势的,而且一些著名的

      开源工具也是用python写的,比如androguard;

4、熟悉apk文件的结构,熟悉dex文件的结构,比如dex文件头的结构;

5、熟悉smali语法,熟练使用apktool等工具,能解析smali文件,并读入内存自定义数据结构中;

      有了上述功底,可以做的事情有很多,比如可以通过smali注入的方式插入自定义代码来监控app的行为数据,

包括性能数据以及部分逻辑数据,可以通过inline hook的方式在运行时监控应用的行为,笔者做了一个工具可以

自动往apk中插入smali代码,具体的步骤如下:

1、通过androguard解析apk文件,并获得dex文件;

2、通过baksmali将dex文件反编译为smali文件;

3、开始解析smali文件,将smali文件映射为内存数据结构;

4、分析smali文件,找出需要替换的方法关键字,并通过改写smali文件的方法注入代码;

      当然这里面有很多细节问题需要解决,比如插入代码后会对原有的smali代码逻辑产生影响,如寄存器数量

增加,寄存器的的使用,跳转逻辑的影响,这些都需要你自己分析需要插入或者替换的代码上下文逻辑,使插入逻辑正确。

     我下面以json为例,来详细描述如何替换smali代码:

json对象初始化的smali代码:

    new-instance v3, Lorg/json/JSONObject;

    invoke-direct {v3, p0}, Lorg/json/JSONObject;-><init>(Ljava/lang/String;)V

      第一行代码用来生成一个JSONObject对象,并放到v3寄存器中,第二行代码

调用v3中JSONObject对象的init方法,参数为存在p0寄存器(第一个参数)中的String对象调用json对象

格式化字符串jsonObject.toString,对应的smali代码如下:

    invoke-virtual {v3}, Lorg/json/JSONObject;->toString()Ljava/lang/String;

    move-result-object v8

      第一行代码调用v3中存放的json对象的toString方法,第二行代码将该返回值存放到v8寄存器中。

     下面定义一个静态的方法,覆盖jsonobject对应的方法:

	public static String toString(JSONObject jsonObject) {
		String jsonString = jsonObject.toString();
		Log.i("json toString:" + jsonString);
		return jsonString;
	}
     ok,剩下的就是将smali代码里的逻辑改为调用上面的静态方法,替换后的内容如下:

    invoke-static {v3}, Lcom/test/JsonReplace;->toString(Lorg/json/JSONObject;)Ljava/lang/String;

    move-result-object v7

     init方法做同样的处理,这样就可以截获json对象的内容,从而可以监控使用json来上传数据的app内容,

如果在上面的方法开始和结束的地方获取系统时间,还可以用来获取json toString方法耗费的时间。

    json方法只是众多可以捕获的方法之一,按照类似的逻辑还可以捕获更多您感兴趣的方法。

   为了测试一下smali自动注入的成果,笔者下载了一个360安全卫士,进行了自动注入,此处需要注意的是,

修改完smali后需要重新打包签名,而360安全卫士在启动时做了签名校验,如果发现签名不一致会弹出一个

对话框让你去下载应用并退出,不过这也可以通过修改smali代码的方式来解决,可以找到签名校验的地方将

返回值改为1即可,由于这部分的内容涉及app的安全策略,且和本文的主题没有多大关系,所以笔者就不写

出来了,有兴趣的可以私下交流。

注入smali后可以抓取到360安全卫士上传的所有json字符串内容,我摘取了其中的部分内容:

json init:{"ads":[{"des":"1mob","ris":0,"name":"1mob","fbs":[{"t":1,"s":1,"c":"ff#*#1a#/BR;#1a#/PIA;#1a#/Main;#1a#/PManager;#1a#Ljava/lang/reflect/Method;.getParameterTypes:()[Ljava/lang/Class;#1a#Ljava/lang/Class;.getDeclaredMethods:()[Ljava/lang/reflect/Method;","n":"ad.push.1mob","st":2},{"t":1,"s":0,"c":"ff#*#1a#/BR;#1a#/US;#1a#/Main;#1a#/UNManager;#1a#Ljava/lang/reflect/Method;.getParameterTypes:()[Ljava/lang/Class;#1a#Ljava/lang/Class;.getDeclaredMethods:()[Ljava/lang/reflect/Method;#1a#setGapTime","n":"ad.spot.1mob","st":8}]},{"des":"360dianjing","ris":0,"name":"360dianjing","fbs":[{"t":1,"s":0,"c":"ff#*#1a1#http://mob.tf.360.cn/#1a1#360dianjing#1a1#ibstates.php","n":"ad.banner.360dianjing.a","st":1},{"t":1,"s":0,"c":"ff#*#1a1#http://ads.lianmeng.360.cn/#1a1#360dianjing#1a1#ibstates.php","n":"ad.banner.360dianjing.b","st":1}]},{"des":"3gyu","ris":0,"name":"3gyu","fbs":[]},{"des":"7xpush","ris":0,"name":"7xpush","fbs":[{"t":1,"s":1,"c":"ff#*#1a1#http://www.qixiazi.com/ads.xml#1a1#com.kding.ads.service.DownService#1a1#/kding/ads#1a1#notification","n":"ad.push.7xpush","st":2}]},{"des":"91zan","ris":0,"name":"91zan","fbs":[{"t":1,"s":0,"c":"ff#*#1a1#com.skpresent.shell.ShellServiceKit#1a1#zpresent.jar#1a1#zpresent.dex","n":"ad.banner.91zan.a","st":1},{"t":1,"s":0,"c":"ff#*#1a1#com.skpop.shell.ShellServiceKit#1a1#zpop.jar#1a1#zpop.dex","n":"ad.banner.91zan.b","st":1},{"t":1,"s":0,"c":"ff#*#1a1#com.skfloat.shell.ShellServiceKit#1a1#zfloat.jar#1a1#zfloat.dex","n":"ad.banner.91zan.c","st":1},{"t":1,"s":1,"c":"ff#*#1a1#com.skpush.shell.ShellServiceKit#1a1#zan_dev_appconfig_push#1a1#zpush.dex","n":"ad.push.91zan","st":2}]},{"des":"98mid","ris":0,"name":"98mid","fbs":[{"t":1,"s":1,"c":"ff#*#1a1#img=D:/images#1a1#myAppMarket98mid#1a1#times.bat#1a1#http://www.98mid.com/","n":"ad.push.98mid","st":2}]},{"des":"A立方广告","ris":33,"name":"a3ad","fbs":[{"t":1,"s":0,"c":"ff#*#1a1#Lcom/allyes/a3/sdk/widget/AdView;","n":"ad.banner.a3ad","st":1}]},{"des":"adchina","ris":33,"name":"adchina","fbs":[{"t":1,"s":0,"c":"ff#*#1a1#Lcom/adchina/android/ads/AdManager;","n":"ad.banner.adchina.b","st":1},{"t":1,"s":0,"c":"ff#*#1a1#Lcom/adchina/android/ads/views/AdView;","n":"ad.banner.adchina.c","st":1}]},{"des":"adcocoa","ris":0,"name":"adcocoa","fbs":[{"t":1,"s":0,"c":"ff#*#1a1#adcocoa_icon_default.png#1a1#adcocoa_id#1a1#adcocoa/cache","n":"ad.spot.adcocoa","st":8}]},{"des":"ader","ris":0,"name":"ader","fbs":[{"t":1,"s":0,"c":"ff#*#1a1#AdBigWebView#1a1#com.rrgame.sdk#1a1#banner","n":"ad.banner.ader","st":1}]},{"des":"adfonic","ris":0,"name":"adfonic","fbs":[{"t":1,"s":0,"c":"ff#*#1a1#http://adfonic.net/ad/","n":"ad.banner.adfonic","st":1}]},{"des":"adlantis","ris":0,"name":"adlantis","fbs":[{"t":1,"s":0,"c":"ff#*#1a#Ljp/adlantis/android/","n":"ad.banner.adlantis.a","st":1},{"t":1,"s":0,"c":"ff#*#1a1#sp.ad.adlantis.jp","n":"ad.banner.adlantis.b","st":1}]},{"des":"adlayout","ris":32,"name":"adlayout","fbs":[{"t":1,"s":0,"c":"ff#*#1a1#Lnet/adlayout/ad/AdLayout;","n":"ad.gather.adlayout","st":11}]},{"des":"admarket","ris":0,"name":"admarket","fbs":[{"t":1,"s":0,"c":"ff#*#1a1#showmyappdialog#1a1#huituixiazai","n":"ad.banner.admarket","st":1}]},{"des":"admob","ris":0,"name":"admob","fbs":[{"t":1,"s":0,"c":"ff#*#1a1#http://a.admob.com/f0?#1a1#AdMobSDK",


/catchjson( 7454): json toString:{"pkg":"org.orangenose.games","ti":{"v":0,"m":2},"si":{"v":22907852054,"m":511}}
I/catchjson( 7454): json toString:{"pkg":"cn.ishuidi.shuidi","ti":{"v":0,"m":2},"si":{"v":22906475797,"m":511}}
I/catchjson( 7454): json toString:{"pkg":"net.ot24.et.sqt","ti":{"v":0,"m":2},"si":{"v":22906475797,"m":511}}
I/catchjson( 7454): json toString:{"pkg":"cc.freecall.ipcall","ti":{"v":0,"m":2},"si":{"v":22906542357,"m":511}}
I/catchjson( 7454): json toString:{"pkg":"cn.btcall.ipcall","ti":{"v":0,"m":2},"si":{"v":22906542613,"m":511}}
I/catchjson( 7454): json toString:{"pkg":"cn.pyt365.ipcall","ti":{"v":0,"m":2},"si":{"v":22906541333,"m":511}}
I/catchjson( 7454): json toString:{"pkg":"com.lanshan.weimi","ti":{"v":0,"m":2},"si":{"v":22907853334,"m":511}}
I/catchjson( 7454): json toString:{"pkg":"com.liulishuo.engzo","ti":{"v":0,"m":2},"si":{"v":22907591190,"m":511}}
I/catchjson( 7454): json toString:{"pkg":"com.wandoujia.phoenix2.usbproxy","ti":{"v":0,"m":2},"si":{"v":22906541333,"m":511}}
I/catchjson( 7454): json toString:{"pkg":"com.dnurse","ti":{"v":0,"m":2},"si":{"v":22906475797,"m":511}}
I/catchjson( 7454): json toString:{"pkg":"com.sec.android.app.myfiles","ti":{"v":0,"m":2},"si":{"v":22906475797,"m":511}}
I/catchjson( 7454): json toString:{"pkg":"com.qihoo360.smartkey","ti":{"v":10,"m":2},"si":{"v":22906475797,"m":511}}
I/catchjson( 7454): json toString:{"pkg":"com.qihoo.wifi","ti":{"v":10,"m":2},"si":{"v":22906475797,"m":511}}
I/catchjson( 7454): json toString:{"pkg":"com.qihoo.antivirus","ti":{"v":10,"m":2},"si":{"v":22906475797,"m":511}}
I/catchjson( 7454): json toString:{"pkg":"com.android.fileexplorer","ti":{"v":0,"m":2},"si":{"v":22906475797,"m":511}}
I/catchjson( 7454): json toString:{"pkg":"com.meizu.filemanager","ti":{"v":0,"m":2},"si":{"v":22906475797,"m":511}}
I/catchjson( 7454): json toString:{"pkg":"com.android.browser","ti":{"v":0,"m":2},"si":{"v":22906475797,"m":511}}
I/catchjson( 7454): json toString:{"s":"11146d3626e64dab800a6a0ae57e4ec0","a":1119509,"t":10}
I/catchjson( 7454): json toString:{"s":"12332c1955435e036a5a94df4e188bd7","a":1119509,"t":10}
I/catchjson( 7454): json toString:{"s":"15db4f6a2b422f536cd3ce8230120e35","a":1119509,"t":10}
I/catchjson( 7454): json toString:{"s":"1d4dcf3a79293e05fa9744444263d048","a":1119509,"t":10}
I/catchjson( 7454): json toString:{"s":"328f0b456d41a3f19464241ab327b6c5","a":1119509,"t":10}
I/catchjson( 7454): json toString:{"s":"3bd87d5c8d98f7d711eff0d82d8fe7b9","a":1119509,"t":10}
I/catchjson( 7454): json toString:{"s":"517badabd9c40f1fca00d0b74d514a31","a":1119509,"t":10}
I/catchjson( 7454): json toString:{"s":"58f2fe7e4a67c1ba29c2a5c58c66739b","a":1119509,"t":10}
I/catchjson( 7454): json toString:{"s":"5b252a142a450b34bd3253acb51882bd","a":1119509,"t":10}
I/catchjson( 7454): json toString:{"s":"6d1fc48aeafe7286cfc9b05d815fd9f9","a":1119509,"t":10}
I/catchjson( 7454): json toString:{"s":"72fa45c1f82c02200c2bb769f641759e","a":1119509,"t":10}
I/catchjson( 7454): json toString:{"s":"829e5b4f1e9725ee6a3900009521d6df","a":1119509,"t":10}
I/catchjson( 7454): json toString:{"s":"8609665349f3431def232651c7785b86","a":1119509,"t":10}
I/catchjson( 7454): json toString:{"s":"8823a09ee4baaf6c63d767e56e5a295d","a":1119509,"t":10}
I/catchjson( 7454): json toString:{"s":"ca45263bc938da16ef1b069c95e61ba2","a":1119509,"t":10}
I/catchjson( 7454): json toString:{"s":"d488edaf562233024a034073f7d2bd93","a":1119509,"t":10}
I/catchjson( 7454): json toString:{"s":"dc6dbd6e49682a57a8b82889043b93a8","a":1119509,"t":10}
I/catchjson( 7454): json toString:{"s":"fec53268a38f029357056d46098c9384","a":1119509,"t":10}
I/catchjson( 7454): json toString:{"s":"bb5cf8250d16d684a7b1e28b12780636","a":1119509,"t":10}

     至于字符串里内容的用处,由于笔者没有分析其代码逻辑,且和我的写作主题无关,所以不做解释,这里仅此

技术角度来分析通过自动注入smali代码的方式来获得应用行为的可能性,并且检测一下笔者开发的自动化注入

工具,无他意。

     这里是通过smali注入的技术来获取应用的数据,还可以通过inline hook的方式,动态抓取应用的行为数据,

这个笔者也做了个工具,后续写文章详细介绍。








       





android逆向分析中常用的smali注入代码 1、增加调试Log的信息 例如: Log.d("Text","Hello smalo");   使用Smali指令来描述为: const-string v1, "Text" const-string v2, "Hello smalo" invoke-static {v1, v2}, Landroid/util/Log;->d(Ljava/lang/String;Ljava 阅读详情

相关推荐

Android APK后门注入攻防研究:从Smali注入到防御加固

在移动安全领域,代码注入是一种常见的技术手段,其核心原理是通过修改应用程序的执行流程,插入额外的功能代码。从技术价值看,理解注入机制有助于构建更有效的应用防护体系,尤其在Android生态中,APK的重打包与签名绕过是攻击链的关键环节。应用场景包括安全评估、漏洞挖掘和恶意软件分析等。本文聚焦于APK后门注入的实战,详细解析了使用Apktool进行反编译、在Smali层进行代码注入、以及重打包签名的完整流程,并探讨了如何通过完整性校验和代码混淆等技术进行有效防御。

congdi7904的博客 423

android 程序动态分析,带你深入一款Android应用程序动态分析工具———Inspeckage...

Inspeckage是一个用来动态分析安卓app的xposed模块。Inspeckage对动态分析很多常用的功能进行了汇总并且内建一个webserver。整个分析操作可以在友好的界面环境中进行。安装和使用笔记Inspeckage使用笔记安卓分析工具Inspeckage介绍打开APP选中要分析的进程,然后launch APP即可然后执行命令adb forward tcp:8008 tcp:8008,...

weixin_33821888的博客 1765

Android逆向实战:通过smali/baksmali动态注入DEX逻辑

本文详细介绍了在无源码条件下对Android应用进行动态逻辑注入的实战方法。通过使用smali和baksmali工具对DEX文件进行反编译、修改与重打包,实现在目标方法中插入自定义代码(如日志打印),并分享了定位目标、处理寄存器、避免常见错误的实用技巧与避坑指南。

weixin_29008691的博客 364

[免费专栏] Android安全之APK应用程序分析「附带Smali基础语法解析」

转移发布平台通知:将不再在优快云博客发布新文章,敬请移步知识星球... ...

橙留香Park的博客 1288

安卓逆向工程实战:从静态分析到动态调试的完整技术路径

逆向工程是理解软件内部工作机制的关键技术,其核心原理是通过分析程序的二进制代码或运行时行为,还原其设计逻辑与算法实现。这项技术在软件安全评估、漏洞挖掘、协议分析和兼容性开发等领域具有重要价值。在移动安全领域,安卓应用逆向分析尤为常见,涉及对APK文件的解包、反编译、代码审计及动态行为监控。通过静态分析工具(如JADX、Apktool)可初步探查代码结构,而动态调试技术(如基于smalidea的调试或Frida框架)则能实时捕获运行时数据与算法细节。本文以一次典型的安卓应用逆向分析实战为例,系统演示了从环境搭

weixin_34176694的博客 439

[车联网安全自学篇] Android安全之Android APP动态调试的三种Smali注入小技巧

动态调试是在没有软件源代码的情况下,通过调试程序来跟踪分析汇编代码,查看寄存器的值,了解软件的执行流程,反馈程序执行时的中间结果动态调试一般与静态分析结合使用,尤其是在静态分析难以取得突破时,需要使用动态调试进行辅助分析。通过方法跟踪的方式,对Android SDK开发的Java层程序进行动态调试通过附加进程的方式,对Android NDK开发的原生动态链接库进行调试。

橙留香Park的博客 2797

动态分析 Android 程序—动态分析框架/工具

- 动态分析分为动态跟踪和动态调试; - 动态跟踪侧重于自动化分析,工具一般是自主研发或第三方提供的分析平台。在软件开发领域编写大型项目安全检测分析报告,以及在软件安全领域进行恶意代码与病毒的分析时,会广泛用到动态分析技术; - 动态调试需要分析人员参与进来,依靠调试器的能力完成分析工作。在进行动态调试时,除了调试器,还要分析人员自主确定分析点; - 开发软件时,一般可进行源码级调试,对设置断点的地方可通过阅读源码找到。逆向分析时,通常只能进行反汇编级别的调试,分析人员要通过阅读大量的反汇编代码来寻找

Andy0214的专栏 8683

别再用UE5默认材质:用Substance Painter一招提升写实感

今天,我就把这套从模型准备到引擎最终呈现的全流程技巧毫无保留地分享出来,这套方法不仅能让你的作品细节炸裂,更能让你理解次世代PBR(Physically Based Rendering)材质的底层逻辑。

海外旅居设计师,15年设计经验。 1325

json解析

解析json数据时首先需要一个org.json包,在开发android中系统已经有了这个包,所以不用再次导入。如果应用中没有这个包就会报错了,需要自己下载导入, 当然首先解析字符串时数据必须是json类型。 JSON的规则很简单:对象是一个无序的“‘名称/值’对”集合。 一个对象以“{”(左括号)开始,“}”(右括号)结束 每个“名称”后跟一个“:”(冒号) “‘名称/值’对”之间使用“,”

small_technical的博客 360

粒子群算法实战:用Matlab解决旅行商问题(TSP)的完整代码解析

本文提供了使用粒子群算法解决旅行商问题的完整Matlab实战指南。通过将连续空间的粒子群算法进行离散化改造,采用基于交换序的策略来更新粒子位置与速度,并给出了从问题定义、数据结构设计、核心函数实现到主迭代循环的详细代码解析。文章还探讨了参数调优、性能优化及处理复杂TSP变体的进阶思路,为物流规划、路径优化等领域的工程应用提供了可直接复用的解决方案。

m2n3o4p5的博客 350

高德地图可视化入门:零基础用Python+高德API打造你的第一个热力图

本文详细介绍了如何使用Python和高德地图API从零构建商业级热力图。通过环境配置、地理编码、数据清洗到最终可视化展示的全流程指南,帮助开发者快速掌握地图可视化技术,特别适合展示商圈人流、疫情热点等地理分布数据。

weixin_29053067的博客 306

我的360

112wew

762

一分钟学会MATLAB-数据清洗(含完整代码)

数据清洗是数据分析过程中的一个重要步骤,目的是提高数据的质量,以便进行更有效的分析。% 删除超出阈值的行。% 用线性插值填充缺失值。% 删除包含缺失值的行。% 找到缺失值的位置。% 可视化数据,识别异常值。缺失值是数据清洗中常见的问题。通过以上步骤,你可以有效地清洗数据,使其准备好进行后续的分析和建模。

2402_87132195的博客 3316

安卓逆向学习笔记(6)- smali注入攻击

今天,我要记录的是smali注入攻击。我们在破解某个apk时,通常的流程是这样的:先用某个工具逆向apk获取到源代码,然后再修改源代码,再用工具进行二次打包。通过前面一些文章的介绍,我们知道可以用dex2jar反编译classes.dex以获取java源代码,但是我们是无法对java源代码进行修改的。如果想要修改某个apk的源代码,我们必须先将该apk反编译,然后修改反编译所得到的smali代码,

蜗牛 9639

刷题单向链表

实现一个数据结构,维护一张表(最初只有一个元素 11)。接下来 qq 行,每行表示一次操作,操作具体间题目描述。a[i] 里面放的是下一个元素,为0代表链表结束。如单链表1->4 -> 2->3->0用数组表示是。对于每个操作 2,输出一个数字,用换行隔开。第一行一个整数 qq 表示操作次数。

power的专栏 1714

Codex入门19-数据库操作(解放双手:用自然语言写SQL、建表和数据迁移)

写 SQL 是后端开发的日常,但复杂的 JOIN、子查询、窗口函数总让人头疼。本文教你用 Codex CLI 实现:自然语言直接生成 CREATE TABLE、复杂 SQL 查询、数据库迁移脚本(Prisma/Knex/Alembic)、ORM 模型代码(SQLAlchemy/TypeORM)、甚至自动生成数据库文档。重点强调安全红线——永远不要让 AI 直接连接生产数据库。从需求描述到完整数据库层代码,一篇搞定。

yueyeguzhuo的专栏 234

Android逆向系列之动态调试2–Smali注入

一、Smali注入 Smali注入又称Smali插桩(Smali Instrumentation),WIKI解释:它是在保证被测程序原有逻辑完整性的基础上在程序中插入一些探针(又称为“探测仪”),通过探针的执行并抛出程序运行的特征数据,通过对这些数据的分析,可以获得程序的控制流和数据流信息,进而得到逻辑覆盖等动态信息,从而实现测试目的的方法。这里我们注意几个词,保证程序原有逻辑性、插入探针、抛出

nangongyanya的专栏 3222

dify制作的工作流如何通过API调用

本文介绍了如何通过Python程序调用Dify工作流API实现数据处理功能。文章详细展示了workflow和chatflow的调用方法,包括参数设置和结果输出,并提供了一个完整的API调用工具代码示例。该工具可实现文本处理、成果查重、关键词生成等功能,支持通过Python脚本或Postman进行调用。核心代码包含API请求函数和批量处理函数,通过HTTP请求与Dify服务端交互,实现自动化数据处理流程。

hhue2007的专栏 935

[免费专栏] Android安全之Android APP动态调试的三种Smali注入小技巧

转移发布平台通知:将不再在优快云博客发布新文章,敬请移步知识星球... ...

橙留香Park的博客 1768

YOLOv11损失函数进阶:融合SmoothL1与FocalLoss,让检测精度再涨10%的实战教程

在YOLOv11的这里的beta参数控制“L1与L2的过渡阈值”,默认设为1.0即可兼容多数场景。同样在# 计算动态alpha(基于类别样本数,需提前统计self.class_counts)# 交叉熵基础# FocalLoss权重else:使用前需统计数据集的(每个类别的样本数),并传入的alpha参数。损失函数是YOLOv11精度的“灵魂”——SmoothL1让边界框回归“稳、准、狠”,改进FocalLoss让类别分类“雨露均沾”。从代码改造到实战落地,本教程已为你搭建了一条精度跃升的路径。

m0_64661770的博客 213

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

运用smali自己主动注入技术分析android应用程序行为

如今android开发人员社区里,除了app开发外,还有非常多周边的工具类产品,比方安全、性能等,app产品 已经出现了巨无霸,可是工具类的产品。眼下还没有出现规模比較大的公司,大部分还处于创业阶段,这可能 是创业者的下一个机会。工具类的产品相对app开发有比較高的技术门槛,从事这方面开发的技术人员须要掌 握的基本功例如以下: 1、熟悉android app的编译过程...

weixin_30666753的博客 147

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

常用android的smali注入代码,android smali代码注入 实战一

有同学在通服里面干活,最近一直忙着4g基站搭建的干活,测试设备(android)测量移动网络数据,没有自动保存记录的功能,只能手动记录各种测试参数,不知道测试软件供应商是怎样想的,竟然不提供的这样的功能! 要我帮忙把测试数据自动导入excel表格中,我硬着头皮去尝试下。网上有smali的语法和注入的介绍,但参考价值不大,分享下自己的smali注入的过程和心得(这里smali语法就不讲了)。案例1....

weixin_42352842的博客 805

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

安卓逆向入门:从环境搭建到Smali修改与动态分析实战

移动应用安全分析是理解软件内部机制、进行安全评估的重要技术领域。其核心原理在于通过静态与动态分析技术,窥探和干预应用的运行逻辑。静态分析通过反编译将应用的字节码转换为可读的中间表示(如Smali),而动态分析则在应用运行时进行行为监控和代码注入,两者结合能有效应对代码混淆、加密等防护手段。掌握这些技术对于安全研究、漏洞挖掘和软件调试具有重要价值,广泛应用于恶意软件分析、应用功能扩展和安全加固等场景。本文以安卓平台为例,详细介绍了从环境配置(如雷电模拟器)到使用MT管理器进行静态修改,再到结合Frida进行动

weixin_34228387的博客 380

利用smali代码注入修改Android应用

很久前写的文档了,发出来以作纪念:) 利用smali代码注入修改Android应用 Smali介绍   简单的说,smali就是Dalvik VM内部执行的核心代码。   Dalvik是google专门为Android操作系统设计的一个虚拟机,经过深度的优化。虽然Android上的程序是使用java来开发的,但是Dalvik和标准的java虚拟机JVM还是两回事。Dalvik VM是基于...

weixin_30725467的博客 437
上一篇: 梆梆加固破解
下一篇: Dalvik指令分析(一) hex to instruction
jiang_lostcode
博客等级 码龄18年 45粉丝 17原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值