国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

c++注入dll調(diào)用call

這篇具有很好參考價(jià)值的文章主要介紹了c++注入dll調(diào)用call。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1.先寫個(gè)我們要調(diào)用的函數(shù)

#include<iostream>
using?namespace?std;
void?test(int?a,?int&?b)
{
cout?<<?a?<<?b?<<?endl;
b?=?a?+?b;
}

void?main()
{
int?a?=?2;
int?b=0;
test(a,?b);
cout?<<?b?<<?endl;
system("pause");
}

這個(gè)我們寫了一個(gè)很簡單的函數(shù),一個(gè)main函數(shù)和test函數(shù)。我們后面要通過動(dòng)態(tài)注入dll調(diào)用這個(gè)test函數(shù)。

我們先運(yùn)行一下??纯唇Y(jié)果

20
2
請按任意鍵繼續(xù). . .

輸入這個(gè),看了沒有任何問題。

2.寫一個(gè)簡單的dll

?switch?(ul_reason_for_call)
? {
? ?case?DLL_PROCESS_ATTACH: {
? ? ? ?MessageBox(GetForegroundWindow(),?L"測試",?L"成功注入",?1); ? ? ? ? ?
? }
? ? ?
? ?case?DLL_THREAD_ATTACH:
? ?case?DLL_THREAD_DETACH:
? ?case?DLL_PROCESS_DETACH:
? ? ? ?break;
? }

我們在vs2019創(chuàng)建一個(gè)dll文件,在DLL_PROCESS_ATTACH下面加一行語句。

MessageBox(GetForegroundWindow(), L"測試", L"成功注入", 1); ?

這個(gè)是用來測試我們后面注入dll彈出的窗口。

3.寫注入程序

#include<windows.h>
#include"tchar.h"
#include<stdio.h>
int get_id(LPCTSTR name) {
HWND hWnd = FindWindow(NULL,name);
if (hWnd == NULL){//如果無法獲取句柄則報(bào)錯(cuò)
printf("無法獲取窗口句柄,請檢查進(jìn)程是否存在!\n");
system("pause");
return -1;
}

DWORD pro_id;
GetWindowThreadProcessId(hWnd, &pro_id);//獲取進(jìn)程ID ?
if(pro_id == 0){
printf("無法獲取進(jìn)程ID\n");
system("pause");
return 0;
}
printf("進(jìn)程id: %d\n",pro_id);
//打開進(jìn)程對象,并獲取進(jìn)程句柄
/*ANDLE hpro = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ, FALSE, pro_id);
if (hpro == 0){
printf("無法獲取進(jìn)程句柄");
}
printf("進(jìn)程句柄id: %d\n",hpro); */
return (int)pro_id;
}
BOOL InjectDll(LPCTSTR szDllPath, LPCTSTR name)
{
DWORD dwPID = (DWORD)get_id(name);
HANDLE hProcess = NULL, hThread = NULL;
HMODULE hMod = NULL;
LPVOID pRemoteBuf = NULL;
DWORD dwBufSize = (DWORD)(_tcslen(szDllPath) + 1) * sizeof(TCHAR);
LPTHREAD_START_ROUTINE pThreadProc;
//1.使用dwPID獲取目標(biāo)進(jìn)程句柄
if (!(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID))) {
_tprintf(L"OpenProcess(%d) failed!![%d]\n", dwPID, GetLastError());
return FALSE;
}
//2.在目標(biāo)進(jìn)程中分配szDllName大小的內(nèi)存
pRemoteBuf = VirtualAllocEx(hProcess, NULL, dwBufSize , MEM_COMMIT, PAGE_READWRITE);
//3.將myhack.dll路徑寫入分配的內(nèi)存。
WriteProcessMemory(hProcess, pRemoteBuf, (LPVOID)szDllPath, dwBufSize, NULL);
//4.獲取LoadLibrary()API的地址
hMod = GetModuleHandle(L"kernel32.dll");
pThreadProc = (LPTHREAD_START_ROUTINE)GetProcAddress(hMod, "LoadLibraryW");
//5.在notepad中運(yùn)行線程.
hThread = CreateRemoteThread(hProcess, NULL, 0, pThreadProc, pRemoteBuf, 0, NULL);
WaitForSingleObject(hThread, INFINITE);
//CloseHandle(hThread);
//CloseHandle(hProcess);

