日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

ce变速注入dll失败_[LAB]一种无痕Dll模块注入方式

發(fā)布時間:2023/11/27 生活经验 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ce变速注入dll失败_[LAB]一种无痕Dll模块注入方式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

0x00 前言

  • 方式:CreateRemoteThread
  • 需要:visual studio 2015
  • 需要:進程模塊查看器,如【PCHunter】【ProcessHacker】等。
  • 需要:創(chuàng)建一個用于實驗注入的【MFC項目】窗體。
  • 需要:創(chuàng)建一個用于有痕注入的【Dll項目】模塊。
  • 需要:創(chuàng)建一個用于無痕注入的【Dll項目】模塊。

0x01 實驗窗體

  • 在【VS2015】中,創(chuàng)建一個名為【MFC】的【MFC項目】,打開【MFC.rc】的【IDD_MFC_DIALOG】:

  • 然后在【IDD_MFC_DIALOG】放入以下三個【Button】:

  • 彈窗的ID設置為【IDOK】,無痕注入的ID設置為【IDC_BUTTON1】,有痕注入的ID設置為【IDC_BUTTON2】:

  • 在【MFCDlg.cpp】貼入以下代碼:
#include "stdafx.h"
#include "MFC.h"
#include "MFCDlg.h"
#include "afxdialogex.h"
#include <windows.h>#ifdef _DEBUG
#define new DEBUG_NEW
#endif//1.獲取進程句柄
HANDLE GetThePidOfTargetProcess(HWND hwnd)
{DWORD pid;GetWindowThreadProcessId(hwnd, &pid);HANDLE hProcee = ::OpenProcess(PROCESS_ALL_ACCESS | PROCESS_CREATE_THREAD, 0, pid);return hProcee;
}
//2.提升權限
void Up()
{HANDLE hToken;LUID luid;TOKEN_PRIVILEGES tp;OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid);tp.PrivilegeCount = 1;tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;tp.Privileges[0].Luid = luid;AdjustTokenPrivileges(hToken, 0, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
}
//3.進程注入
BOOL DoInjection(char *DllPath, HANDLE hProcess)
{DWORD BufSize = strlen(DllPath) + 1;LPVOID AllocAddr = VirtualAllocEx(hProcess, NULL, BufSize, MEM_COMMIT, PAGE_READWRITE);WriteProcessMemory(hProcess, AllocAddr, DllPath, BufSize, NULL);PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryA");HANDLE hRemoteThread;hRemoteThread = CreateRemoteThread(hProcess, NULL, 0, pfnStartAddr, AllocAddr, 0, NULL);if (hRemoteThread){MessageBox(NULL, TEXT("注入成功"), TEXT("提示"), MB_OK);return true;}else{MessageBox(NULL, TEXT("注入失敗"), TEXT("提示"), MB_OK);return false;}
}class CAboutDlg : public CDialogEx
{
public:CAboutDlg();// 對話框數據
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_ABOUTBOX };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 實現
protected:DECLARE_MESSAGE_MAP()
};CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()CMFCDlg::CMFCDlg(CWnd* pParent /*=NULL*/): CDialogEx(IDD_MFC_DIALOG, pParent)
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CMFCDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CMFCDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDOK, &CMFCDlg::OnBnClickedOk)ON_BN_CLICKED(IDC_BUTTON1, &CMFCDlg::OnBnClickedButton1)ON_BN_CLICKED(IDCANCEL, &CMFCDlg::OnBnClickedCancel)ON_BN_CLICKED(IDC_BUTTON2, &CMFCDlg::OnBnClickedButton2)
END_MESSAGE_MAP()BOOL CMFCDlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 將“關于...”菜單項添加到系統菜單中。// IDM_ABOUTBOX 必須在系統命令范圍內。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 設置此對話框的圖標。  當應用程序主窗口不是對話框時,框架將自動//  執(zhí)行此操作SetIcon(m_hIcon, TRUE);			// 設置大圖標SetIcon(m_hIcon, FALSE);		// 設置小圖標// TODO: 在此添加額外的初始化代碼return TRUE;  // 除非將焦點設置到控件,否則返回 TRUE
}void CMFCDlg::OnSysCommand(UINT nID, LPARAM lParam)
{if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}
}void CMFCDlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // 用于繪制的設備上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使圖標在工作區(qū)矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 繪制圖標dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}
}HCURSOR CMFCDlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}void CMFCDlg::OnBnClickedOk()
{//MessageBox(_T("你好,世界!!!"), _T("提示:"), MB_OK);
}void CMFCDlg::OnBnClickedButton1()//無痕
{//HWND hwnd = FindWindowExA(NULL, NULL, NULL, "MFC");//Up();//HANDLE hP = GetThePidOfTargetProcess(hwnd);//DoInjection("C:UsersHHZDesktopHideDllReleaseHideDll.dll", hP);
}void CMFCDlg::OnBnClickedButton2()//有痕
{//HWND hwnd = FindWindowExA(NULL, NULL, NULL, "MFC");//Up();//HANDLE hP = GetThePidOfTargetProcess(hwnd);//DoInjection("C:UsersHHZDesktopShowDllReleaseShowDll.dll", hP);
}void CMFCDlg::OnBnClickedCancel()
{// TODO: 在此添加控件通知處理程序代碼CDialogEx::OnCancel();
}
  • 在【MFCDlg.cpp】中,重點是三個跟進程注入有關的函數:
  • 1.獲取進程句柄【HANDLE GetThePidOfTargetProcess(HWND hwnd)】
  • 2.提升權限【void Up()】
  • 3.進程注入【BOOL DoInjection(char *DllPath, HANDLE hProcess)】

  • 然后選擇【Release】以及【x86】,然后運行:

  • 現在【實驗窗體】創(chuàng)建完畢:

