[ARM64] 破解华为ExaGear,让它可以在飞腾CPU上运行

@Ta 2021-12-12发布,06-03 15:21修改 74710点击

华为ExaGear简介:

ExaGear是一款二进制指令动态翻译软件,运行在ARM64服务器上,通过将x86的指令在运行时翻译为ARM64指令并执行,使得绝大部分Linux on x86应用无需重新编译就可运行在ARM64服务器上,实现低成本、快速迁移Linux on x86应用到ARM64服务器。

这非常好。

但有一点不好:华为ExaGear只能在华为CPU上运行,在其他CPU上运行会报错“Unsupported CPU detected”。

不过,只要把可执行文件稍微修改一下,绕过这个CPU类型检测,就能让它在飞腾CPU上运行了,方法在下面。

备注:这篇教程也做为华为鲲鹏CPU安装ExaGear的教程,不过鲲鹏CPU本身就是华为的,所以不需要执行破解那一步。

安装步骤

  1. 旧版华为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
    
  2. 下载并安装以下任一版本的华为exagear:

    如果想看看有没有新版本,可以去这里找(但是新版本可能和我的破解方法不兼容,飞腾用不了,鲲鹏和麒麟可以):
    https://mirrors.huaweicloud.com/kunpeng/archive/ExaGear/

    建议银河麒麟、deepin和UOS安装ExaGear_Server_for_Ubuntu20里的包。

  3. 安装方法:

    1. 压缩包解压后,在文件管理器里进入ExaGear_*/ExaGear_Server_for_Ubuntu20/release文件夹。
    2. 右击文件管理器的空白处,选择“在终端打开”。
    3. 在打开的终端执行以下命令:
    sudo apt install ./*.deb
    
  4. 尝试运行exagear命令。

exagear

如果遇到以下报错,说明Linux内核与旧版华为exagear(3.x之前)不兼容,需要更换CONFIG_ARM64_VA_BITS_48=y的内核,或者安装Exagear 3.x版本。

2021-12-13_03-30-40.png

如果遇到以下报错,请执行第5步的破解操作:

image.png

如果执行完没有报错,直接进入了exagear环境,就不需要执行第5步,可直接跳到第6步。

  1. 执行以下命令破解ExaGear(如果你是华为CPU,不需要破解就能用,可跳过此步):
# 切换到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";
  1. exagear可以使用了,只需要执行exagear命令进入x86容器环境,就可以安装x86软件包了。

(截图只是功能展示,不需要执行截图中的命令。要执行的操作从6.1开始。)

image.png

image.png

不过系统语言是英文。切换语言的方法如下:

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]*/[email protected]/ubuntu@g' /etc/apt/sources.list

# 阿里云
sudo sed -i 's@[a-z0-9.-]*\.[a-z][a-z][a-z]*/[email protected]/ubuntu@g' /etc/apt/sources.list

# 清华
sudo sed -i 's@[a-z0-9.-]*\.[a-z][a-z][a-z]*/[email protected]/ubuntu@g' /etc/apt/sources.list

6.2. 切换语言为中文

# 首先进入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上,然后按空格或者回车确认。

image.png

然后在这里选“zh_CN.UTF-8”并回车确认。

image.png

等命令执行完(需要一段时间),关掉终端再重新打开一个,命令的语言就会变成中文了。

exagear
apt

image.png

回复列表(23|隐藏机器人聊天)
  • c
    @Ta / 2021-12-12 / /
    就这?
  • @Ta / 2021-12-12 / /

    @c,你是不是发错了

  • @Ta / 2021-12-12 / /

    @老虎会游泳,怎么测试的?树莓派吗
    小米20定制版

  • @Ta / 2021-12-12 / /

    @幻阳化翼,我写了“在飞腾CPU上运行”,所以就是“在飞腾CPU上测试”。

  • @Ta / 2021-12-12 / /

    我没有树莓派,我准备让@5258 测试树莓派。

  • @Ta / 2021-12-12 / /

    @老虎会游泳,随时恭候老虎🐯
    一加7pro(皇帝版)

  • @Ta / 2021-12-12 / /

    6楼的测试结果是与树莓派默认内核不兼容。

  • @Ta / 2021-12-12 / /

    @老虎会游泳,等待老虎把内核问题搞定那就是树莓派最高光的时候了
    一加7pro(皇帝版)

  • @Ta / 2021-12-12 / /

    @5258,你把exagear卸载了吧。

    卸载方法:

    sudo apt purge 'exagear*'
    

    然后安装这个:

    Wine游戏助手ARM64测试版

    安装的时候执行“银河麒麟”的安装步骤。这个版本应该是和树莓派兼容的,并且可以玩一些老游戏(比如War3)。

  • @Ta / 2021-12-12 / /
    cat /sys/devices/system/cpu/cpu0/regs/identification/midr_el1
    
  • @Ta / 2022-01-10 / /
    树莓派3b,刷Ubuntu20.04 lts,安装后破解,完美运行
    找了好几天如何解决Unsupported CPU detected,今天终于解决了
    感谢楼主
  • @Ta / 2022-01-10 / /

    @a946936114
    一加8Pro

  • @Ta / 2022-01-10 / /
    这个破解是怎么得出来的?我想破解ExaGear for docker,应该搜什么知识?
  • @Ta / 2022-01-10 / /

    @a946936114,我觉得我的破解命令也可以用于ExaGear for docker。至于怎么找到破解方法,我是用ida pro进行远程调试。你得知道ARM64里怎么读取CPU型号,然后在代码里找到相关指令,对指令进行修改,改成可以通过验证的结果。

    图中是调试的第一个障碍,一个反调试指令。解决方法是直接跳过该指令的执行。

    至于应该修改哪里,当时我没有截图。

    -2a677d8fcb55aeb6.png

  • @Ta / 2022-01-11 / /

    把这个程序编译成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

  • @Ta / 2022-01-10 / /

    老虎居然还会perl这么古老的语言
    坏孩子,其实你很好,但是还不够好

  • @Ta / 2022-01-11 / /
    谢谢老虎,大概明白了,我再研究研究

    原有的破解不能用于docker,还是提示unsupport
  • @Ta / 2022-01-11 / /

    @乄杺,因为破解需要用正则表达式进行内容替换,但是我只会PHP的PCRE(Perl兼容正则表达式),而Linux不自带PHP,所以选择用Perl(正则语法真的是一样的,我忘记后瞻断言怎么写了,都是去php.net/pcre看的手册)。至于Perl的命令行替换参数写法,我也是现搜的。

  • @Ta / 2022-01-11 / /

    @老虎会游泳
    ,,,我也是学习正则时了解到的perl(pcre正则),看网上说法,只知道perl这门语言很老,学起来比较反人类,,处理文本很厉害
    坏孩子,其实你很好,但是还不够好

添加新回复
回复需要登录