今天为什么讲python调用java程序?
最近在做关于漏洞组件版本检测的事情, 这在大型的互联网公司比较常见。
互联网公司为了防止代码上线后出现安全问题或者bug,一般会有自动化源码审计的步骤,尽可能在上线前发现问题及时修改。
源码审计的过程中发现0day,还是相对困难的,但是及时发现代码是否依赖有漏洞的组件还是很容易的,因此一般首先开刀的是审计代码中是否依赖一些已知漏洞的组件,提前剔除。
其实这个功能不难实现,主要是进行版本比较,判断依赖的组件版本是否在受影响的范围内。
(友情提示:想要安卓逆向教程的,见文末)
最近在做的是pip和maven的版本,一个是python,一个是java。在做pip 包版本比较的时候,主要是用到了packaging包,通过里面的version.parse方法即可完成。
from
packaging.version
import
parse
current_version = parse(
'1.0.1'
)
affect_min_version = parse(
"1.0.0"
)
affect_max_version = parse(
"2.0.0"
)
print(current_version>affect_min_version and current_version<affect_max_version)
针对maven包的版本检测也是通过同样的方式进行比较,暂时没有出现什么问题。
但是我也有担忧,毕竟是两种语言的包,版本管理的方式不一定一样。万一python 中的version.parse不适用,该怎么办呢?
正是基于这样的思考,才有了这篇文章,版本的比较方式还是原生的好,使用python的方式不如使用java自身的方式。
首先在依赖中引用maven-artifact:
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-artifact</artifactId>
<version>3.6.3</version>
</dependency>
接着通过调用DefaultArtifactVersion类中的compareTo方法进行比较,返回值小于0代表小于,大于0代表大于,等于0 代表等于。
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
publicvoid compareTo() {
DefaultArtifactVersion version1 = newDefaultArtifactVersion("1.1.14");
DefaultArtifactVersion version2 = newDefaultArtifactVersion("1.2.7");
int res = version1.compareTo(version2);
logger.info("res={}", res);
}
我是用Python实现了整体框架,用来适配各种语言包的版本比较,maven包的比较只是其中一个功能,因此开始考虑 python如何调用jar包中的函数。github中总是有奇特的项目,jpype实现了python和java之间的联通。
使用jpype的前提是需要安装java环境。
(1) 下载java压缩包
Java下载路径: https://www.oracle.com/java/technologies/javase-jdk8-downloads.html,选择x64版本
wget https://download.oracle.com/otn/java/jdk/8u241-b07/1f5b5a70bf22433b84d0e960903adac8/jdk-8u241-linux-x64.tar.gz?AuthParam=1584783645_a2bd6d5f6a340d3b42fe49c1df552219 -o jdk-8u241-linux-x64.tar.gz
(2) 安装
1.创建安装目录
mkdir /usr/local/java/
2.解压至安装目录
tar -zxvf jdk-8u241-linux-x64.tar.gz -C /usr/local/java/
3.设置环境变量
打开文件
vim /etc/profile
在末尾添加:
export JAVA_HOME=/usr/local/java/jdk1.8.0_171
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
使环境变量生效
source /etc/profile
在centos中安装jpype很简单,命令如下(没写错):
pip install jpype1
下载org.apache.maven.maven-artifact.jar:
jpype的原理是在python进程中嵌入了java虚拟机,并与虚拟机进行通信。
import os
import jpype
def init_jvm():
jar_path = os.path.join(os.path.abspath('.'), 'maven-artifact-3.6.3.jar')
jpype.startJVM(jpype.getDefaultJVMPath(), "-ea", "-Djava.class.path=%s"% jar_path, convertStrings=False)
def cmp(ver1,ver2):
VerCls= jpype.JClass('org.apache.maven.artifact.versioning.DefaultArtifactVersion')
v1 = VerCls(ver1)
v2 = VerCls(ver2)
res = v1.compareTo(v2)
VerCls= None
v1 = None
v2=None
return res
def shutdowm():
try:
jpype.shutdownJVM()
except:
pass
if __name__=="__main__":
init_jvm()
print(cmp("3.0.0","3.0.0.1.0-alpha"))
shutdowm()
代码说明如下: