dll共享節技術可以讓使用同乙個dll的多個程序共享一塊記憶體(共享節),下面我通過乙個專案來演示使用方法。
首先準備乙個受害者程式,我選用了xp的掃雷,您也可以用任意喜歡的程式。
然後,編寫dll,dll中需要設定共享節,然後在本專案中,dll被注入到掃雷程序,然後迴圈列印共享節中的資料,這個資料可以被控制程式修改。
下面是dll**,g_buffer就是共享節的資料。
// dllmain.cpp : 定義 dll 應用程式的入口點。
#include "framework.h"
#pragma data_seg("shared")
char g_buffer[0x1000] = ;
#pragma data_seg()
#pragma comment(linker,"/section:shared,rws")
extern "c" __declspec(dllexport) void setdata(char *buf, dword dwdatalen)
extern "c" __declspec(dllexport) void getdata(char *buf)
bool apientry dllmain( hmodule hmodule,
dword ul_reason_for_call,
lpvoid lpreserved
); getmodulefilenamea(null, szmodule, max_path);
if (strstr(szmodule, "winmine") != null)
}break;
}case dll_thread_attach:
case dll_thread_detach:
case dll_process_detach:
break;
}return true;
}
然後是控制端**,就是不停的修改共享節的資料而已。。
#define _crt_secure_no_warnings
#include #include bool injectdll();
bool enabledebugprivilege();
int main()
else
hmodule hmodule = loadlibrarya("dllsharesection-dll.dll");
if (hmodule == null)
typedef void (*pfnsetdata)(char *, dword);
typedef void (*pfngetdata)(char *);
pfnsetdata pfnsetdata = (pfnsetdata)getprocaddress(hmodule, "setdata");
pfngetdata pfngetdata = (pfngetdata)getprocaddress(hmodule, "getdata");
char szbuffer[0x1000];
while (1)
return 0;
}// 遠端執行緒注入
bool injectdll()
dword dwpid = -1;
getwindowthreadprocessid(hwnd, &dwpid);
handle hprocess = openprocess(process_all_access, false, dwpid);
if (hprocess == invalid_handle_value)
// 在要注入的程序中申請一塊記憶體,作為loadlibrary的引數
char szdllname[max_path] = "dllsharesection-dll.dll";
lpvoid paddress = virtualallocex(hprocess, null, max_path, mem_commit | mem_reserve, page_readwrite);
writeprocessmemory(hprocess, paddress, szdllname, strlen(szdllname), null);
// 建立遠端執行緒,執行緒入口設定為loadlibrary,這樣就可以自動載入dll
handle hthread = createremotethread(hprocess, null, 0, (lpthread_start_routine)loadlibrarya, paddress, 0, null);
//virtualfreeex(hprocess, paddress, 0, mem_release);
closehandle(hprocess);
return true;
}// 提權函式:提公升為debug許可權
bool enabledebugprivilege()
return fok;
}
注意要把掃雷,控制端程式和dll放在相同目錄下執行
先啟動掃雷,在啟動控制程式。
在控制台輸入資料,修改共享節的緩衝區內容,對話方塊列印的內容就會變。
程序間通訊 共享記憶體
下面是自己寫的乙個簡單的共享記憶體的程序間通訊的例子。共享記憶體是用於程序間大量資料共享的一種方法。include include include include include include int main if buf1 shmat shmid,0,0 void 1 strcpy buf1,...
程序間通訊 共享記憶體
共享記憶體是被多個程序共享的一部分物理記憶體。共享記憶體是程序間共享資料的一種最快的方式,乙個程序向共享記憶體區域寫入資料,共享這個記憶體區域的所有程序就可以立刻看到其中的內容。共享記憶體實現分兩個步驟 建立共享記憶體,使用shmget函式 對映共享記憶體,使用shmat函式 共享記憶體是一種最為高...
程序間通訊 共享記憶體
共享記憶體允許兩個或更多程序共享一塊給定的儲存區,因為資料不需要在不同程序之間訪問,這是最快的一種ipc 傳輸資訊量很大,通過記憶體空間對映程序空間實現,若伺服器程序正在將資料放入共享儲存區,則在它做完這一操作之前,客戶程序不應取這些資料,通常訊號量用來實現對共享儲存訪問的同步。核心為每個共享儲存段...