关注它,学习不迷路:
本文参考渔滒 在52破解论坛上面发布的文章,略有修改,地址:
https://www.52pojie.cn/thread-1556027-1-1.html
在此感谢。
写个更详细的适合新手的版本。
我的当前环境是 Win7 + kali2019 虚拟机。
一.wasm2c文件下载及使用
我们先把 wabt 的代码下载下来,C调用需要用到它的部分代码依赖:
https://github.com/WebAssembly/wabt
再把 wasm2c 这个可执行文件下载下来,方便我们将wasm代码转换成c代码,下载地址:
https://github.com/WebAssembly/wabt/releases
下载符合你运行环境的版本,我的是win系统,因此选择了win版本的:
下载文件,并解压,会得到一个bin文件夹,里面有这些文件:
按照 渔滒 给的方法,把猿人学的main.wasm文件拷贝到这个文件夹下:
使用下面的命令,将wasm文件转成c代码:
wasm2c main.wasm -o yuanrenxue.c
转换完成后,帮我们生成了 yuanrenxue.c 和 yuanrenxue.h 两个文件,如图:
注: 如果运行命令时报 找不到XXX.dll 的错误时,可以在网上下载对应的dll文件,放在c盘的system32文件夹下。
二.改写为C代码进行调用
首先,我们建立一个 包含main函数的.c文件:
#include <stdio.h>
int main(void)
{
return 0;
};
根据文章的指引,需要对调用wasm进行初始化:
#include <stdio.h>
#include "yuanrenxue.c"
void init_wasm(){
init_func_types();
init_globals();
init_memory();
init_table();
init_exports();
}
int main(void)
{
init_wasm();
return 0;
};
调试js后得知,其加密函数为 encode,我们可以看到其对应的函数是
static u32 w2c_encode(u32, u32);
设置好实参并进行调用:
#include <stdio.h>
#include "yuanrenxue.c"
void init_wasm(){
init_func_types();
init_globals();
init_memory();
init_table();
init_exports();
}
int main() {
init_wasm();
u32 t1 = 819334766;
u32 t2 = 819334746;
u32 out = w2c_encode(t1, t2);
printf("%u\n", out);
return 0;
}
根据文章的指引,我们把上面的代码保存为main.c 文件,然后将wasm-rt.h、wasm-rt-impl.c、wasm-rt-impl.h、yuanrenxue.c、yuanrenxue.h 打包到一个文件夹中,并复制到kali系统中(因为我的win系统没有安装gcc):
然后在当前窗口打开 Terminal,输入命令:
gcc main.c wasm-rt-impl.c -o wasm
这样,就会在当前的文件家中生成一个wasm的可执行文件,使用命令执行:
可以看到,输入了正确的结果。
文章到这里就基本差不多了,只是简单的介绍了wasm的c调用方法,复杂的方法请参考上面渔滒写的文章。
这里有个不足,一般我们不在c文件里面直接调用其他的c文件,都是调用其.h文件,这里仅作测试,没必要对其规范,总之,能拿到结果就行吧。
人和代码,只要有一个能跑就行。
感谢阅读,需要代码的朋友可添加本人微信获取。