编译jvm源码-黑马程序员技术交流社区

Java代码编译是由Java源代码编译器完成的编译jvm源码,流程图如下:

Java字节码的执行是由JVM执行引擎完成的。 流程图如下:

Java代码编译和执行的整个过程包括以下三个重要机制

Java源码编译机制

Java源代码编译由以下三个过程组成:

流程图如下:

最后生成>

加载机制

JVM的类加载是通过ClassLoader及其泛型完成的。 类的层次关系和加载顺序可以用右图描述:

1)引导类加载器

负责加载 $JAVA_HOME > 中的所有 jre/lib/rt.jar

2)扩展类加载器

负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或者-Djava.ext.dirs指定的目录下的jar包

3)应用类加载器

负责录音>

4) 自定义类加载器

属于应用程序根据自身需求定制的ClassLoader,比如tomcat、jboss都会按照j2ee规范来实现ClassLoader

在加载过程中编译jvm源码,会首先检测类是否已经加载。 检测顺序是从下到下,从CustomClassLoader到BootStrapClassLoader逐层检测,只要有一个 >

类执行机制

JVM是基于栈架构来执行的>

综述

2017年9月18日,Piriform正式发布安全公告,宣布公司开发的CCleanerversion 5.33.6162和CCleanerCloudversion 1.07.3191中的32位应用程序被植入恶意代码。植入侧门代码的软件版本被公开下载了大约一个月,影响了数百万用户,窃取了有关机器的敏感信息,甚至极少数用户执行了更多的恶意代码。

CCleaner是由独立软件工作室Piriform开发的系统优化和隐私保护工具,早已被防病毒制造商Avast收购,主要是为了消除Windows系统不再使用的垃圾文件以释放更多的硬盘空间,其另一个功能是删除用户的Internet记录。自2004年2月发布以来,CCleaner的用户群迅速下降,并迅速成为排名第一的系统垃圾清除和隐私保护软件。就是这样一款隐私保护软件,在正式发布版中被曝出植入恶意代码,恶意代码具有执行任意代码的功能。

这是继Xshell被植入侧门代码丑闻之后的又一次严重的软件供应链活动。通过对相关技术细节的进一步分析,360恐吓情报中心猜测,这是一次罕见的基于编译环境污染的软件供应链攻击,值得分享给安全社区讨论。

侧门技术细节

恶意代码功能

植入恶意代码的CCleaner版本主要具有以下恶意功能:

这striker 将函数调用

插入 CRT 初始化函数 __scrt_get_dyn_tls_init_callback(),并将此函数调用指向执行另一段恶意代码。

采集到主机信息(主机名、已安装软件列表、进程列表、网卡信息等)后,对编码进行加密,通过HTTPS合约向远端IP:216.126.225.148:443发送POST诉状,伪造HTTP头的HOST数组为:speccy.piriform.com,下载执行第二阶段的恶意代码。如果

IP无效,则根据月份生成DGA域名,并再次尝试相同的消息,如果成功,则下载执行第二阶段的恶意代码。

植入方法的推断

根据分析,

360恐吓情报中心,这场风暴极有可能是由于开发环境中的CRT静态库功能污染后对开发者机器造成损坏,其后果是开发环境中开发的程序可能被人工植入恶意代码,相应的证据和结论如下:

1. 植入的代码位于用户代码主函数之前

main 函数前面的红色块是编译器引入的 CRT 代码,不是用户编写的。

2. 植入恶意代码调用过程

您可以看到恶意呼叫已插入 CRT 代码sub_4010CD。

3.

植入恶意代码的 CRT 代码源代码调用过程

通过剖析源码编译技术,我们发现用VS2015编译的发布版程序的CRT反汇编代码与本次分析的代码一致,调用过程为:

_mainCRTStartup-->__scrt_common_main_seh-->__scrt_get_dyn_tls_dtor_callback-->恶意呼叫

4. CCleaner 中更改后的 __scrt_get_dyn_tls_init_callback() 和源代码的比较

基于以上证据,可以确定是战斗机将恶意源代码植入__scrt_get_dyn_tls_init_callback()中并重新编译成OBJ文件,然后在开发环境中替换静态链接库中对应的OBJ文件,这样每次编译EXE时,编译器都会通过被污染的恶意LIB/OBJ文件手动链接到恶意代码中, 并最终感染已编译的可执行文件。

__scrt_get_dyn_tls_init_callback() 函数位于源代码文件 dyn_tls_init.c 中。

动力打击技术再现验证

编译环境的电源表面

通过分析发现,如果要将恶意代码植入程序的CRT代码中,最好的办法就是攻击编译过程中引入的CRT静态链接库文件,有以下三种方式:

更改 CRT 库的源代码

文件,重新编译并替换编译环境中的 CRT 静态库文件 (LIB)

更改 CRT 库文件中某个 OBJ 文件的 C 源代码,重新编译并替换 LIB 中对应的 OBJ 文件。

更改 CRT 库文件中 OBJ 文件的双补码,并替换 LIB 中相应的 OBJ 文件。

编译jvm源码-黑马程序员技术交流社区

CRT 运行时库

C 运行时库函数的主要功能是初始化程序,将最终值分配给全局变量,以及加载用户程序的入口函数。

找到 CRT 源代码