0x02 有痕注入

  • 在【VS2015】中,創(chuàng)建一個名為【ShowDll】的【Win32項目】,詳細界面選擇【Dll】:

  • 打開【dllmain.cpp】:

  • 在【dllmain.cpp】內貼入以下代碼:
/***************************************************************************************************************************/
//
#include "stdafx.h"
//
DWORD oldProtect;
BYTE  JmpBtye[5];
DWORD oldAddr;
DWORD WINAPI HookMessageBox(LPVOID notUse);
void UnHook();
//
using pMessageBoxW = int (WINAPI*)(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);
pMessageBoxW ToMessageBox;
//或
//typedef int (WINAPI *pMessageBoxW)(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);
//pMessageBoxW ToMessageBox;
/***************************************************************************************************************************//***************************************************************************************************************************/
BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{//switch (ul_reason_for_call){case DLL_PROCESS_ATTACH://HookMessageBox(NULL);//break;case DLL_PROCESS_DETACH://UnHook();//break;}//return TRUE;
}int WINAPI MyMessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)
{//lpText = L"有痕Hook成功!!!";//return ToMessageBox(hWnd, lpText, lpCaption, uType);
}DWORD WINAPI HookMessageBox(LPVOID notUse)
{//HMODULE hModule = LoadLibraryA("user32.dll");DWORD   mAddr = (DWORD)GetProcAddress(hModule, "MessageBoxW");ToMessageBox = (pMessageBoxW)(mAddr + 2);oldAddr = mAddr;//DWORD addr = mAddr - 5;VirtualProtect((void *)addr, 15, PAGE_EXECUTE_READWRITE, &oldProtect);JmpBtye[0] = 0xE9;//*(DWORD *)&JmpBtye[1] = (DWORD)((long long)MyMessageBoxW - (long long)addr - 5);memcpy((void *)addr, JmpBtye, 5);//__asm{mov bx, 0xF9EBmov eax, mAddrmov[eax], bx}
}void UnHook()
{__asm{mov bx, 0xFF8Bmov eax, oldAddrmov[eax], bx}
}
/***************************************************************************************************************************/
  • 簡單講解一下代碼邏輯:
  • 首先,當【ShowDll.dll】模塊被注入到【某進程】中,【某進程】將自動調用其【DllMain】接口函數。
  • 其次,【DllMain】的第二個形參【ul_reason_for_call】,【某進程】傳參為【DLL_PROCESS_ATTACH】,觸發(fā)【HookMessageBox(NULL)】。
  • 然后,【HookMessageBox(NULL)】將【MessageBox】首地址指向我們自定義的【MyMessageBoxW】從而Hook【MessageBox】。
  • 最后,在【MyMessageBoxW】中,我們將本來要傳給【MessageBox】的【lpText】篡改成【“有痕Hook成功!!!”】,之后再通過【ToMessageBox(hWnd, lpText, lpCaption, uType)】傳給了真正的【MessageBox】,這樣就達成了一次完整的Hook。
  • 當要卸載【ShowDll.dll】時,進程則調用此Dll的【DllMain】,且第二個形參【ul_reason_for_call】傳參為【DLL_PROCESS_DETACH】,則可觸發(fā)【UnHook()】,恢復【MessageBox】的首地址。
  • 接下來選擇【Release】以及【x86】,然后生成【ShowDll.dll】:

  • 現在,在【MFC項目】的【MFCDlg.cpp】中設置好【ShowDll.dll】的路徑,然后運行【MFC】:

  • 在【MFC】窗口中點擊【彈窗】:

  • 然后再點擊【有痕注入】,顯示【注入成功】:

  • 再次點擊【彈窗】,則顯示在【ShowDll項目】中的【dllmain.cpp】的第40行設置好的【“有痕Hook成功!!!”】:

  • 然后我們使用【進程模塊查看器】,這里使用【ProcessHacker】可以查看到【ShowDll.dll】模塊:

  • 這就是【注入模塊】可被遍歷到的【有痕注入】。

