安卓恶意应用识别(番外篇)(Python并行(多线程or多进程)执行cmd)
前言
本人为了批量反编译,不得不涉及到批量执行,之前没有彻底理解有关于多线程的概念和python方法,现在只能一步一步尝试,并且实践,写本文以记录。
1. 进程与线程
1.1 什么是进程?
1.1.1 概念
进程是一个具有独立功能的程序,它是数据集合运行活动的实体,重点在于运行,只有运行才有进程的概念,这里我截取了我电脑中的任务管理器:
可以看到浏览器、Pycharm和任务管理器是我目前打开的应用,是进程。同样,我右下角的微信及QQ等被称之为后台进程,因为它们也在运行。每个进程都会有一个状态码,称为PID,这个在学习linux的时候,经常报错,会用到kill PID
去杀死进程。
1.1.2 三种状态
Ready(就绪):当进程分配到除CPU以外的必要资源后,只要再获得CPU,便可以立即执行,进程这时的状态为就绪状态。
Blocked(阻塞):正在执行的进程由于发生某事件或接受某消息无法继续执行时,便放弃处理机而处于暂停状态,也即进程的执行收到阻塞,把这种暂停状态称为阻塞状态,有时也称为等待状态和封锁状态。
Running(运行):进程已获得CPU,其程序正在执行。
1.2 什么是线程?
线程是进程中的 执行运算的最小单位,是进程中的一个实体,依赖于线程,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源( 程序计数器,一组寄存器和栈),但它可与同属一个进程的其他线程 共享进程所拥有的全部资源。
1.3 多线程的优点
-
通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一个程序的不同部分。
-
创建线程比创建进程要快,所需开销少,占用的资源也少。
-
通过创建多线程进程,每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分的运行。
参考文献:操作系统:进程与线程之间的区别及联系
2. Python多线程学习
以下为菜鸟教程上的实例:
import thread
import time# 为线程定义一个函数
def print_time( threadName, delay):count = 0while count < 5:time.sleep(delay)count += 1print "%s: %s" % ( threadName, time.ctime(time.time()) )# 创建两个线程
try:thread.start_new_thread( print_time, ("Thread-1", 2, ) )thread.start_new_thread( print_time, ("Thread-2", 4, ) )
except:print "Error: unable to start thread"while 1:pass
输出结果如下:
Thread-1: Thu Jan 22 15:42:17 2009
Thread-1: Thu Jan 22 15:42:19 2009
Thread-2: Thu Jan 22 15:42:19 2009
Thread-1: Thu Jan 22 15:42:21 2009
Thread-2: Thu Jan 22 15:42:23 2009
Thread-1: Thu Jan 22 15:42:23 2009
Thread-1: Thu Jan 22 15:42:25 2009
Thread-2: Thu Jan 22 15:42:27 2009
Thread-2: Thu Jan 22 15:42:31 2009
Thread-2: Thu Jan 22 15:42:35 2009
根据输出结果,可以看出线程也是有先后顺序的,是队列性质,先执行第一个print_time(Thread-1),然后第一个持续执行,没有停止,然后看到第一个线程和第二个线程在是在并行执行,在这里为什么不说并发,我查阅了进程、线程、多线程、并发、并行 详解后并与之结果比较发现,这两个线程是在同步运行的。至于多线程实现的是并发还是并行?所写多线程可能被分配到一个CPU内核中执行,也可能被分配到不同CPU执行,分配过程是操作系统所为,不可人为控制。所以多线程是并发还是并行的?都有可能。
3. 实践操作
最开始我的想法是如果一个一个执行cmd命令,导致时间太长,于是网上搜索,有很多种方法,例如os,subprocess等方法,这样都是产生的子进程,而不是多线程。我们知道启动一个线程所花费的空间远远小于启动一个进程所花费的空间,但我还是试了一下,我用的是for循环嵌套,并没有用线程启动,结果发现他是队列执行,顺序执行的,也就是说要等上一个cmd命令运行结束后才会进行下一个。
subprocess.Popen(cmd_str, shell=True, stdout=None, stderr=None).wait()
结果可想而知,反编译速度是非常的慢。
而后,我查阅了多线程执行的方法,【Python】并行运行多个cmd命令
# 是否需要并行运行if_parallel = True# 需要执行的命令列表# model_list = ['yolo', 'centernet']# cmds = ['python main.py --model ' + i for i in model_list]cmds = ["F: & cd F:\\benign_apk & " + "apktool.bat d -f " + "benign" + str(i) + ".apk" for i in range(65,70)]if if_parallel:# 并行threads = []for cmd in cmds:th = threading.Thread(target=execCmd, args=(cmd,))th.start()threads.append(th)
在我将并行数调到了5个开始,内存量一下就升上来了,当我调到更多时,内存几乎占满,而且我不清楚如何停止这个线程,即便我关闭了编译器,这些代码依然在运行中,所以我又在想到底这个是否开启了多线程,这些线程又该如何关闭呢。
带着上述疑问,我将cmd并行数跳到了15个,打开资源监视器:
可以看到这样的方式实际上是打开了多进程,我在任务管理器中,猜想也得到了验证。
这样看来,慢是可以理解的,为什么呢,看以下这张图:
真相清楚了,就是因为cmd命令调用了jar包,因此产生了较多内存去处理,当我要处理900多个文件时,他当然溢出了,汗死,只能选择分批量处理,因为电脑运行内存是有限的。
最后,展示一下完整代码把:
import datetime
import os
import threadingdef execCmd(cmd):try:print("命令%s开始运行%s" % (cmd, datetime.datetime.now()))subprocess.Popen(cmd, shell=True, stdout=None, stderr=None).wait()print("命令%s结束运行%s" % (cmd, datetime.datetime.now()))except:print('%s\t 运行失败' % (cmd))if __name__ == '__main__':# 是否需要并行运行if_parallel = True# 需要执行的命令列表# model_list = ['yolo', 'centernet']# cmds = ['python main.py --model ' + i for i in model_list]cmds = ["F: & cd F:\\benign_apk & " + "apktool.bat d -f " + "benign" + str(i) + ".apk" for i in range(70,85)]if if_parallel:# 并行threads = []for cmd in cmds:th = threading.Thread(target=execCmd, args=(cmd,))th.start()threads.append(th)# 等待线程运行完毕for th in threads:# .join的作用:现在有 A, B, C 三件事情,只有做完 A 和 B 才能去做 C,而 A 和 B 可以并行完成。th.join()# 确保 A 完成print("OK!!!!!!!!!!!")else:# 串行for cmd in cmds:try:print("命令%s开始运行%s" % (cmd, datetime.datetime.now()))os.system(cmd)print("命令%s结束运行%s" % (cmd, datetime.datetime.now()))except:print('%s\t 运行失败' % (cmd))
结论与思考
批量执行cmd实际上就是说多进程执行,而不是多线程,虽然每个cmd占用的内存不高,但是需要结合执行命令是否牵扯到其他进程,若其他进程占用内存较高,也是无法并行或并发的。
此外,我在想是否可以在.bat中修改代码,使得一个cmd窗口就可以批量并行执行反编译命令呢,这个有待考量,短期内以我的代码水平,我大概是想不出来了。感觉很多还是不理解,希望有大佬能够批评指正。
相关文章:

