前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python跨语言调用java

Python跨语言调用java

作者头像
七夜安全博客
修改2020-03-25 18:09:54
1.1K0
修改2020-03-25 18:09:54
举报
文章被收录于专栏:七夜安全博客七夜安全博客

今天为什么讲python调用java程序?

最近在做关于漏洞组件版本检测的事情, 这在大型的互联网公司比较常见。

互联网公司为了防止代码上线后出现安全问题或者bug,一般会有自动化源码审计的步骤,尽可能在上线前发现问题及时修改。

源码审计的过程中发现0day,还是相对困难的,但是及时发现代码是否依赖有漏洞的组件还是很容易的,因此一般首先开刀的是审计代码中是否依赖一些已知漏洞的组件,提前剔除。

其实这个功能不难实现,主要是进行版本比较,判断依赖的组件版本是否在受影响的范围内

(友情提示:想要安卓逆向教程的,见文末)

版本比较引发的思考

最近在做的是pip和maven的版本,一个是python,一个是java。在做pip 包版本比较的时候,主要是用到了packaging包,通过里面的version.parse方法即可完成。

代码语言:javascript
复制
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自身的方式。

python调用java

maven版本比较

首先在依赖中引用maven-artifact:

代码语言:javascript
复制
<dependency>
 
<groupId>org.apache.maven</groupId>
 
<artifactId>maven-artifact</artifactId>
 
<version>3.6.3</version>
 
</dependency>
 

接着通过调用DefaultArtifactVersion类中的compareTo方法进行比较,返回值小于0代表小于,大于0代表大于,等于0 代表等于。

代码语言:javascript
复制
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之间的联通。

centos安装 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

在末尾添加:

代码语言:javascript
复制
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

安装jpype并下载 maven-artifact包

在centos中安装jpype很简单,命令如下(没写错):

pip install jpype1

下载org.apache.maven.maven-artifact.jar:

jpype调用jar包

jpype的原理是在python进程中嵌入了java虚拟机,并与虚拟机进行通信。

代码语言:javascript
复制
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()
 

代码说明如下:

  1. init_jvm函数中的 jpype.startJVM用来启动java虚拟机,-Djava.class.path 用来指定我们要调用的jar包。
  2. 在cmp中,jpype.JClass用来引用DefaultArtifactVersion类,通过实例化并调用compareTo实现版本号的比较。
  3. jpype.shutdownJVM()是主动关闭java虚拟机,释放资源。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 七夜安全博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 版本比较引发的思考
  • python调用java
    • maven版本比较
      • 跨语言调用
        • centos安装 java
        • 安装jpype并下载 maven-artifact包
        • jpype调用jar包
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档