我们以VS2008为例,编译一个简单的main函数如下:

#include“stdafx.h”

intmain(intargc,_TCHAR*argv[])

printf(“%dn”,1);

返回0;

在 main 函数末尾设置断点,并使用 /MD 编译选项编译并运行调试

切换到反汇编代码并执行到主函数返回:

返回后,检查源代码,看到对应的CRT源代码为:crtexe.c

源代码路径:

D:ProgramFiles(x86)MicrosoftVisualStudio9.0VCcrtsrccrtexe.c

找到 CRT 静态链接库

参考 MSDN,我们知道在 VS2008 中,使用 /MD 编译选项编译发布版本的程序引用的 CRT 静态库是 msvcrt.lib,文件路径是:

D:ProgramFiles(x86)MicrosoftVisualStudio9.0VClibmsvcrt.lib

LIB/OBJ 文件简介

以VS2008中的msvcrt.lib为例

自由

这里介绍静态库LIB文件,它指的是由

编译器链接为第三方程序的静态链接,虽然是单个或多个经过AR压缩打包的OBJ文件,其中包含OBJ文件和打包路径信息,如msvcrt.lib文件解压后提取的部分OBJ文件路径如下:

可以看出,msvcrt.lib 解压后确实有 CRT 对应的 OBJ 文件:crtexe.obj 等。

OBJ

在源代码之后

编译后,COFF格式的双补文件,包含汇编代码信息、符号信息等,编译器最终会生成一个带有OBJ链接的PE文件供使用,crtexe.obj文件格式如下:

删除 CRT 运行时库了解了 CRT 运行时库的编译链接

原理,我们可以知道,使用 /MD 编译选项编译的主函数之前的 C 运行时库函数在静态链接过程中是使用 msvcrt.ib 中的 crcexe.obj 编译链接的,但 main 函数名是在源代码中定义的,编译器会在 msvcrt.lib 中链接不同的 OBJ 文件, 如下表所示

主函数的名称

对应的 OBJ 文件

描述

主()

编译jvm源码-黑马程序员技术交流社区

crcexe.obj

启动例程控制台应用

_tmain()

wcrcexe.obj

TheStartupRoutineForConsoleAppswithwidechars

WinMain()

crcexew.obj

Windowsapps 的启动例程

wWinMain()

wcrcexe.obj

thestartuproutineforWindowsappswithwidechars

更改 crcexe.obj我们以 VS2008 中的编译 main() 函数为例,如果在 msvcrt.lib 中更改 crcexe.obj 的双补码,例如更改源代码并重新编译 crcexe.c 或者直接更改 crcexe.obj,然后将编译/更改的 crcexe.obj 替换为 msvcrt.lib 中

对应的 OBJ,最后在 VS2008 中替换 msvcrt.lib,所以使用 / 所有带有 main() 函数的 EXE 程序 由 MD 编译选项编译,都会使用 actor 的 crcexe.obj 进行编译编译链接,最终植入任意代码。

为了证明测试的有效性源码编译技术

我们将 crcexe.obj 中主函数调用的前两个字节更改为 0xCC,测试的有效性将表明所有编译的 EXE 程序在主调用之前都会有两个 int3 指令:

msvcrt.lib 中 crcexe.obj 的路径:

f:ddvctoolscrt_bldSELF_X86crtsrcbuildINTELdll_objcrcexe.obj

编译jvm源码-黑马程序员技术交流社区

在msvcrt.lib中替换crcexe.obj

替换 msvcrt.lib 中的 OBJ 文件需要两个步骤,方法直接给出:

删除 msvcrt.lib 中的 OBJ 文件

使用 VS 附带的 LIB.EXE删除 crcexe.obj:

lib/REMOVE:f:ddvctoolscrt_bldSELF_X86crtsrcbuildINTELdll_objcrcexe.objmsvcrt.lib

将更改后的 crcexe.obj 文件插入 msvcrt.lib

使用 VS 的内置 LIB.EXE插入受污染的 crcexe.obj:

libmsvcrt.libf:ddVCtoolscrt_bldSELF_X86crtsrcbuildINTELdll_objcrcexe.obj

编译过程手动植入恶意代码

msvcrt.lib 与 crcexe.obj 替换为 msvcrt.lib: 在 VS 编译器中

D:ProgramFiles(x86)MicrosoftVisualStudio9.0VClibmsvcrt.lib

重新编译并执行我们的测试程序,我们可以在执行 main 函数之前看到两个插入的 int3 指令:

推理和反思

2017年9月初,360恐吓情报中心发布《供应链源头攻击分析报告》(阅读原文),总结了近年来多起知名的供应链攻击案例,发现供应链攻击渠道大多是软件包。污染编译环境的软件案例并不多,最著名的是 2015 年 Xcode 开发工具恶意代码植入风波,从目前分析来看,CCleaner 也极有可能是定向编译环境污染供应链的工作。以下是一些相关的技术推论:

因为

隐瞒这种有针对性的环境污染罢工发展以及受影响的目标范围广,攻击者可能会影响CCleaner以外的其他软件,我们可能会看到罢工者引发的其他供应链污染风暴。

参考链接

(v=vs.90).aspx

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 编译jvm源码-黑马程序员技术交流社区 https://www.wkzy.net/game/135750.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务