安卓恶意应用识别(番外篇)(Python并行(多线程or多进程)执行cmd)
前言 本人为了批量反编译,不得不涉及到批量执行,之前没有彻底理解有关于多线程的概念和python方法,现在只能一步一步尝试,并且实践,写本文以记录。 1. 进程与线程 1.1 什么是进程? 1.1.1 概念 进程是一…...

基于大语言模型扬长避短架构服务
秘诀: 扬泛化之长, 避时延之短...

初识网络编程
一、概述 地球村:亦称世界村,是通过电子媒介将世界紧密联系起来的形象表达,是信息网络时代的集中体现 TCP和UDP: TCP:打电话 -->连接 -->接了 -->通话 UDP:发送完即可 -->接收 计算机网络&a…...

轻松使用androidstudio交叉编译libredwg库
对于安卓或嵌入式开发者而言,交叉编译是再熟悉不过的操作了,可是对于一些刚入门或初级开发者经常会遇到这样的问题:如何交叉编译C++库来生成安卓下的so库呢? 最近有一些粉丝找到我求救,那么我最近刚好有空大致研究了下,帮他们成功编译了其中一个libredwg的C++库,这篇文章…...

【C++杂货铺】一颗具有搜索功能的二叉树
文章目录 一、二叉搜索树概念二、二叉搜索树的操作2.1 二叉搜索树的查找2.2 二叉搜索树的插入2.3 二叉搜索树的删除 三、二叉搜索树的实现3.1 BinarySearchTreeNode(结点类)3.2 BinarySearchTree(二叉搜索树类)3.2.1 框架3.2.2 in…...
uni-app使用vue3,在元素或组件实例上添加ref,用this.$refs显示undefined
项目中引用了一个UI组件库,在表单上添加了ref属性,方便提交时验证。触发提交方法时显示不存在这个方法或this.$refs为undefined。 <u--form labelPosition"left" :model"userInfo" :rules"rules" ref"loginForm&…...

蜂蜜配送销售商城小程序的作用是什么
蜂蜜是农产品中重要的一个类目,其受众之广市场需求量大,但由于非人人必需品,因此传统线下门店经营也面临着痛点,线上入驻平台也有很多限制难以打造自有品牌,无法管理销售商品及会员、营销等,缺少自营渠道&a…...

