Tauri
在nix上开发tauri
最好使用direnv
{
description = "Tauri Dev Shell";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
rust-overlay.url = "github:oxalica/rust-overlay";
flake-utils.url = "github:numtide/flake-utils";
};
outputs =
{
nixpkgs,
rust-overlay,
flake-utils,
...
}:
flake-utils.lib.eachDefaultSystem (
system:
let
overlays = [ (import rust-overlay) ];
pkgs = import nixpkgs {
inherit system overlays;
};
in
{
devShells.default =
with pkgs;
mkShell {
nativeBuildInputs = [
pkg-config
clang_20
libllvm
gobject-introspection
cargo
(rust-bin.beta.latest.default.override {
extensions = [
"rust-src"
"rust-analyzer"
"clippy"
];
targets = [ "x86_64-pc-windows-msvc" ];
})
cargo-xwin
rustup
cargo-tauri
nodejs
];
buildInputs = [
at-spi2-atk
atkmm
cairo
gdk-pixbuf
glib
gtk3
harfbuzz
librsvg
libsoup_3
pango
webkitgtk_4_1
openssl
];
};
}
);
}
接下来安装create-tauri-app
cargo install create-tauri-app --locked
cargo create-tauri-app
创建项目
# cargo create-tauri-app
✔ Project name · my-tauri
✔ Identifier · fun.colorsky.tauri
✔ Choose which language to use for your frontend · Rust - (cargo)
✔ Choose your UI template · Vanilla
Template created! To get started run:
cd my-tauri
cargo tauri android init
For Desktop development, run:
cargo tauri dev
For Android development, run:
cargo tauri android dev
项目文件就在 ./my-tauri 了
大致长这样
my-tauri
├── README.md
├── src
│ ├── assets/
│ ├── index.html
│ ├── main.js
│ └── styles.css
└── src-tauri
├── build.rs
├── capabilities/
├── Cargo.toml
├── gen/
├── icons/
├── src
│ ├── lib.rs
│ └── main.rs
└── tauri.conf.json
src目录下是前端代码, src-tauri则是放了后端代码
为Windows编译二进制文件
cargo xwin build --release --target x86_64-pc-windows-msvc
tauri的逆向
我大致分为2部分, 一部分是前端逆向, 关键在于提取前端的资源文件, tauri会用brotli将前端资源全部压缩, debug时压缩等级为2, release为9, 这些可以在tauri对资源打包的源代码找到, 另外就是后端部分的逆向
前端部分
目前有一个项目 tauri-dumper 可以把 windows 和 macos 平台tauri应用的前端资源直接dump出来, 对于其他平台还需要手动dump, 可以参考此文章
后端部分
当前端的某个函数长这样的时候
就说明前端调用了使用rust编写的后端函数
generate_handler!宏会将#[tauri::command]派生的代码进行再次编程, 展开后得到这样的代码
default
.plugin
.invoke_handler
下面这段代码最为重要
match from_command ,
在编译为二进制后, 可以在ida里搜索some_command从而定位这段代码的位置
*&v20 = 0;
*v20 = aSomeCommand; // some_command
*&v20 = 12;
*&v20 = aName_0; // name
*&v20 = 4;
*&v20 = v18;
*&v20 = &v30;
v33 = 1;
;
接下来关注v20这个变量, 这样就可以定位到some_command这个函数具体的实现.
; // "ColorSkyFun"
;
v10 = ;
if
;
*v10 = ;
* = 0x895DC03718906F57uLL;
* = 88923259;
if
sub_7FF63300D380就是crypt函数, v10就是密文