2024常识点梳理 Crash传递机制 三 (2024常识考点)

2024常识点梳理 Crash传递机制 三 (2024常识考点)

本文目录导航:

2024常识点梳理(三)Crash传递机制|traces.txt文件剖析|内存走漏场景|Handler原理|两种启动Service的方式

解说下Android的Crash捕捉环节在Android运行开发中,确保运行稳固性是至关关键的。

未捕捉的意外会造成运行解体,这理论是由于代码运转时出现了开发者不曾预料到的边界条件。

Android系统经过Fail Fast机制间接杀死运后退程,以防止更大疑问发生。

这一机制确保运行在出现未知形态时立刻中断,缩小潜在的危险。

从源码角度摸索,未捕捉的意外其流转链路如下:线程在运转时,若出现意外,JVM会调用`dispatchUncaughtException`函数,首先尝试调用预处置器`uncaughtExceptionPreHandler`。

接着,依据线程能否认义了`uncaughtExceptionHandler`,优先前往线程自定义的Handler,若未定义,则前往`group`对象,即`ThreadGroup`类型的对象,雷同成功`UncaughtExceptionHandler`接口。

最终,意外被处置或许间接打印到失误流。

为何Crash会造成运行闪退?运后退程初始化时,会口头``中的`main`函数。

当出现Crash,JVM会经过`(10)`和`(pid)`来确保进程被安保销毁。

``分开以后虚构机,而`killProcess`则在操作系统层面杀死进程。

两者同时调用,确保进程彻底完结。

ActivityManagerService(AMS)记载Crash信息的环节触及多个步骤,包含搜集进程信息、失误堆栈内容、系统形态等,而后以可读方式写入文件。

关于ANR的处置,系统雷同会搜集关系信息,经过特定线程遍历记载,最终在AMS外部启动处置和记载。

关于NE(Native Exception)的处置与Crash相似,系统会调用`handleApplicationCrash`记载解体信息。

剖析文件处置ANR疑问时,关键触及日志文件的失掉与解析。

经过adb命令失掉`/data/anr/`文件,此文件记载了出现ANR时每个线程的信息。

经过剖析主线程形态、方法调用栈以及关系事情日志,可以定位到造成ANR的要素。

在失掉ANR时,须要联合eventlog和mainlog,以搜集更具体的系统形态信息,以辨别某些特定状况,防止误导。

内存走漏的典型场景包含汇合持有对象援用、静态成员变量持有过重对象、非静态外部类持有外部对象、资源未封锁等。

正确的处置方法触及显式清空汇合、防止经常使用静态成员变量作为资源容器、正确治理外部类援用、在Activity销毁时封锁资源等。

Handler原理及延时信息原理触及Looper与MessageQueue的运作。

Looper是信息循环的外围,担任从MessageQueue中取出信息启动处置。

发送信息时,经过`post(Runnable)`将义务放入队列,信息队列会依据口头期间排序,并在Looper的循环中逐个口头。

延时信息经过期间戳参数成功,确保信息在特定期间口头。

Android启动Service的两种方式包含经常使用`startService`和`bindService`。

`startService`用于启动Service并坚持其运转,直至被显式中止;`bindService`则准许在客户端与Service之间建设更严密的衔接,实用于须要通讯的义务。

选用启动方式需思考服务的生命周期、义务类型、交互方式和完结机制。

一文看懂内存马

webshell的变迁环节大抵如下:web主机治理页面——> 大马——>小马拉大马——>一句话木马——>加密一句话木马——>加密内存马内存马是无文件攻打的一种罕用手腕,随着攻防演练热度越来越高:攻防双方的博弈,流量剖析、EDR等专业安保设施被蓝方宽泛经常使用,传统的文件上行的webshll或以文件方式驻留的后门越来越容易被检测到,内存马经常使用越来越多。

Webshell内存马,是在内存中写入恶意后门和木马并口头,到达远程控制Web主机的一类内存马,其瞄准了企业的对外窗口:网站、运行。

但传统的Webshell都是基于文件类型的,黑客可以应用上行工具或网站破绽植入木马,区别在于Webshell内存马是无文件马,应用两边件的进程口头某些恶意代码,不会有文件落地,给检测带来渺小难度。