大数据Flink(八十四):SQL语法的DML:窗口聚合
文章目录 SQL语法的DML:窗口聚合 一、滚动窗口(TUMBLE)...
系统集成|第十八章(笔记)
目录 第十八章 安全管理18.1 信息安全管理18.2 信息系统安全18.3 物理安全管理18.4 人员安全管理18.5 应用该系统安全管理18.6 信息安全等级保护18.7 拓展 上篇:第十七章、变更管理 下篇:第十九章、风险管理 第十八章 安全管理 18.1 信息安全管理 信息安…...

480万商品,如何架构商品治理平台?
说在前面 在40岁老架构师 尼恩的读者交流群(50)中,很多小伙伴拿高薪,完成架构的升级,进入架构师赛道,打开薪酬天花板。 最近有小伙伴拿到了一线互联网企业如京东、网易、微博、阿里、汽车之家、极兔、有赞、希音、百度、滴滴的架…...

【C++入门指南】C如何过渡到C++?祖师爷究竟对C++做了什么?
【C入门指南】C如何过渡到C?祖师爷究竟对C做了什么? 前言一、命名空间1.1 命名空间的定义1.2 命名空间使用 二、C输入、输出2.1 std命名空间的使用惯例 三、缺省参数3.1 缺省参数的定义3.2 缺省参数分类 四、函数重载4.1 函数重载概念4.2 C支持函数重载的…...

简易磁盘自动监控服务
本文旨在利用crontab定时任务(脚本请参考附件)来监控单个服务节点上所有磁盘使用情况,一旦超过既定阈值则会通过邮件形式告警相关利益人及时介入处理。 1. 开启SMTP服务 为了能够成功接收告警信息,需要邮件接收客户都安开启SMTP服务。简要流程请参考下…...

【100天精通Python】Day65:Python可视化_Matplotlib3D绘图mplot3d,绘制3D散点图、3D线图和3D条形图,示例+代码
1 mpl_toolkits.mplot3d 功能介绍 mpl_toolkits.mplot3d 是 Matplotlib 库中的一个子模块,用于绘制和可视化三维图形,包括三维散点图、曲面图、线图等。它提供了丰富的功能来创建和定制三维图形。以下是 mpl_toolkits.mplot3d 的主要功能和功能简介&am…...

十六,镜面IBL--预滤波环境贴图
又到了开心的公式时刻了。 先看看渲染方程 现在关注第二部分,镜面反射。 其中 这里很棘手,与输入wi和输出w0都有关系,所以,再近似 其中第一部分,就是预滤波环境贴图,形式上与前面的辐照度图很相似&#…...

信息安全:恶意代码防范技术原理.
信息安全:恶意代码防范技术原理. 恶意代码的英文是 Malicious Code, 它是一种违背目标系统安全策略的程序代码,会造成目标系统信息泄露、资源滥用,破坏系统的完整性及可用性。 目录: 恶意代码概述: (1&a…...

开源媒体浏览器Kyoo
什么是 Kyoo ? Kyoo 是一款开源媒体浏览器,可让您流式传输电影、电视节目或动漫。它是 Plex、Emby 或 Jellyfin 的替代品。Kyoo 是从头开始创建的,它不是一个分叉。一切都将永远是免费和开源的。 软件特性: 管理您的电影、电视剧…...
人脸解锁设备时出现相机报错
(1)背景分析 这是项目当中实际遇到的问题,如下代码仅用作分析和记录。 现在问题的现象是:刚亮屏大概在2s以内对着人脸一般是能解锁的,但是超过2s之后在对着人脸,是无法解锁成功的。 (2&#…...

【广州华锐互动】利用VR开展工业事故应急救援演练,确保救援行动的可靠性和有效性
在工业生产中,事故的突发性与不可预测性常常带来巨大的损失。传统的应急演练方式往往存在场地限制、成本高、效果难以衡量等问题。然而,随着虚拟现实(VR)技术的快速发展,VR工业事故应急救援演练应运而生,为…...

还不知道数据类岗位的相关技能和职责吗?涤生大数据告诉你(二)
续接上文:还不知道数据类岗位的相关技能和职责吗?涤生大数据告诉你(一) 1.数据治理工程师 工作职责 数据治理工程师的工作职责主要包括以下几个方面: 1. 数据管理策略制定:制定和实施数据管理策略&#…...

常见应用层协议
一.HTTP(超文本传输协议) HTTP 和 HTTPS 二.FTP(文件传输协议) 三.SMTP(简单邮件传输协议) 四.POP3(邮局协议版本3) 五.IMAP(互联网消息访问协议) 六.DNS&am…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...

spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...