一、背景
前一段时间自己用ubuntu 但一些windows的软件无法使用,所以用到wine,跑起来一些程序,但效果肯定没有windows好的,毕竟知识模拟。有太多地方需要处理,比喻字体,我开始模拟网易云音乐无法启动,后面我发现是字体没有安装,后面我把一些必要的字体安装就可以了,想不到字体这么重要。
二、知识点
- 进程虚拟化(依赖和非依赖运行系统)
- 系统虚拟化
三、分析
一、进程虚拟化(依赖)
这种windows常见内存加载dll或者exe或则沙箱技术,或者wine,wine也是类似的技术,因为他是linux或者其他非windows,所以他要模拟实现windows 系统实现,所以wine兼容西考虑更多。因为研究过内存加载exe技术,而且这种最简单,理论上wine的核心思路差不多,技术思路如下:
逻辑
- 加载要内存运行exe,解析PE头,加载需要dll
- 重定位表进行修改需要改地址,比喻函数地址和全局变量
- 修改进程信息,这种不一定要使用,如果该进程没有调用获取本模块的信息,那就不会有影响,但读取文件需要设置执行程序的安装目录
- 跳到该exe入口函数,开始执行
- 遇到不兼容的崩溃,逆向分析,修复不断,不断优化加载框架的通用性,那么框架的兼容性越高
这种依赖宿主系统,因为是同一个系统,所以exe调用系统资源可以直接调用,这样子减少大量工作量,wine为了完成兼容,需要不断逆向windows 系统API,完成兼容性,所以这么年过去,兼容性也只能勉强能用,因为模拟兼容一个系统付出精力很多,这不是单纯的技术问题,大部分是体力问题,同时还需要各种测试环境,因为只有实际有问题的环境才有问题。
这里其实还有一种技术扩展,沙箱技术,程序运行在沙箱中,就是类似技术,只是要拦截很多行为,比喻文件访问,因为我们要提供一个假的路径,这样子他访问或者创建文件都是在我们监控下面,如果没有被监控,那么他会对我们真正系统文件进行访问,这样子会导致系统真正中毒,所以这类技术主要通过宿主中hook api,但为了安全还要驱动进行拦截,如果单纯应用程序拦截,可能会有问题,比喻程序调用系统底层API,如果你hook应用层,可能穿透了,导致无法完全拦截api。
相关资料
github 上面有开源的代码,搜索内存加载,可以找到很多有关的代码
内存直接加载运行DLL文件 - 自己的小白 - 博客园 (cnblogs.com)
使用内存加载躲避静态查杀 (citrusice.github.io)
如何从内存加载DLL - FreeBuf网络安全行业门户
二、进程模拟(非依赖系统)
目前我们接触到是wine,他思路跟我们上面类似,比上面更加麻烦,这种技术认为跟沙箱类似,沙箱为了拦截,实现一些驱动。我感觉沙箱也可以实现假的系统dll,这样子调用所有API都要经过自己的,这样子可以实现各种拦截,然后判断合理就转发给真正的系统的
资料
- wine的代码(我目前没有看)
- wine : 如何实现系统调用虚拟化 | Deep Dark Fantasy (martins3.github.io)
- How Wine works 101 🍷 | Andy Hippo (werat.dev) 这篇文章写非常好,国内有翻译版本
三、系统模拟
这种完全汇编,指令执行,这种单纯软件实现 QEMU ,我看了一下代码实现,但貌似我忘记差不多了,看代码时候没有写笔记,导致忘记。
逻辑
- 解析镜像或者程序
- 加载指令
- 模拟CPU执行,可以模拟各种指令,无论x86 还是其他的指令集都可以模拟实现,
这种我只是简单看了一下代码,不是很熟悉,这种模拟cpu肯定没有硬件虚拟化性能快,但通用性肯定没有这种模拟好
资料
qemu 代码实现
其他
语言或者脚本虚拟机,lua,js,c# ,java,他们运行在他们自己宿主中,他们转换中间字节码,这里为什么要抓换字节码是为了更搞性能,最重要为了扩展性,语言语法怎么扩展最中都转换中间层,底层直接跑中间层就可以了,理论上不要中间层也可以。刚开始学编程认为其他语言编译c然后编译汇编,然后跑指令。
说一个题外话,鸿蒙系统完美兼容andorid,你觉得它是不是套壳呢?如果只是API兼容,那么wine实现这么年,连跑一些程序都麻烦,所以他肯定不是接口兼容,那么就是虚拟机,在一个系统跑一个android虚拟机 ,那么性能一定有损失,所以从技术角度,鸿蒙一定是android。其实鸿蒙用不用android也没有什么,但太恶心了,因为技术发展可以一步步来,并不是靠欺骗,就算鸿蒙最后转自己系统,目前这种做法就是恶心。国内太多技术欺骗,他们把开源变成独立研发,然后套经费,导致浪费太多时间。
从技术角度来看,任何技术都是一步步来,前人技术开发一套模块,我们技术在模块上开发,从而不断迭代,这才是根基。没有任何复杂的东西是一蹴而就