吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5447|回复: 18
收起左侧

[Android 原创] 一个简单端侧可使用的 LLVM BC 虚拟机

[复制链接]
jaffer 发表于 2021-3-28 16:19
本帖最后由 jaffer 于 2021-3-28 16:20 编辑

### 背景
很多时候,在移动端的应用都存在动态更新的问题。以前还可以使用动态下发动态库的办法来解决更新。但是现在,iOS 上已经不允许这样,android 上也各种收紧。那么我的一段代码,如何下发到手机端进行运行呢?
有很多办法,例如借助一些脚本语言等。这里我将介绍一种动态下发 llvm bc 的办法。

### LLVM BC
将一段代码编译成 llvm bc 很简单。例如:
[C] 纯文本查看 复制代码
#include <stdio.h>

int k = 1111;
int test(int i) {
  int tmp = k + i;
  printf("i = %d\n", tmp);
  return 22;
}
int main(void)
{
  test(55);
  printf("Hello world\n");
  return 0;
}


要将这段代码编译成 bc 很简单:
[Bash shell] 纯文本查看 复制代码
clang -emit-llvm -c test.c -o test.bc


这段代码即可编译成 bc 代码。bc 代码下发到移动端就没有动态库那么多限制。

### 如何解析 BC
如何运行 BC 呢?LLVM 其实自带了 LLI 去执行。
[C] 纯文本查看 复制代码
&#10140;  bc git:(master) &#10007; lli test.bc
i = 1166
Hello world, ret = 22


但是 LLI 太大了。端侧的解释器肯定不会允许这么大的size。
那么怎么办呢?一种办法就是自己去精简 LLI,这个里面的内容就很错综复杂。另外一种就是自己去写一个 BC 的解释器,毕竟 LLVM BC 的格式都是公开的。
很凑巧,GitHub 上有一个开源的运行 BC 的解释器。VMIR。https://github.com/andoma/vmir
里面详细介绍了它自己写的一个执行 llvm BC 的解释器。
很遗憾的是,它的代码已经很老,解析的 LLVM BC 代码格式也很老,已经不能运行了。

### 改造 VMIR
虽然 VMIR 已经不能运行,但是它的框架还是值得继续借鉴。我们只需要在它的基础上,修改一些关键逻辑,增加对新的LLVM BC 格式的支持,那么也是可以继续运行的。
主要对其的改动如下:
1、增加新的 BLOCK 块解析。
2、为 function 和 global_var 添加新的变量以确定函数名称和变量名称。
3、使用新的 magic number
4、global 以及 Function 的重新解析。
5、增加对 str tab block 的处理(所有的字符串都存储在这个位置)。

修改之后的最新代码: https://github.com/cogbee/vmir-latest

编译出来之后,打下如下:
[C] 纯文本查看 复制代码
&#10140;  vmir git:(master) &#10007; ls -lh | grep vmir
-rwxr-xr-x   1 jaffer  staff   332K 12 28 10:21 vmir


只有 332k,当然还可以继续精简,将 wasm 相关的内容也去掉。这么小的size放到移动端应该是没啥大问题的了。
运行的示例如下:

image.png

### 缺陷
我只是基于 VMIR 对 LLVM BC 相关的部分进行了简单改造。并不保障完全稳定。
同时 VMIR 存在的一些问题,例如 C++ stl 的不支持等依然存在。

### 最后
有这么一个简易的 bc 解释器,那么是否可以基于这个 vmir 修改指令集(也需要同步改动 llvm clang 编译器),构建自己的虚拟机或解释器对保护端侧敏感的代码呢?

免费评分

参与人数 6威望 +2 吾爱币 +104 热心值 +6 收起 理由
经典柚子 + 1 + 1 我很赞同!
victos + 1 + 1 谢谢@Thanks!
12138chen + 1 + 1 我很赞同!
wanleya + 1 谢谢@Thanks!
qtfreet00 + 2 + 100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
grrr_zhao + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

bwuaich 发表于 2021-3-28 16:45
来看看; 这 深层; 学习; 慢慢消化; 谢谢分享!!
甚舞尘嚣 发表于 2021-3-28 17:15
du6885386 发表于 2021-3-28 19:30
52jcool 发表于 2021-3-28 23:01
收藏 学习 谢谢 分享
intel286 发表于 2021-3-29 06:54
android c 解释器可以这样理解吗
王雪峰 发表于 2021-3-29 13:02
虚拟机正好需要,看看如何
wuoo563 发表于 2021-3-29 13:48
感谢楼主分享
swhyy 发表于 2021-3-29 18:09
感谢楼主的分享,新手小白表示要多学习
zhangbaoyu 发表于 2021-3-30 05:41
技术贴 强烈支持
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 11:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表