0x03 無痕注入

  • 0x02一樣,在【VS2015】中,創(chuàng)建一個名為【HideDll】的【Win32項目】,然后在【dllmain.cpp】內貼入以下代碼:
/***************************************************************************************************************************/
//
#include "stdafx.h"
//
DWORD oldProtect;
BYTE  JmpBtye[5];
DWORD oldAddr;
DWORD HideModule(HMODULE hModule);
DWORD WINAPI HookMessageBox(LPVOID notUse);
//
using pMessageBoxW = int (WINAPI*)(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);
pMessageBoxW ToMessageBox;
/***************************************************************************************************************************/
BOOL APIENTRY DllMain(HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{//switch (ul_reason_for_call){case DLL_PROCESS_ATTACH://DWORD newModule = HideModule(hModule);//if (newModule){LPTHREAD_START_ROUTINE  hook = (LPTHREAD_START_ROUTINE)(newModule + ((DWORD)HookMessageBox - (DWORD)hModule));hook(NULL);//CreateThread(0, 0, hook, 0, 0, 0);}//break;}//return FALSE;
}DWORD HideModule(HMODULE hModule)
{//PIMAGE_DOS_HEADER  pDos = (PIMAGE_DOS_HEADER)hModule;//DOS 頭PIMAGE_NT_HEADERS  pNt = (PIMAGE_NT_HEADERS)((DWORD)hModule + pDos->e_lfanew);//NT 頭//PBYTE mem = (PBYTE)VirtualAlloc(0, pNt->OptionalHeader.SizeOfImage, MEM_COMMIT, PAGE_EXECUTE_READWRITE);if (NULL == mem){//MessageBox(NULL, TEXT("申請空間失敗。"), NULL, MB_ICONINFORMATION | MB_YESNO);//return NULL;}//memcpy(mem, (void *)hModule, pNt->OptionalHeader.SizeOfImage);//PIMAGE_BASE_RELOCATION  rBase = (PIMAGE_BASE_RELOCATION)((DWORD)mem + pNt->OptionalHeader.DataDirectory[5].VirtualAddress);DWORD n = 0;DWORD Base = (DWORD)mem;DWORD offset = (DWORD)mem - (DWORD)hModule;if (offset == 0)(DWORD)mem;//typedef struct RELOCATIONITEM{WORD value : 12;WORD attr : 4;} *PRELOCATIONITEM;//PRELOCATIONITEM   rItem;DWORD *item;//while (true){if (rBase->SizeOfBlock == 0)break;rItem = (PRELOCATIONITEM)((PBYTE)rBase + 8);n = (rBase->SizeOfBlock - 8) / 2;for (int i = 0; i < (int)n; ++i){if (3 == rItem[i].attr){item = (DWORD *)(Base + rBase->VirtualAddress + rItem[i].value);*item = (*item + offset);}}rBase = (PIMAGE_BASE_RELOCATION)((PBYTE)rBase + rBase->SizeOfBlock);}//return (DWORD)mem;
}int WINAPI MyMessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)
{//lpText = L" 無痕Hook成功!!!";//return ToMessageBox(hWnd, lpText, lpCaption, uType);
}DWORD WINAPI HookMessageBox(LPVOID notUse)
{//HMODULE hModule = LoadLibraryA("user32.dll");DWORD   mAddr = (DWORD)GetProcAddress(hModule, "MessageBoxW");ToMessageBox = (pMessageBoxW)(mAddr + 2);oldAddr = mAddr;//DWORD addr = mAddr - 5;VirtualProtect((void *)addr, 15, PAGE_EXECUTE_READWRITE, &oldProtect);JmpBtye[0] = 0xE9;//*(DWORD *)&JmpBtye[1] = (DWORD)((long long)MyMessageBoxW - (long long)addr - 5);memcpy((void *)addr, JmpBtye, 5);//__asm{mov bx, 0xF9EBmov eax, mAddrmov[eax], bx}
}void UnHook()
{__asm{mov bx, 0xFF8Bmov eax, oldAddrmov[eax], bx}
}
  • 簡單講解一下代碼邏輯:
  • 大體與【有痕注入】一樣,不同點在于當【某進程】傳入【DLL_PROCESS_ATTACH】時,【HideModule(hModule)】將【HideDll.dll】拷貝到了新開辟的內存空間,然后通過【(LPTHREAD_START_ROUTINE)(newModule + ((DWORD)HookMessageBox - (DWORD)hModule))】計算出在新位置的【HideDll.dll】的【HookMessageBox】的首地址,將這個首地址存儲在【hook】這個指針里,然后通過【hook(NULL)】調用新位置的【HookMessageBox】。
  • 最后【break】出【switch】后,再【return FALSE】,【DllMain】返回【FALSE】會導致剛剛注入到【某進程】的【HideDll.dll】被卸載,而被拷貝到了新開辟的內存空間的【HideDll.dll】則悄咪咪的運行了起來,此時再通過【進程模塊查看器】查看,發(fā)現以及沒有了【HideDll.dll】的蹤跡,此為【無痕注入】。
  • 接下來選擇【Release】以及【x86】,然后生成【HideDll.dll】,之后在【MFC項目】的【MFCDlg.cpp】中設置好【HideDll.dll】的路徑,然后運行【MFC】:

  • 在【MFC】窗口中點擊【彈窗】:

  • 然后再點擊【無痕注入】,顯示【注入成功】:

  • 再次點擊【彈窗】,則顯示在【HideDll項目】中的【dllmain.cpp】的第95行設置好的【“無痕Hook成功!!!”】:

  • 然后我們使用【進程模塊查看器】,這里使用【ProcessHacker】查找是否有【HideDll.dll】模塊:

