x32下的DLL隱藏

2022-03-20 19:35:33 字數 4154 閱讀 2411

原理主要就是peb 中模組斷鏈. 這裡整理下**.原理可以看下另一篇我寫的帖子.

// dllmain.cpp : 定義 dll 應用程式的入口點。

#include "stdafx.h"

#include #include typedef struct _unicode_string unicode_string;

typedef unicode_string *punicode_string;

typedef const unicode_string *pcunicode_string;

/*dll 劫持的實現

1.首先我們載入我們想要劫持的dll. 獲取其dllmodule

2.遍歷peb中的模組表.找到->dllbae,修改為我們劫持dll的hmodule即可.

*/#define ldrp_static_link 0x00000002

#define ldrp_image_dll 0x00000004

#define ldrp_load_in_progress 0x00001000

#define ldrp_unload_in_progress 0x00002000

#define ldrp_entry_processed 0x00004000

#define ldrp_entry_inserted 0x00008000

#define ldrp_current_load 0x00010000

#define ldrp_failed_builtin_load 0x00020000

#define ldrp_dont_call_for_threads 0x00040000

#define ldrp_process_attach_called 0x00080000

#define ldrp_debug_symbols_loaded 0x00100000

#define ldrp_image_not_at_base 0x00200000

#define ldrp_cor_image 0x00400000

#define ldr_cor_owns_unmap 0x00800000

#define ldrp_image_verifying 0x02000000

#define ldrp_driver_dependent_dll 0x04000000

#define ldrp_entry_native 0x08000000

#define ldrp_redirected 0x10000000

#define ldrp_non_paged_debug_info 0x20000000

#define ldrp_mm_loaded 0x40000000

#define ldrp_compat_database_processed 0x80000000

typedef struct _ldr_data_table_entry

; ulong checksum;

union

;pvoid entrypointactivationcontext;

pvoid patchinformation;

} ldr_data_table_entry, *pldr_data_table_entry;

typedef struct _peb_ldr_data peb_ldr_data, *ppeb_ldr_data;

typedef struct _ldr_module ldr_module, *pldr_module;

void preprocessunloaddll(hmodule hlibmodule)

firstmodule = (pldr_module)(pldr->inloadordermodulelist.flink);

gurrentmodule = firstmodule;

while (!(gurrentmodule->baseaddress == hlibmodule))}//

// 設定 ldrp_process_attach_called

//gurrentmodule->flags |= ldrp_process_attach_called;

//// 設定

//int oldloadcount = gurrentmodule->loadcount;

gurrentmodule->loadcount = 1;

return;

}__except (exception_execute_handler)

}void hidemodule(hmodule hlibmodule)

firstmodule = (pldr_module)(pldr->inloadordermodulelist.flink);

gurrentmodule = firstmodule;

while (!(gurrentmodule->baseaddress == hlibmodule)) //判斷結束位置

if (gurrentmodule->baseaddress != hlibmodule)

return;

//// dll解除鏈結

//((pldr_module)(gurrentmodule->inloadordermodulelist.flink))->inloadordermodulelist.blink = gurrentmodule->inloadordermodulelist.blink;

((pldr_module)(gurrentmodule->inloadordermodulelist.blink))->inloadordermodulelist.flink = gurrentmodule->inloadordermodulelist.flink;

memset(gurrentmodule->fulldllname.buffer, 0, gurrentmodule->fulldllname.length);

memset(gurrentmodule, 0, sizeof(pldr_module));

pimage_dos_header dosheader = (pimage_dos_header)hlibmodule;

pimage_nt_headers ntheaders = (pimage_nt_headers)(lpbyte(hlibmodule) + dosheader->e_lfanew);

if ((dosheader->e_magic == image_dos_signature) && (ntheaders->signature == image_nt_signature))

}__except (exception_execute_handler)

}bool apientry dllmain(hmodule hmodule,

dword ul_reason_for_call,

lpvoid lpreserved

) return true;

}

檢測:

memory_basic_information mbi_thunk;

pvoid allocationbase = null;

tchar filepath[max_path];

for (lpstr addr = (lpstr)0x00000000; ::virtualqueryex(hprocess, addr, &mbi_thunk, sizeof(mbi_thunk)); addr = lpstr(mbi_thunk.baseaddress) + mbi_thunk.regionsize)

}

discuz登入流程解析 版本X3 2

discuz登入流程解析,最近在研究,ucenter的同步登陸機制,就先從discuz的登入開始了 1.form表單提交 member.php?mod logging action login loginsubmit yes handlekey login loginhash lm137 inaja...

OD 與X32 的條件記錄斷點的使用和對比

一 應用場景 我們在逆向分析的過程中,往往碰到一些需要列印記憶體資料的情況,特別是分析物件將資料寫在 裡面的時候,少量有規律的資料可以通過條件記錄斷點來進行列印。二 od的條件記錄斷點 下斷點後,右鍵選擇條件斷點,彈出條件記錄的設定框框,相關選項如下 條件 為空就行了 說明 不用填 表示式記錄描述 ...

如何隱藏DLL的匯出函式

估計有時你不想暴露所有的匯出函式,匯出乙個類有時候更是不安全的。以下這樣做是否可以?dll中定義乙個基類 class iinte ce 匯出類從這個基類派生 driver.h class cdriver public iinte ce driver.cpp void cdriver dfun1 vo...