【Rust】C++调用Rust之初试
本帖最后由 lichao 于 2023-10-12 17:40 编辑## 前言
  在逆向分析一款iOS软件时发现其使用Rust静态库用于安全防护的技术,经过研究笔者成功实现Rust加密字符串以及Rust/C++互调,这里仅介绍后者。
  为什么笔者喜欢折腾呢,就是因为之前讨论过跨语言开发的优势,之前写了一篇Golang<https://www.0xaa55.com/thread-27345-1-1.html>也是为了增加逆向的复杂性,这次使用Rust语言也是这个目的,因此高级语言的库都比较丰富,可以大幅度增加逆向复杂度。同样的字符串常量,笔者用模板元可以完美实现编译期加密,而使用跨语言间接处理则复杂度更高。
### 安装Rust
笔者环境仍然是MacOS,使用官方提供的安装命令即可`curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh`。
## 开发
build.rs
```Rust
fn main() {
cxx_build::bridge("src/lib.rs")
.file("src/rust_bridge.cpp")
.flag_if_supported("-std=c++11")
.compile("rust_bridge");
println!("cargo:rerun-if-changed=src/lib.rs");
println!("cargo:rerun-if-changed=src/rust_bridge.h");
println!("cargo:rerun-if-changed=src/rust_bridge.cpp");
}
```
src/lib.rs
```
#
mod ffi {
extern "Rust" {
fn cpp_call_rust();
}
unsafe extern "C++" {
include!("helloworld/src/rust_bridge.h");
fn rust_call_cpp();
}
}
fn cpp_call_rust() {
println!("call from c++");
}
fn test_rust() {
ffi::rust_call_cpp();
}
```
cargo.toml
```
name = "helloworld"
version = "0.1.0"
edition = "2021"
obfstr = "*"
litcrypt = "*"
cxx = "*"
cxx-build = "*"
crate-type = ["staticlib"]
```
src/rust_bridge.h
```cpp
#pragma once
#include "rust/cxx.h"
void rust_call_cpp();
```
src/rust_bridge.cpp
```
#include "rust_bridge.h"
#include "helloworld/src/main.rs.h"
#include <stdio.h>
void rust_call_cpp() {
printf("rust_call_cpp\n");
}
```
执行编译到iOS,得到文件target/aarch64-apple-ios/release/libhelloworld.a
```bash
cargo build --target aarch64-apple-ios --release
```
此时将libhelloworld.a/librs.h/librs.cc/cxx.h链接到XCode项目中即可调用cpp_call_rust函数!!!
## iOS远程调试Rust
launch.json
```json
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug",
"type": "lldb",
"request": "custom",
"initCommands": [
"platform select remote-ios",
"target create \"${workspaceFolder}/target/aarch64-apple-ios/debug/helloworld\"",
"script lldb.debugger.GetSelectedTarget().modules.SetPlatformFileSpec(lldb.SBFileSpec(\"/usr/bin/helloworld\"))"
],
"processCreateCommands": [
"shell bash deploy.sh",
"process connect connect://127.0.0.1:111",
"run"
]
}
]
}
```
deploy.sh
```bash
#!/bin/sh
ldid -Starget.plist target/aarch64-apple-ios/debug/helloworld
ssh root@127.0.0.1 "rm -f /usr/bin/helloworld"
scp target/aarch64-apple-ios/debug/helloworld root@127.0.0.1:/usr/bin/
```
target.plist
```plist
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>platform-application</key>
<true/>
</dict>
</plist>
```
lichao 发表于 2023-9-25 18:08
我对Rust没深入使用,我长期用C/C++/OC/Python/JS/Vue开发,目前做前后端+移动端这些语言完全够用。个人 ...
对于 Rust 的口碑我真是感到一言难尽,主要是不喜欢别人使劲跟我吹 Rust 有多好、C++ 有多糟糕等,有的时候面对一些 Rust 狂热者我就算说一句“我知道了”都能得罪对方,讲真我不敢在别人面前提 Rust 这个语言,也不太想靠近他们的狂热圈子。不过它能规范一些软件开发者使用内存的方式,这一点确实是个不错的特性。
但是个人感觉对于我来说,它带来的利不足以抵消它带来的弊,主要是我无法接受它的语法噪声问题。我选择规范使用 C++ 进行正经开发和内存管理,这样可以保证对于我而言的开发效率。 楼主怎样看待Rust?发展前景大吗?楼主是否喜欢Rust语法? usr 发表于 2023-9-25 16:25
楼主怎样看待Rust?发展前景大吗?楼主是否喜欢Rust语法?
我对Rust没深入使用,我长期用C/C++/OC/Python/JS/Vue开发,目前做前后端+移动端这些语言完全够用。个人觉得工具不用会太多,最重要的还是看用工具做出什么成果。选工具一定要对应到做啥项目,如果选择的语言太小众用几年没人用了就浪费时间了。
Rust口碑不错,跨平台做的是真方便,也不用担心内存泄漏,做后端和移动端没太大问题,值得深入。
Go的话做后端比较好 0xAA55 发表于 2023-9-26 18:54
对于 Rust 的口碑我真是感到一言难尽,主要是不喜欢别人使劲跟我吹 Rust 有多好、C++ 有多糟糕等,有的时 ...
这是英国科幻作家道格拉斯·亚当斯提出的充满幽默感的科技三定律:1.任何在我出生时已经有的【科技】都是稀松平常的【世界】本来秩序的一部分;
2.任何在我15到35岁之间诞生的【科技】都是将会改变【世界】的革命性产物;
3.任何在我35岁之后诞生的【科技】都是违反自然规律要遭天谴的!
我认为可以改成:
1.任何在我出生时已经有的【编程语言】都是稀松平常的【编程世界】本来秩序的一部分;
2.任何在我15到35岁之间诞生的【编程语言】都是将会改变【编程世界】的革命性产物;
3.任何在我35岁之后诞生的【编程语言】都是违反自然规律要遭天谴的!
而对我个人而言:
1、任何在我【学习编程之前】已经有的【编程语言】都是稀松平常的【编程世界】本来秩序的一部分;
2、任何在我【学习编程之后】诞生的【编程语言】都是违反自然规律要遭天谴的! 美俪女神 发表于 2023-10-10 17:48
这是英国科幻作家道格拉斯·亚当斯提出的充满幽默感的科技三定律:
我认为可以改成:
1.任何在我出生时已 ...
嗯,那说明你没被 Rust 狂热者毒打过。
此处故意说一句戳 Ruster 痛处的话:你用 RUST 写双向链表写得爽吗? 0xAA55 发表于 2023-10-11 09:20
嗯,那说明你没被 Rust 狂热者毒打过。
此处故意说一句戳 Ruster 痛处的话:你用 RUST 写双向链表写得爽 ...
如果不是职业程序员,用VBS+VB6已经可以完成99%的编程任务。
我自用的收入支出统计器、管道承压计算器等程序,都是用VBS写的。
我自用的集成开发环境、山寨OFFICE套装等程序,都是用VB6写的。
可惜我听说,到了WINDOWS 12,微软就要废除VBS了,全部改为其它的“先进语言”,就是我认为“违反自然规律要遭天谴的”那些语言。
页:
[1]