原理主要就是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...