Lazy_importer의 녹 구현
razy-importer = " 0.3.4 "
razy-importer-macros = " 0.3.3 "기능 프로토 타입은 변수에 대해 명시 적으로 선언해야하며 이는 Rust Design에 의해 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 ( ) } ) ;
} 상자 razy-importer 와 razy-importer-macros case-sensitive 기본적으로 설정됩니다. Windows가 문자가 대문자인지 소문자인지 여부를 고려하지 않기 때문에 문자 케이스는 무시됩니다.
엄격한 사례에 민감한 점검을 사용해야하는 경우 기능을 비활성화하십시오.
razy-importer = { version = " ... " , default_feature = false }
razy-importer-macros = { version = " ... " , default_feature = false } API Set DLLS는 >=0.2.0 이후로 SetProcessMitigationPolicy 와 같은 지원됩니다.
kernel32.dll > api-ms-win-core-processthreads-l1-1-1.SetProcessMitigationPolicyapi-ms-win-core-processthreads-l1-1-1.dll > kernel32.SetProcessMitigationPolicyWindows에는 "API 세트"라는 개념이 있습니다. Windows 7에서 시작 하여이 개념은 특정 기능 세트 (API)를 그룹화하고 특정 DLL 파일에 "매핑"하는 것입니다. 구현의 추상화를 달성하고 호환성을 유지하기위한 것입니다.
API 세트 DLL (이 경우 api-ms-win-core-processthreads-l1-1-1.dll 과 같은)은 실제로 어떤 기능도 가지고 있지 않습니다. 이 DLL은 DLL이 특정 함수를 구현하는 OS를 알리기위한 것입니다. 실제 함수는 다른 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
Apache 2.0 -JustAsasmasiulis/Lazy_importer