找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 750|回复: 6

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

[复制链接]
发表于 2023-9-24 00:52:27 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

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

前言

  在逆向分析一款iOS软件时发现其使用Rust静态库用于安全防护的技术,经过研究笔者成功实现Rust加密字符串以及Rust/C++互调,这里仅介绍后者。
  为什么笔者喜欢折腾呢,就是因为之前讨论过跨语言开发的优势,之前写了一篇Golanghttps://www.0xaa55.com/thread-27345-1-1.html也是为了增加逆向的复杂性,这次使用Rust语言也是这个目的,因此高级语言的库都比较丰富,可以大幅度增加逆向复杂度。同样的字符串常量,笔者用模板元可以完美实现编译期加密,而使用跨语言间接处理则复杂度更高。

安装Rust

笔者环境仍然是MacOS,使用官方提供的安装命令即可curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

开发

build.rs

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

#[cxx::bridge]
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

[package]
name = "helloworld"
version = "0.1.0"
edition = "2021"

[dependencies]
obfstr = "*"
litcrypt = "*"
cxx = "*"

[build-dependencies]
cxx-build = "*"

[lib]
crate-type = ["staticlib"]

src/rust_bridge.h

#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

cargo build --target aarch64-apple-ios --release

此时将libhelloworld.a/librs.h/librs.cc/cxx.h链接到XCode项目中即可调用cpp_call_rust函数!!!

iOS远程调试Rust

launch.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[0].SetPlatformFileSpec(lldb.SBFileSpec(\"/usr/bin/helloworld\"))"
            ],
            "processCreateCommands": [
                "shell bash deploy.sh",
                "process connect connect://127.0.0.1:111",
                "run"
            ]
        }
    ]
}

deploy.sh

#!/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

<!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>
回复

使用道具 举报

发表于 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++ 进行正经开发和内存管理,这样可以保证对于我而言的开发效率。
回复 赞! 1 靠! 0

使用道具 举报

发表于 2023-9-25 16:25:43 | 显示全部楼层
楼主怎样看待Rust?发展前景大吗?楼主是否喜欢Rust语法?
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 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、任何在我【学习编程之后】诞生的【编程语言】都是违反自然规律要遭天谴的!
回复 赞! 靠!

使用道具 举报

发表于 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了,全部改为其它的“先进语言”,就是我认为“违反自然规律要遭天谴的”那些语言。
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-6-24 12:23 , Processed in 0.037131 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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