return TRUE;
}


int _tmain(int argc, TCHAR *argv[])
{
//injectdll
if (InjectDll(argv[1],argv[2]))
_tprintf(L"InjectDll(\"%s\") sucess!!!\n", argv[2]);
//MessageBox(NULL, TEXT("1"), TEXT("warn"), 0);
else
_tprintf(L"InjectDll(\"%s\") failed!!!\n", argv[2]);
//MessageBox(NULL, TEXT("2"), TEXT("warn"), 0);


}

這個(gè)程序的話,我是直接從網(wǎng)上拿的,拿過來改了一點(diǎn),打包成exe,通過命令行進(jìn)行調(diào)用。

4.測試注入

注入.exe 注入dll.dll test.exe

在命令行里面就這樣進(jìn)行調(diào)用。這個(gè)test.exe就是你程序的名字,你可以用vs2019的spy+=進(jìn)行查看,就是你的程序標(biāo)題

c++注入dll調(diào)用call

調(diào)用成功的話,會(huì)自動(dòng)彈出這個(gè)。

5.完善dll程序

我們的目標(biāo)是在dll調(diào)用到test.exe的test函數(shù),這個(gè)dll還沒有達(dá)到我們的目標(biāo),我們還需要繼續(xù)完善。

我們想調(diào)用test函數(shù),就必須知道這個(gè)函數(shù)在內(nèi)存的地址,但是每次重啟電腦,地址都是變化的。我們需要找到基址。這里我們改一下dll,讓他輸出程序的基址

switch (ul_reason_for_call)
? {
? case DLL_PROCESS_ATTACH: {
? ? ? MessageBox(GetForegroundWindow(), L"測試", L"成功注入", 1); ? ? ? ? ?
? ? ? ? HMODULE hModule = GetModuleHandle(NULL);
? ? ? ? ? WCHAR wszhModule[MAX_PATH] = {0};
? ? ? ? ? ? swprintf_s(wszhModule, L"DLL里調(diào)用GetModuleHandle(NULL)獲取到的地址為:0x%x", \
? ? ? ? ? ? ? (DWORD)hModule);
? ? ? ? ? MessageBoxW(0, wszhModule, L"提示", 0);
? }
? ? ?
? case DLL_THREAD_ATTACH:
? case DLL_THREAD_DETACH:
? case DLL_PROCESS_DETACH:
? ? ? break;
? }

我們重新生成,再次注入試試。

c++注入dll調(diào)用call

記住這個(gè)地址,后面我們需要這個(gè)地址。

我們打開x64dbg來進(jìn)行調(diào)試。我們把生成的test.exe進(jìn)行調(diào)試。這個(gè)自己寫的代碼找起來還是比較容易的

007919CF | C745 F4 02000000 ? ? ? ? | mov dword ptr ss:[ebp-C],2 ? ? ? ? ? ? |將2推入棧中
007919D6 | C745 E8 00000000 ? ? ? ? | mov dword ptr ss:[ebp-18],0 ? ? ? ? ? ? |將0推到棧中
007919DD | 8D45 E8 ? ? ? ? ? ? ? ? | lea eax,dword ptr ss:[ebp-18] ? ? ? ? ? |將0的地址放到eax里面
007919E0 | 50 ? ? ? ? ? ? ? ? ? ? ? | push eax ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |將eax推入棧中
007919E1 | 8B4D F4 ? ? ? ? ? ? ? ? | mov ecx,dword ptr ss:[ebp-C] ? ? ? ? ? |將2給ecx
007919E4 | 51 ? ? ? ? ? ? ? ? ? ? ? | push ecx ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |將ecx推入棧中
007919E5 | E8 F2F6FFFF ? ? ? ? ? ? | call test.7910DC ? ? ? ? ? ? ? ? ? ? ? |這個(gè)就是test的call
007919EA | 83C4 08 ? ? ? ? ? ? ? ? | add esp,8 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |還原堆棧

我們可以找到這個(gè)代碼,我們找到call的地址7910dc。和之前的0x780000相減得到偏移0x110DC。有了這個(gè)偏移,我們后面就可以直接調(diào)用這個(gè)call了。

