lichao 发表于 2023-9-24 00:52:27

【Rust】C++调用Rust之初试

本帖最后由 lichao 于 2023-10-12 17:40 编辑



## 前言
  在逆向分析一款iOS软件时发现其使用Rust静态库用于安全防护的技术,经过研究笔者成功实现Rust加密字符串以及Rust/C++互调,这里仅介绍后者。
&emsp;&emsp;为什么笔者喜欢折腾呢,就是因为之前讨论过跨语言开发的优势,之前写了一篇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>
```


0xAA55 发表于 2023-9-26 18:54:07

lichao 发表于 2023-9-25 18:08
我对Rust没深入使用,我长期用C/C++/OC/Python/JS/Vue开发,目前做前后端+移动端这些语言完全够用。个人 ...

对于 Rust 的口碑我真是感到一言难尽,主要是不喜欢别人使劲跟我吹 Rust 有多好、C++ 有多糟糕等,有的时候面对一些 Rust 狂热者我就算说一句“我知道了”都能得罪对方,讲真我不敢在别人面前提 Rust 这个语言,也不太想靠近他们的狂热圈子。不过它能规范一些软件开发者使用内存的方式,这一点确实是个不错的特性。

但是个人感觉对于我来说,它带来的利不足以抵消它带来的弊,主要是我无法接受它的语法噪声问题。我选择规范使用 C++ 进行正经开发和内存管理,这样可以保证对于我而言的开发效率。

usr 发表于 2023-9-25 16:25:43

楼主怎样看待Rust?发展前景大吗?楼主是否喜欢Rust语法?

lichao 发表于 2023-9-25 18:08:10

usr 发表于 2023-9-25 16:25
楼主怎样看待Rust?发展前景大吗?楼主是否喜欢Rust语法?

我对Rust没深入使用,我长期用C/C++/OC/Python/JS/Vue开发,目前做前后端+移动端这些语言完全够用。个人觉得工具不用会太多,最重要的还是看用工具做出什么成果。选工具一定要对应到做啥项目,如果选择的语言太小众用几年没人用了就浪费时间了。
Rust口碑不错,跨平台做的是真方便,也不用担心内存泄漏,做后端和移动端没太大问题,值得深入。
Go的话做后端比较好

美俪女神 发表于 2023-10-10 17:48:13

0xAA55 发表于 2023-9-26 18:54
对于 Rust 的口碑我真是感到一言难尽,主要是不喜欢别人使劲跟我吹 Rust 有多好、C++ 有多糟糕等,有的时 ...

这是英国科幻作家道格拉斯·亚当斯提出的充满幽默感的科技三定律:1.任何在我出生时已经有的【科技】都是稀松平常的【世界】本来秩序的一部分;
2.任何在我15到35岁之间诞生的【科技】都是将会改变【世界】的革命性产物;
3.任何在我35岁之后诞生的【科技】都是违反自然规律要遭天谴的!
我认为可以改成:
1.任何在我出生时已经有的【编程语言】都是稀松平常的【编程世界】本来秩序的一部分;
2.任何在我15到35岁之间诞生的【编程语言】都是将会改变【编程世界】的革命性产物;
3.任何在我35岁之后诞生的【编程语言】都是违反自然规律要遭天谴的!

而对我个人而言:
1、任何在我【学习编程之前】已经有的【编程语言】都是稀松平常的【编程世界】本来秩序的一部分;
2、任何在我【学习编程之后】诞生的【编程语言】都是违反自然规律要遭天谴的!

0xAA55 发表于 2023-10-11 09:20:36

美俪女神 发表于 2023-10-10 17:48
这是英国科幻作家道格拉斯·亚当斯提出的充满幽默感的科技三定律:
我认为可以改成:
1.任何在我出生时已 ...

嗯,那说明你没被 Rust 狂热者毒打过。

此处故意说一句戳 Ruster 痛处的话:你用 RUST 写双向链表写得爽吗?

美俪女神 发表于 2023-10-18 20:04:10

0xAA55 发表于 2023-10-11 09:20
嗯,那说明你没被 Rust 狂热者毒打过。

此处故意说一句戳 Ruster 痛处的话:你用 RUST 写双向链表写得爽 ...

如果不是职业程序员,用VBS+VB6已经可以完成99%的编程任务。

我自用的收入支出统计器、管道承压计算器等程序,都是用VBS写的。

我自用的集成开发环境、山寨OFFICE套装等程序,都是用VB6写的。

可惜我听说,到了WINDOWS 12,微软就要废除VBS了,全部改为其它的“先进语言”,就是我认为“违反自然规律要遭天谴的”那些语言。
页: [1]
查看完整版本: 【Rust】C++调用Rust之初试