程序間通訊 DLL共享節

2021-10-24 11:26:40 字數 2855 閱讀 2584

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 傳輸資訊量很大,通過記憶體空間對映程序空間實現,若伺服器程序正在將資料放入共享儲存區,則在它做完這一操作之前,客戶程序不應取這些資料,通常訊號量用來實現對共享儲存訪問的同步。核心為每個共享儲存段...