指标:访问恣意url或许指定url,带上命令口头参数,即可让主机前往命令口头结果成功:以java为例,客户端动员的web恳求会依次经过Listener、Filter、Servlet三个组件,咱们只需在这个恳求的环节中做手脚,在内存中修正已有的组件或许灵活注册一个新的组件,拔出恶意的shellcode,就可以到达咱们的目的。

依据内存马注入的方式,大抵可以将内存马划分为如下两类-api型 经过命令口头等方式灵活注册一个新的listener、filter或许servlet,从而成功命令口头等配置。

特定框架、容器的内存马原理与此相似,如spring的controller内存马,tomcat的valve内存马 2.字节码增强型 经过java的instrumentation灵活修正已有代码,进而成功命令口头等配置。

2.1 ServletServlet 是运转在 Web 主机或运行主机上的程序,是作为来自 HTTP 客户端的恳求和 HTTP 主机上的数据库或运行程序之间的两边层。

它担任处置用户的恳求,并依据恳求生成相应的前往信息提供应用户。

2.1.1 Filter简介filter也称之为过滤器,是对Servlet技术的一个强补充,其关键配置是在HttpServletRequest抵达 Servlet 之前,阻拦客户的HttpServletRequest ,依据须要审核HttpServletRequest,也可以修正HttpServletRequest 头和数据;在HttpServletResponse抵达客户端之前,阻拦HttpServletResponse ,依据须要审核HttpServletResponse,也可以修正HttpServletResponse头和数据。

基本上班原理成功filter的生命周期filter链 当多个filter同时存在的时刻,组成了filter链。

web主机依据Filter在文件中的注册顺序,选择先调用哪个Filter。

当第一个Filter的doFilter方法被调用时,web主机会创立一个代表Filter链的FilterChain对象传递给该方法,经过判别FilterChain中能否还有filter选择前面能否还调用filter。

2.1.3 Listener简介JavaWeb开发中的监听器(Listener)就是Application、Session和Request三大对象创立、销毁或许往其中增加、修正、删除属性时智能口头代码的配置组件。

用途可以经常使用监听器监听客户端的恳求、服务端的操作等。

经过监听器,可以智能登程一些举措,比如监听在线的用户数量,统计网站访问量、网站访问监控等。

2.2 TomcatTomcat 作为Servlet容器,将http恳求文本接纳并解析,而后封装成HttpServletRequest类型的request对象,传递给servlet;同时会将照应的信息封装为HttpServletResponse类型的response对象,而后将response交给tomcat,tomcat就会将其变成照应文本的格局发送给阅读器。

2.3 其余java背景常识2.3.1 java反射2.3.2 java instrumentation3 内存马成功经常使用新增servlet的方式就须要绑定指定的URL。

假设咱们想要愈加隐蔽,做到内存马与URL有关,无论这个url是原生servlet还是某个struts action,甚至无论这个url能否真的存在,只需咱们的恳求传递给tomcat,tomcat就能相应咱们的指令,那就得经过注入新的或修正已有的filter或许listener的方式来成功了。

比如早期rebeyond徒弟开发的memshell,就是经过修正类的internalDoFilter方法来成功的,前期冰蝎最新版本的内存马为了成功更好的兼容性,选用hook #service 函数,在weblogic选用hook #execute 函数。

4 内存马检测与排查在java中,只要被JVM加载后的类能力被调用,或许在须要时经过反射通知JVM加载。

所以特色都在内存中,体现方式为被加载的class。

须要经过某种方法失掉到JVM的运转时内存中已加载的类, Java自身提供了Instrumentation类来成功运转时注入代码并口头,因此发生一个检测思绪:注入jar包-> dump已加载class字节码->反编译成java代码-> 源码webshell检测。

如何失掉java程序以后的经常使用内存