advapi32.dll
bcryptprimitives.dll
cfgmgr32.dll
combase.dll
comctl32.dll
CoreMessaging.dll
CoreUIComponents.dll
crypt32.dll
cryptbase.dll
cryptsp.dll
dwmapi.dll
gdi32.dll
gdi32full.dll
imm32.dll
kernel.appcore.dll
kernel32.dll
KernelBase.dll
locale.nls
MFC.exe
mfc140chs.dll
mfc140u.dll
msasn1.dll
msctf.dll
msvcp_win.dll
msvcrt.dll
ntdll.dll
ntdll.dll
ntmarta.dll
ole32.dll
oleaut32.dll
powrprof.dll
profapi.dll
rpcrt4.dll
sechost.dll
SHCore.dll
shell32.dll
shlwapi.dll
SortDefault.nls
sspicli.dll
StaticCache.dat
TextInputFramework.dll
ucrtbase.dll
user32.dll
user32.dll.mui
uxtheme.dll
vcruntime140.dll
win32u.dll
windows.storage.dll
WinTypes.dll
wow64.dll
wow64cpu.dll
wow64win.dll
  • 經過查找,并沒有發(fā)現【HideDll.dll】模塊,【無痕注入】成功。

  • 如有謬誤,歡迎指教。

總結

以上是生活随笔為你收集整理的ce变速注入dll失败_[LAB]一种无痕Dll模块注入方式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。