接下來,我們寫一個(gè)函數(shù)

void zhu(DWORD baseaddr) {
? DWORD dwCallAddr = baseaddr + (DWORD)0x110DC;
? printf("%x\n", (int)dwCallAddr);
? int a = 2;
? int& r = a;
? __asm {
? ? ? push r
? ? ? push a
? ? ? call dwCallAddr
? ? ? add esp,8
? }
? printf("%d", r);
}

這個(gè)函數(shù)很簡單,里面內(nèi)嵌的匯編代碼,用來調(diào)用test的call,首先我們申明一個(gè)a=2,和一個(gè)引用類型r。先push r,在push a。這個(gè)可以和上面拿到的匯編進(jìn)行對比,這個(gè)是按照c語言的調(diào)用約定來的,這個(gè)push的順序是不能變的哈,后面直接調(diào)用call。后面用add esp,8來還原堆棧。不然會(huì)報(bào)錯(cuò)。接下來就將zhu函數(shù)放到DLL_PROCESS_ATTACH下面進(jìn)行調(diào)用

6.進(jìn)行測試

將dll和注入exe,以及測試程序都放到同一個(gè)文件夾,dll和測試程序一定要同一個(gè)文件夾哦,然后打開cmd,輸入命令。開始測試。不出意外的話,應(yīng)該會(huì)彈出兩個(gè)窗口,一個(gè)是注入成功窗口,一個(gè)是輸出基址的窗口。接著輸出結(jié)果也會(huì)變

20
2
請按任意鍵繼續(xù). . . 7910dc
22
4

會(huì)變成這樣,可以看到我們順利調(diào)用了這個(gè)test的test函數(shù)文章來源地址http://www.zghlxwxcb.cn/news/detail-438662.html