方法如下:首先创立一个Bean用来存贮要失掉的信public class MonitorInfoBean {/** 可经常使用内存. */private long totalMemory;/** 残余内存. */private long freeMemory;/** 最大可经常使用内存. */private long maxMemory;/** 操作系统. */private String osName;/** 总的物理内存. */private long totalMemorySize;/** 残余的物理内存. */private long freePhysicalMemorySize;/** 已经常使用的物理内存. */private long usedMemory;/** 线程总数. */private int totalThread;/** cpu经常使用率. */private double cpuRatio;public long getFreeMemory() {return freeMemory;}public void setFreeMemory(long freeMemory) { = freeMemory;}public long getFreePhysicalMemorySize() {return freePhysicalMemorySize;}public void setFreePhysicalMemorySize(long freePhysicalMemorySize) { = freePhysicalMemorySize;}public long getMaxMemory() {return maxMemory;}public void setMaxMemory(long maxMemory) { = maxMemory;}public String getOsName() {return osName;}public void setOsName(String osName) { = osName;}public long getTotalMemory() {return totalMemory;}public void setTotalMemory(long totalMemory) { = totalMemory;}public long getTotalMemorySize() {return totalMemorySize;}public void setTotalMemorySize(long totalMemorySize) { = totalMemorySize;}public int getTotalThread() {return totalThread;}public void setTotalThread(int totalThread) { = totalThread;}public long getUsedMemory() {return usedMemory;}public void setUsedMemory(long usedMemory) { = usedMemory;}public double getCpuRatio() {return cpuRatio;}public void setCpuRatio(double cpuRatio) { = cpuRatio;}}之后,建设bean的接口public interface IMonitorService {public MonitorInfoBean getMonitorInfoBean() throws Exception;}而后,就是最关键的,失掉cpu的应用率,已用内存,可用内存,最大内存等信息。import ;import ;import ;import ;import .*;import ;/** * 失掉系统信息的业务逻辑成功类.* @author GuoHuang*/public class MonitorServiceImpl implements IMonitorService {private static final int CPUTIME = 30;private static final int PERCENT = 100;private static final int FAULTLENGTH = 10;private static final File versionFile = new File(/proc/version);private static String linuxVersion = null;/** * 取得以后的监控对象.* @return 前往结构好的监控对象* @throws Exception* @author GuoHuang*/public MonitorInfoBean getMonitorInfoBean() throws Exception {int kb = 1024;// 可经常使用内存long totalMemory = ()() / kb;// 残余内存long freeMemory = ()() / kb;// 最大可经常使用内存long maxMemory = ()() / kb;OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ();// 操作系统String osName = ();// 总的物理内存long totalMemorySize = () / kb;// 残余的物理内存long freePhysicalMemorySize = () / kb;// 已经常使用的物理内存long usedMemory = (() - ())/ kb;// 取得线程总数ThreadGroup parentThread;for (parentThread = ()(); () != null; parentThread = ());int totalThread = ();double cpuRatio = 0;if (()(windows)) {cpuRatio = ();}else {cpuRatio = ();}// 结构前往对象MonitorInfoBean infoBean = new MonitorInfoBean();(freeMemory);(freePhysicalMemorySize);(maxMemory);(osName);(totalMemory);(totalMemorySize);(totalThread);(usedMemory);(cpuRatio);return infoBean;}private static double getCpuRateForLinux(){InputStream is = null;InputStreamReader isr = null;BufferedReader brStat = null;StringTokenizer tokenStat = null;try{(Get usage rate of CUP , linux version: +linuxVersion);Process process = ()(top -b -n 1);is = (); isr = new InputStreamReader(is);brStat = new BufferedReader(isr);if((2.4)){();();();();tokenStat = new StringTokenizer(());();();String user = ();();String system = ();();String nice = ();(user+ , +system+ , +nice);user = (0,(%));system = (0,(%));nice = (0,(%));float userUsage = new Float(user)();float systemUsage = new Float(system)();float niceUsage = new Float(nice)();return (userUsage+systemUsage+niceUsage)/100;}else{();();tokenStat = new StringTokenizer(());();();();();();();();String cpuUsage = ();(CPU idle : +cpuUsage);Float usage = new Float((0,(%)));return (()/100);}} catch(IOException ioe){(());freeResource(is, isr, brStat);return 1;} finally{freeResource(is, isr, brStat);}}

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

27阅读

java中冒号,java双冒号

2026年09月06日

24阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

27阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

23阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

25阅读