lazy_importer
1.0.0
ห้องสมุดส่วนหัวที่เรียบง่ายและใช้งานง่ายเท่านั้นเพื่อให้ชีวิตของวิศวกรย้อนกลับยากขึ้นมาก
LI_FN (OutputDebugStringA)( " hello world " );
LI_FN (VirtualProtect).in(LI_MODULE( " kernel32.dll " ).cached());เอาต์พุต IDA เมื่อรวบรวมบรรทัดแรก
LI_FN(function_pointer) -> lazy_functionLI_FN_DEF(function_type) -> lazy_functionLI_MODULE(module_name) -> lazy_modulesafe บ่งชี้ว่าเมื่อฟังก์ชั่นไม่สามารถทำงานให้สำเร็จได้สำเร็จ 0 จะถูกส่งคืนแทนที่จะแสดงพฤติกรรมที่ไม่ได้กำหนดcached ระบุว่าผลลัพธ์จะถูกคำนวณเฉพาะในระหว่างการโทรครั้งแรกและนำกลับมาใช้ใหม่ในภายหลังforwarded ระบุว่าการส่งออกการส่งออกจะได้รับการแก้ไขอย่างถูกต้อง lazy_module| การทำงาน | ปลอดภัย | แคช | |
|---|---|---|---|
| พยายามค้นหาโมดูลที่กำหนดและส่งกลับที่อยู่ | |||
get<T = void*>() -> T | |||
safe<T = void*>() -> T | |||
cached<T = void*>() -> T | |||
safe_cached<T = void*>() -> T | |||
| attemps เพื่อค้นหาโมดูลที่กำหนดโดยใช้ตัวชี้ LDR_DATA_TABLE_ENTRY ที่กำหนด | |||
in<T = void*, Ldr>(Ldr ldr_entry) -> T | |||
in_cached<T = void*, Ldr>(Ldr ldr_entry) -> T | |||
lazy_function<F>| การทำงาน | ปลอดภัย | แคช | ที่ได้ถูกส่งต่อ |
|---|---|---|---|
| การโทรส่งออกที่ได้รับการแก้ไขโดยใช้อาร์กิวเมนต์ที่กำหนด | |||
operator()(...) -> result_of<F, ...> | |||
| พยายามแก้ไขการส่งออกในโมดูลที่โหลดทั้งหมดและส่งคืนที่อยู่ฟังก์ชัน | |||
get<T = F>() -> T | |||
safe<T = F>() -> T | |||
cached<T = F>() -> T | |||
safe_cached<T = F>() -> T | |||
forwarded<T = F>() -> T | |||
forwarded_safe<T = F>() -> T | |||
forwarded_cached<T = F>() -> T | |||
forwarded_safe_cached<T = F>() -> T | |||
| พยายามแก้ไขการส่งออกในโมดูลที่กำหนดและส่งคืนที่อยู่ฟังก์ชัน | |||
in<T = F, A>(A module_address) -> T | |||
in_safe<T = F, A>(A module_address) -> T | |||
in_cached<T = F, A>(A module_address) -> T | |||
in_safe_cached<T = F, A>(A module_address) -> T | |||
พยายามแก้ไขการส่งออกใน ntdll และส่งคืนที่อยู่ฟังก์ชัน | |||
nt<T = F>() -> T | |||
nt_safe<T = F>() -> T | |||
nt_cached<T = F>() -> T | |||
nt_safe_cached<T = F>() -> T | |||
#define | ผล |
|---|---|
LAZY_IMPORTER_NO_FORCEINLINE | ปิดใช้งานการบังคับ |
LAZY_IMPORTER_CASE_INSENSITIVE | เปิดใช้งานการเปรียบเทียบกรณีที่ไม่รู้สึก อาจจำเป็นสำหรับการแก้ไขปัญหาการส่งออกที่ส่งต่อ |
LAZY_IMPORTER_CACHE_OPERATOR_PARENS | ใช้ cached() แทน get() ใน operator() ของ lazy_function |
LAZY_IMPORTER_RESOLVE_FORWARDED_EXPORTS | ใช้ forwarded() ใน get() คำเตือนใช้ไม่ได้กับ nt() และ in() |
LAZY_IMPORTER_HARDENED_MODULE_CHECKS | เพิ่มการตรวจสอบสติเพิ่มเติมให้กับการแจงนับโมดูล |
LAZY_IMPORTER_NO_CPP_FORWARD | ลบการพึ่งพาส่วนหัว <utility> C ++ |
for ( i = * ( _QWORD * * )( * ( _QWORD * )( __readgsqword ( 0x60u ) + 24 ) + 16 i64 ); ; i = ( _QWORD * ) * i )
{
v1 = i [ 6 ];
v2 = * ( unsigned int * )( * ( signed int * )( v1 + 60 ) + v1 + 136 );
v3 = ( _DWORD * )( v2 + v1 );
if ( v2 + v1 != v1 )
{
LODWORD ( v4 ) = v3 [ 6 ];
if ( ( _DWORD ) v4 )
break ;
}
LABEL_8:
;
}
while ( 1 )
{
v4 = ( unsigned int )( v4 - 1 );
v5 = -2128831035 ;
v6 = ( char * )( v1 + * ( unsigned int * )(( unsigned int ) v3 [ 8 ] + 4 * v4 + v1 ));
v7 = * v6 ;
v8 = ( signed __int64 )( v6 + 1 );
if ( v7 )
{
do
{
++ v8 ;
v5 = 16777619 * ( v5 ^ v7 );
v7 = * ( _BYTE * )( v8 - 1 );
}
while ( v7 );
if ( v5 == -973690651 )
break ;
}
if ( !( _DWORD ) v4 )
goto LABEL_8;
}
(( void (__fastcall * )( const char * ))( v1
+ * ( unsigned int * )( v1
+ ( unsigned int ) v3 [ 7 ]
+ 4 i64 * * ( unsigned __int16 * )( v1 + ( unsigned int ) v3 [ 9 ] + 2 * v4 ))))( "hello world" );ฉันขอขอบคุณผู้คนที่ติดต่อฉันและบริจาคเงินเพื่อสนับสนุนฉันและโครงการของฉัน