标题: [ARM64] 破解华为ExaGear,让它可以在飞腾CPU上运行
时间: 2021-12-12发布,06-03 15:21修改
华为ExaGear简介:
ExaGear是一款二进制指令动态翻译软件,运行在ARM64服务器上,通过将x86的指令在运行时翻译为ARM64指令并执行,使得绝大部分Linux on x86应用无需重新编译就可运行在ARM64服务器上,实现低成本、快速迁移Linux on x86应用到ARM64服务器。
这非常好。
但有一点不好:华为ExaGear只能在华为CPU上运行,在其他CPU上运行会报错“Unsupported CPU detected”。
不过,只要把可执行文件稍微修改一下,绕过这个CPU类型检测,就能让它在飞腾CPU上运行了,方法在下面。
备注:这篇教程也做为华为鲲鹏CPU安装ExaGear的教程,不过鲲鹏CPU本身就是华为的,所以不需要执行破解那一步。
旧版华为ExaGear(3.x之前)对Linux内核有要求,不兼容内核无法正常启动旧版华为ExaGear(3.x之前)。
目前已知UOS的内核是兼容的。
银河麒麟的内核不兼容。
树莓派官方64位系统的内核不兼容。
所以银河麒麟和树莓派最好使用3.x版本的Exagear,以免遇到兼容性问题。
如果一定要使用旧版Exagear,银河麒麟可按以下教程替换内核:
https://hu60.cn/q.php/bbs.topic.102204.html
内核需要开启以下选项,才能与旧版华为ExaGear(3.x之前)兼容:
CONFIG_ARM64_VA_BITS_48=y
CONFIG_ARM64_VA_BITS=48
下载并安装以下任一版本的华为exagear:
如果想看看有没有新版本,可以去这里找(但是新版本可能和我的破解方法不兼容,飞腾用不了,鲲鹏和麒麟可以):
https://mirrors.huaweicloud.com/kunpeng/archive/ExaGear/
建议银河麒麟、deepin和UOS安装ExaGear_Server_for_Ubuntu20
里的包。
安装方法:
ExaGear_*/ExaGear_Server_for_Ubuntu20/release
文件夹。sudo apt install ./*.deb
尝试运行exagear
命令。
exagear
如果遇到以下报错,说明Linux内核与旧版华为exagear(3.x之前)不兼容,需要更换CONFIG_ARM64_VA_BITS_48=y
的内核,或者安装Exagear 3.x版本。
如果遇到以下报错,请执行第5步的破解操作:
如果执行完没有报错,直接进入了exagear环境,就不需要执行第5步,可直接跳到第6步。
# 切换到root权限
sudo -i;
# 检测是否需要破解
grep ExaGear /proc/cpuinfo >/dev/null && echo '你在exagear内,请直接跳到第6步。' || { grep 0x0000000048 /sys/devices/system/cpu/cpu0/regs/identification/midr_el1 >/dev/null && echo '你用的是华为CPU,不需要破解,请直接跳到第6步。' || echo '你用的不是华为CPU,需要破解,请执行下面的命令。'; };
# 破解 ubt_x32a64_al
f='/opt/exagear/bin/ubt_x32a64_al';
mv "$f" "$f.origin";
perl -pe 's/\x{02}\x{7C}\x{18}\x{53}(?!\x{1F}\x{5C})/\x{02}\x{09}\x{80}\x{D2}/g' < "$f.origin" > "$f";
chmod +x "$f";
# 破解 ubt_x64a64_al
f='/opt/exagear/bin/ubt_x64a64_al';
mv "$f" "$f.origin";
perl -pe 's/\x{02}\x{7C}\x{18}\x{53}(?!\x{1F}\x{5C})/\x{02}\x{09}\x{80}\x{D2}/g' < "$f.origin" > "$f";
chmod +x "$f";
exagear
命令进入x86容器环境,就可以安装x86软件包了。(截图只是功能展示,不需要执行截图中的命令。要执行的操作从6.1开始。)
不过系统语言是英文。切换语言的方法如下:
Ubuntu默认软件源下载速度很慢,所以安装软件包之前先换源:
# 首先进入exagear
grep ExaGear /proc/cpuinfo >/dev/null || exagear || echo '进入exagear失败,请先执行前面的步骤,正确安装exagear。在解决该问题前不要继续。'
# 然后下面3个命令任选一个执行,如果一个速度不满意就换另一个。下面执行 apt install 步骤的时候就能看出速度快不快。
# 网易
sudo sed -i 's@[a-z0-9.-]*\.[a-z][a-z][a-z]*/ubuntu@mirrors.163.com/ubuntu@g' /etc/apt/sources.list
# 阿里云
sudo sed -i 's@[a-z0-9.-]*\.[a-z][a-z][a-z]*/ubuntu@mirrors.aliyun.com/ubuntu@g' /etc/apt/sources.list
# 清华
sudo sed -i 's@[a-z0-9.-]*\.[a-z][a-z][a-z]*/ubuntu@mirrors.tuna.tsinghua.edu.cn/ubuntu@g' /etc/apt/sources.list
# 首先进入exagear
grep ExaGear /proc/cpuinfo >/dev/null || exagear || echo '进入exagear失败,请先执行前面的步骤,正确安装exagear。在解决该问题前不要继续。'
# 更新软件包列表
sudo apt update;
# 安装字体和语言包
sudo apt install -y locales fonts-noto-cjk fonts-noto-cjk-extra language-pack-zh-hans;
# 选择语言
sudo dpkg-reconfigure locales;
执行sudo dpkg-reconfigure locales
后,你会看到这样的界面,无需修改选项,直接确认即可。用方向键或者Tab导航到Ok上,然后按空格或者回车确认。
然后在这里选“zh_CN.UTF-8”并回车确认。
等命令执行完(需要一段时间),关掉终端再重新打开一个,命令的语言就会变成中文了。
exagear
apt
『回复列表(23|显示机器人聊天)』
@a946936114,我觉得我的破解命令也可以用于ExaGear for docker。至于怎么找到破解方法,我是用ida pro进行远程调试。你得知道ARM64里怎么读取CPU型号,然后在代码里找到相关指令,对指令进行修改,改成可以通过验证的结果。
图中是调试的第一个障碍,一个反调试指令。解决方法是直接跳过该指令的执行。
至于应该修改哪里,当时我没有截图。
把这个程序编译成arm64,然后对其进行调试,就能知道获取CPU型号的汇编指令是什么样的了。然后去exagear二进制里搜相关指令。
https://blog.csdn.net/buknow/article/details/107721094
搜到之后,还需要思考一些事情。问题在于:修改空间很少,函数调用后马上就返回了,上下都没有空闲空间。这导致你几乎只有一条指令的修改空间,但CPU型号寄存器的内容很长(32位),无法用立即数表示,所以塞不进单条指令。
于是无法修改获取型号的指令,需要修改对型号进行运算的指令,也就是02 7C 18 53
,它是从结果寄存器中截取CPU厂商ID的指令,厂商ID很小,可以用立即数表示。于是只需要把这条指令改成立即数赋值指令(02 09 80 D2
)即可,该指令把结果设为华为的厂商ID,于是通过了校验。
注意:二进制里有两处02 7C 18 53
,需要修改的是第二处。
此外,ida pro可以把02 7C 18 53
这样的机器码显示成ARM汇编指令,这样就更容易理解。不过我没打开ida pro,所以没有截图。如果你感兴趣,可以自己用ida pro打开/opt/exagear/bin/ubt_x64a64_al
和/opt/exagear/bin/ubt_x32a64_al
进行查看。
备注:ida pro似乎没有直接修改二进制文件的功能,所以搞清楚怎么改之后,还要用十六进制编辑器进行实际的修改,推荐使用HxD。
@乄杺,因为破解需要用正则表达式进行内容替换,但是我只会PHP的PCRE(Perl兼容正则表达式),而Linux不自带PHP,所以选择用Perl(正则语法真的是一样的,我忘记后瞻断言怎么写了,都是去php.net/pcre看的手册)。至于Perl的命令行替换参数写法,我也是现搜的。