Implémentation de la rouille de Lazy_impporter
razy-importer = " 0.3.4 "
razy-importer-macros = " 0.3.3 "Le prototype de fonction doit être explicitement déclaré sur la variable et c'est par conception de la rouille que la rouille ne permet pas d'être utilisée lorsque des informations de type connues sont nécessaires au moment de la compilation.
Étant donné que l'implémentation de la macro ri_fn prend func_type en tant que type Expr , celle-ci est traitée comme une expression résolue au moment de l'exécution. Cependant, les types tels que extern "system" fn() , qui représente un pointeur de fonction, nécessitent des informations de type connues au moment de la compilation. Par conséquent, le type Expr , qui est résolu à l'exécution, ne peut pas être utilisé directement comme un type de fonction.
# [ 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 ( ) } ) ;
} Les caisses razy-importer et razy-importer-macros ont case-sensitive et qui est définie par défaut. Un boîtier de lettre sera ignoré car Windows ne examinera pas si la lettre est ou non en majuscules ou en minuscules.
Dans le cas où vous devez utiliser une vérification stricte sensible à la casse, désactivez la fonctionnalité.
razy-importer = { version = " ... " , default_feature = false }
razy-importer-macros = { version = " ... " , default_feature = false } Les DLL de set API sont prises en charge (telles que SetProcessMitigationPolicy ) puisque >=0.2.0 .
kernel32.dll -> api-ms-win-core-processthreads-l1-1-1.SetProcessMitigationPolicyapi-ms-win-core-processthreads-l1-1-1.dll -> kernel32.SetProcessMitigationPolicyWindows a un concept appelé "ensembles d'API". Introduit à partir de Windows 7, ce concept consiste à regrouper certains ensembles de fonctions (API) et à les «mappage» à des fichiers DLL spécifiques, visant à atteindre l'abstraction de la mise en œuvre et à maintenir la compatibilité.
Les DLL de définition des API (comme api-ms-win-core-processthreads-l1-1-1.dll pour ce cas) ne possèdent pas de fonctions. Ces DLL visent à dire au système d'exploitation quelle DLL implémente une fonction particulière, la fonction réelle résidant dans une autre DLL (dans ce cas, Kernel32.dll).
Cette sortie est générée par IDA 8.3 sans symboles (et sans 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 ();
}Licence - Apache 2.0
Apache 2.0 - Justasmasiulis / Lazy_impporter