到了這里,關(guān)于c++注入dll調(diào)用call的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • c++動(dòng)態(tài)調(diào)用dll

    在C++中動(dòng)態(tài)調(diào)用DLL(動(dòng)態(tài)鏈接庫)可以使用Windows API函數(shù)。以下是一個(gè)簡單的示例,演示如何動(dòng)態(tài)加載和調(diào)用DLL中的函數(shù): 在上面的示例中,我們首先使用LoadLibrary函數(shù)加載DLL。然后,使用GetProcAddress函數(shù)獲取要調(diào)用的函數(shù)的指針。在本例中,我們假設(shè)要調(diào)用的函數(shù)名為\\\"MyFu

    2024年01月24日
    瀏覽(22)
  • C#調(diào)用C++ dll教程

    C#調(diào)用C++ dll教程

    在使用C#開發(fā)客戶端時(shí),有時(shí)需要調(diào)用C++ dll,本篇博客來介紹C#程序如何調(diào)用C++ dll。 首先使用VS2022創(chuàng)建C++ dll項(xiàng)目,具體步驟如下: (1)選擇Windows桌面向?qū)?,點(diǎn)擊下一步, 取項(xiàng)目名,例如我的dll項(xiàng)目名是libMath (2)選擇動(dòng)態(tài)項(xiàng)目,勾選導(dǎo)出符號 (3)編寫動(dòng)態(tài)代碼,代碼如下

    2024年01月25日
    瀏覽(20)
  • C++調(diào)用C# dll成功示例

    C++調(diào)用C# dll成功示例

    一.準(zhǔn)備C# dll類庫 。生成CSLib.dll ?二、寫C++應(yīng)用調(diào)用 ?1)需要把dll復(fù)制到運(yùn)行目錄下。(不然會(huì)提示找不到dll System.IO.FileNotFoundException:“未能加載文件或程序集“CSLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一個(gè)依賴項(xiàng)。系統(tǒng)找不到指定的文件) 2)設(shè)置\\\"公共語言運(yùn)

    2024年02月14日
    瀏覽(22)
  • C#調(diào)用C++ dll異常排查

    C#調(diào)用C++ dll異常排查

    最近在做的一款程序,長時(shí)間運(yùn)行總會(huì)出現(xiàn)莫名的問題。有時(shí)是自動(dòng)關(guān)閉,有時(shí)程序報(bào)錯(cuò),有時(shí)調(diào)用的dll異?!?由于開始與C++組合作時(shí),使用其提供的dll出現(xiàn)過數(shù)據(jù)讀寫時(shí)異常(內(nèi)存操作異常),于是懷疑他們提供的dll有內(nèi)存泄漏。于是想通過日志或其它方法來確認(rèn)這個(gè)猜

    2024年01月21日
    瀏覽(26)
  • 詳述C++ 調(diào)用opencv編譯成dll并調(diào)用的全過程

    詳述C++ 調(diào)用opencv編譯成dll并調(diào)用的全過程

    ?其中,extern \\\"C\\\":告訴編譯器將被它修飾的代碼按C語言的方式進(jìn)行編譯。 ????????????__declspec(dllexport):告訴編譯器和鏈接器被它修飾的函數(shù)或變量需要從DLL導(dǎo)出,以供其他應(yīng)用程序使用;與其相對的還有一句代碼是__declspec(dllimport),此修飾符的作用是告訴編譯器和鏈接

    2024年02月04日
    瀏覽(29)
  • VS2015項(xiàng)目中,MFC內(nèi)存中調(diào)用DLL函數(shù)(VC6生成的示例DLL)

    VS2015項(xiàng)目中,MFC內(nèi)存中調(diào)用DLL函數(shù)(VC6生成的示例DLL)

    本例主要講一下,用VC6如何生成DLL,用工具WinHex取得DLL全部內(nèi)容,VC2015項(xiàng)目加載內(nèi)存中的DLL函數(shù),并調(diào)用函數(shù)的示例。? ? ? ?? 本例中的示例代碼下載,點(diǎn)擊可以下載 1.新建項(xiàng)目,這里選擇Win32 Dynamic-link Library,如下圖: ?2.選擇“A simple DLL project”,然后點(diǎn)擊完成,如下:

    2024年02月12日
    瀏覽(20)
  • unity 調(diào)用C++ dll 有類和指針操作

    unity 調(diào)用C++ dll 有類和指針操作

    這個(gè)在之前unity 調(diào)用C++ dll 操作升級套娃函數(shù)調(diào)用_天人合一peng的博客-CSDN博客的基礎(chǔ)上,但實(shí)事時(shí)類相互嵌套,非常不好處理。 1 測試直接將main()生成dll程序能運(yùn)行不。 ?發(fā)現(xiàn)是可以的。 2 那就是想方法把對象或指針的操作的下一級函數(shù)直接寫到main里面,不就可以可以了嗎。

    2024年02月16日
    瀏覽(21)
  • Go語言中,如何調(diào)用C++的dll文件

    我將給出一個(gè)完整的示例來說明如何調(diào)用C++ DLL文件。首先,我們將創(chuàng)建一個(gè)簡單的C++ DLL,然后編寫Go代碼來調(diào)用該DLL。 創(chuàng)建C++ DLL文件( example.cpp ): 編譯C++代碼為DLL文件: 使用MinGW編譯器編譯 example.cpp 文件,生成 example.dll 文件。 -Wl,–out-implib,libexample.a -Wl,–output-def,exa

    2024年03月12日
    瀏覽(24)
  • C#調(diào)用C++類,托管C++方式實(shí)現(xiàn)(創(chuàng)建C++ CLR dll項(xiàng)目)

    C#調(diào)用C++類,托管C++方式實(shí)現(xiàn)(創(chuàng)建C++ CLR dll項(xiàng)目)

    ????????由于C#編寫的是托管代碼,編譯生成微軟中間語言,而C++代碼則編譯生成本地機(jī)器碼(這種C++也有叫做本地C++或者非托管C++,VC6.0就是用于開發(fā)非托管C++代碼的平臺),這兩種語言進(jìn)行混合編程就存在一定困難。比較常用的方法是使用DllImport的方法,這種方法在網(wǎng)

    2024年02月07日
    瀏覽(14)
  • visual studio配置調(diào)用c++ dll opencv為例

    visual studio配置調(diào)用c++ dll opencv為例

    1,配置VC++目錄,包含目錄和庫目錄。 2,鏈接器-輸入-包含目錄 3,生成目錄下包含對應(yīng)的dll文件 4,需注意對應(yīng)的Debug,Release及X86,X64選項(xiàng)

    2024年02月17日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包