专栏首页七夜安全博客Python跨语言调用java

Python跨语言调用java

今天为什么讲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自身的方式。

python调用java

maven版本比较

首先在依赖中引用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之间的联通。

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

在末尾添加:

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虚拟机,并与虚拟机进行通信。

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虚拟机,释放资源。

本文分享自微信公众号 - 七夜安全博客(qiye_safe),作者:七夜安全

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python开源IP代理池--IPProxys

    七夜安全博客
  • “跳一跳”游戏外挂原理详析(手动版)

    七夜安全博客
  • 小知识点--crontab

    这两周学了很多东西,还把golang语言基本掌握了,收获还是挺多的。在做安全的过程中,有很多需要定时执行的任务,比如抓取主机数量,端口数据等,这都逃不开linu...

    七夜安全博客
  • 自定义对象检测问题:使用TensorFlow追踪星球大战中的千年隼号宇宙飞船

    大多数的大型科技公司(如IBM,谷歌,微软,亚马逊)都有易于使用的视觉识别API。一些规模较小的公司也提供类似的产品,如Clarifai。但没有公司能够提供对象...

    AiTechYun
  • 100个Numpy练习【4】

    Numpy是Python做数据分析必须掌握的基础库之一,非常适合刚学习完Numpy基础的同学,完成以下习题可以帮助你更好的掌握这个基础库。

    YingJoy_
  • 100个Numpy练习【4】

    翻译:YingJoy 网址: https://www.yingjoy.cn/ 来源: https://github.com/rougier/numpy-100...

    YingJoy_
  • lombok1.16.20序列化bug分析

    记录下使用 lombok遇到的反序列问题,一开始在 lombok1.16.18中并没有发现,然后应用中没有指定lombok全局版本,引入的其他二方包将lombo...

    方丈的寺院
  • 使用 Helm 部署 Gitlab

    在 Kubernetes 中的安装,自然需要一个可以运行和管理的 Kubernetes 集群,首先创建一个 Namespace 用于 Gitlab 的安装运行:

    崔秀龙
  • Facebook关闭Oculus Story Studio工作室,是战略变更还是人事调控?

    VRPinea
  • mongodb 学习随笔 及golang 连接mongoDB

    Mogondb 不支持事务。所有有事务要求的需求慎用,比如银行的转账操作慎用,转1个亿美金,因为网络,电力的故障导致交易没有完成,不能回滚,交易无法撤回。所有慎...

    地球流浪猫

扫码关注云+社区

领取腾讯云代金券