12 个版本
0.3.4 | 2023年8月3日 |
---|---|
0.3.3 | 2023年8月2日 |
0.2.0 | 2023年7月31日 |
0.1.5 | 2023年7月30日 |
5 在 #obfuscation 中排名
每月下载量 399
被 2 crates 使用
32KB
499 行代码(不含注释)
razy_importer
Rust 实现的 lazy_importer
用法
razy-importer = "0.3.4"
razy-importer-macros = "0.3.3"
必须在变量上显式声明函数原型,这是 Rust 设计的一部分,因为 Rust 不允许在编译时需要已知类型信息的地方使用常量。
由于 ri_fn
宏的实现将 func_type
作为 Expr
类型,这被当作一个在运行时解析的表达式。然而,像 extern "system" fn()
这样的类型,它代表一个函数指针,需要在编译时知道类型信息。因此,在运行时解析的类型 Expr
不能直接用作这种函数类型。
#[macro_use]
extern crate razy_importer_macros;
fn main() {
let NtGetCurrentProcessorNumber: unsafe extern "system" fn() -> ULONG =
ri_fn_m!("NtGetCurrentProcessorNumber", ri_mod!("ntdll.dll"));
println!("NtGetCurrentProcessorNumber={}", unsafe { NtGetCurrentProcessorNumber() });
let NtGetCurrentProcessorNumber: unsafe extern "system" fn() -> ULONG =
ri_fn!("NtGetCurrentProcessorNumber");
println!("NtGetCurrentProcessorNumber={}", unsafe { NtGetCurrentProcessorNumber() });
}
大小写敏感性
crates razy-importer
和 razy-importer-macros
具有大小写敏感性,并且默认设置为启用。由于 Windows 不考虑字母是大写还是小写,因此将忽略字母大小写。
如果您需要使用严格的大小写敏感性检查,请禁用此功能。
razy-importer = { version = "...", default_feature = false }
razy-importer-macros = { version = "...", default_feature = false }
支持 API Set DLLs
自 >=0.2.0
以来,支持 API Set DLLs(如 SetProcessMitigationPolicy
)。
- 关系:
kernel32.dll
->api-ms-win-core-processthreads-l1-1-1.SetProcessMitigationPolicy
- 关系:
api-ms-win-core-processthreads-l1-1-1.dll
->kernel32.SetProcessMitigationPolicy
Windows 有一个称为 "API Sets" 的概念。从 Windows 7 开始引入,这个概念是将某些函数集(API)分组并 "映射" 到特定的 DLL 文件,旨在实现实现的抽象和兼容性维护。
API 集合 DLL(如 api-ms-win-core-processthreads-l1-1-1.dll
用于此情况)实际上并不包含任何函数。这些 DLL 的作用是告诉操作系统哪个 DLL 实现了特定的功能,实际的功能函数位于另一个 DLL 中(在这个例子中,是 kernel32.dll)。
转换输出
此输出由 IDA 8.3 生成,没有符号(并且没有 gooMBA)。
#[inline(never)]
#[no_mangle]
#[export_name = "nt"]
fn nt() -> u32 {
let NtGetCurrentProcessorNumber: unsafe extern "system" fn() -> ULONG =
ri_fn!("NtGetCurrentProcessorNumber");
return unsafe { NtGetCurrentProcessorNumber() };
}
__int64 nt()
{
PPEB_LDR_DATA Ldr; // rax
struct _LIST_ENTRY *Flink; // r8
struct _LIST_ENTRY *Blink; // rsi
int v3; // r10d
int v4; // r12d
int v5; // r9d
struct _LIST_ENTRY *v6; // rbx
struct _LIST_ENTRY *v7; // rdi
int v8; // eax
struct _LIST_ENTRY *v9; // rcx
unsigned __int8 v10; // r11
struct _LIST_ENTRY *v11; // r15
__int64 Blink_high; // rax
__int64 v13; // r14
__int64 v14; // rdx
unsigned int *v15; // r14
__int64 v16; // rax
__int64 v17; // r13
char *v18; // rbp
__int64 v19; // rcx
__int64 v20; // rax
int v21; // r11d
__int64 v22; // rcx
char v23; // r12
unsigned __int8 v24; // r8
__int64 (*v25)(void); // rdx
unsigned __int8 v26; // cl
char *v27; // rax
char *v28; // rdx
int v29; // ecx
unsigned __int8 v30; // r8
unsigned __int8 v31; // cl
unsigned __int8 v32; // al
unsigned __int8 v33; // cl
unsigned __int8 v34; // r8
unsigned __int8 v35; // al
int v37; // [rsp+4h] [rbp-64h]
struct _LIST_ENTRY *v38; // [rsp+8h] [rbp-60h]
char v39; // [rsp+10h] [rbp-58h]
struct _LIST_ENTRY *v40; // [rsp+20h] [rbp-48h]
Ldr = NtCurrentPeb()->Ldr;
Flink = Ldr->InLoadOrderModuleList.Flink;
Blink = Ldr->InLoadOrderModuleList.Blink;
if ( Flink != Blink )
{
v3 = -42511511;
v39 = 0;
v4 = 0;
v5 = 0;
v38 = Ldr->InLoadOrderModuleList.Blink;
do
{
v6 = Flink[6].Flink;
v7 = (struct _LIST_ENTRY *)((char *)v6 + ((unsigned __int16)(LODWORD(Flink[5].Blink) - 8) & 0xFFFE));
v8 = 218083195;
if ( v6 < v7 )
{
v9 = Flink[6].Flink;
do
{
v10 = LOBYTE(v9->Flink) | 0x20;
if ( (unsigned __int8)(LOBYTE(v9->Flink) - 65) >= 0x1Au )
v10 = (unsigned __int8)v9->Flink;
v8 = 16777619 * (v8 ^ v10);
v9 = (struct _LIST_ENTRY *)((char *)v9 + 2);
}
while ( v9 < v7 );
}
if ( !v5 || v8 == v5 || v8 && v8 != v4 )
{
v11 = Flink[3].Flink;
Blink_high = SHIDWORD(v11[3].Blink);
v13 = *(unsigned int *)((char *)&v11[8].Blink + Blink_high);
if ( *(_DWORD *)((char *)&v11[8].Blink + Blink_high) )
{
v40 = Flink;
v37 = v4;
v14 = *(unsigned int *)((char *)&v11[1].Blink + v13);
v15 = (unsigned int *)((char *)v11 + v13);
v16 = 0i64;
do
{
if ( v16 == v14 )
{
Blink = v38;
v4 = v37;
Flink = v40;
goto LABEL_49;
}
v17 = v16;
v18 = (char *)v11 + *(unsigned int *)((char *)&v11->Flink + 4 * v16 + v15[8]);
v19 = 0i64;
do
v20 = v19++;
while ( v18[v20] );
v21 = 218083195;
if ( v19 != 1 )
{
v22 = 0i64;
do
{
v23 = v18[v22];
if ( !v23 )
break;
v24 = v23 | 0x20;
if ( (unsigned __int8)(v23 - 65) >= 0x1Au )
v24 = v18[v22];
v21 = 16777619 * (v24 ^ v21);
++v22;
}
while ( v20 != v22 );
}
v16 = v17 + 1;
}
while ( v21 != v3 );
v25 = (__int64 (*)(void))((char *)v11
+ *(unsigned int *)((char *)&v11->Flink
+ 4
* *(unsigned __int16 *)((char *)&v11->Flink
+ 2 * (unsigned int)v17
+ v15[9])
+ v15[7]));
v4 = v37;
if ( (v39 & 1) != 0 )
{
Blink = v38;
}
else
{
v4 = 218083195;
Blink = v38;
if ( v6 < v7 )
{
v4 = 218083195;
do
{
v26 = LOBYTE(v6->Flink) | 0x20;
if ( (unsigned __int8)(LOBYTE(v6->Flink) - 65) >= 0x1Au )
v26 = (unsigned __int8)v6->Flink;
v4 = 16777619 * (v4 ^ v26);
v6 = (struct _LIST_ENTRY *)((char *)v6 + 2);
}
while ( v6 < v7 );
}
}
if ( v15 >= (unsigned int *)v25
|| (char *)v15 + *(unsigned int *)((char *)&v11[8].Blink + SHIDWORD(v11[3].Blink) + 4) <= (char *)v25 )
{
return v25();
}
v27 = (char *)v25 + 1;
v28 = (char *)v25 + 2;
v5 = 218083195;
while ( 1 )
{
v29 = (unsigned __int8)*(v27 - 1);
if ( !*(v27 - 1) )
goto LABEL_47;
if ( v29 == 46 )
break;
v30 = v29 - 65;
v31 = v29 | 0x20;
if ( v30 >= 0x1Au )
v31 = *(v27 - 1);
v5 = 16777619 * (v31 ^ v5);
++v27;
++v28;
}
v32 = *v27;
if ( !v32 )
{
LABEL_47:
v3 = 218083195;
goto LABEL_48;
}
v3 = 218083195;
do
{
v33 = v32 - 65;
v34 = v32;
v35 = v32 | 0x20;
if ( v33 >= 0x1Au )
v35 = v34;
v3 = 16777619 * (v3 ^ v35);
v32 = *v28++;
}
while ( v32 );
LABEL_48:
Flink = NtCurrentPeb()->Ldr->InLoadOrderModuleList.Flink;
v39 = 1;
}
}
LABEL_49:
Flink = Flink->Flink;
}
while ( Flink != Blink );
}
v25 = 0i64;
return v25();
}
许可证
贡献
Apache 2.0 - JustasMasiulis/lazy_importer
依赖关系
~0.8–1.2MB
~28K SLoC