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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言重新定位文件,C语言代码重定位 (原创)

發布時間:2024/1/23 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言重新定位文件,C语言代码重定位 (原创) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

該樓層疑似違規已被系統折疊?隱藏此樓查看此樓

原貼:http://hi.baidu.com/ciw%5Fblue/blog/item/ec2cc251998c07888d543054.html

許多人認為代碼重定位在C語言中無法做到,它只屬于匯編的專屬,其實C語言也可以辦到,當然了,里面要嵌入匯編.

在遠程注入代碼的時候,代碼重定位用得比較多.但是還有2種取巧的方法就不用代碼重定位,其中一種移植行查,一種要附加一個DLL.

第一種不用代碼重定位的方法是:

1.自己在程序設定一個基址(最好不要設定一些比較常見的基址),這一步是必要的,因為很多的PE文件的基址都是相同的,所以可能會失敗.

2.在使用VirtualAllocEx的時候,把這個基址作為申請內存區域的基址,如果成功的話,把代碼寫到這里的話,也就基本OK了.

第二種不用代碼重定位的方法是:

1.把需要的遠程執行的代碼附加到一個DLL里面,然后把它注入到一個PE去執行.其實一般DLL也要重定位,只是這不是你的事而已.這種最簡單,但是最不安全,因為別人用工具一看就知道一個PE加載了那些DLL.

下面是利用C語言進行代碼重定位:

#include?

#include?

#include

using?namespace?std;

#pragma?data_seg(".mydat")

#pragma?code_seg(".shell")

#pragma?comment(linker,"/SECTION:.mydat,RWE")

#pragma?comment(linker,"/SECTION:.shell,RWE")

#pragma?comment(linker,"/MERGE:.mydat=.shell")

#define?Recode?_asm?call?A?_asm?A:?_asm?pop?ebx?_asm?lea?eax,?A?_asm?sub?ebx,?eax

#define?GetFunOffset(pFun)?_asm?mov?eax,?[ebx?+?pFun]?_asm?mov?pFun,?eax

#define?GetStringOffset(pStr)?_asm?mov?eax,?[pStr]?_asm?lea?eax,?[ebx?+?eax]?_asm?mov?pStr,?eax?_asm?push?pStr

#define?VA_END?-1

DWORD?GetProcessIdFromName(LPCTSTR?name)?;

void?Fun2();

int?Invoke(char*pDllName,?char*pFunName,?...);

typedef?HINSTANCE?(WINAPI?*pLoadLibraryDef)(LPCTSTR);

typedef?DWORD?(WINAPI?*pMsgBoxDef)(DWORD,DWORD,DWORD,DWORD);

DWORD?dwBegin?=?0;

char?szUser32[]?=?"User32.Dll";

char?szMessageBox[]?=?"MessageBoxA";

char?szText[]?=?"Hello?World";

char?szCaption[]?=?"C?Language?Recode";

DWORD?WINAPI?Fun1(PVOID)

{

Recode;

char*?pUser32?=?szUser32;

char*?pMessageBox?=?szMessageBox;

char*?pText?=?szText;

char*?pCaption?=?szCaption;

GetStringOffset(pUser32);

GetStringOffset(pMessageBox);

GetStringOffset(pText);

GetStringOffset(pCaption);

Invoke(pUser32,?pMessageBox,?NULL,?pText,?pCaption,?NULL,?-1);

return?0;

}

int?Invoke(char*?pDllName,?char*?pFunName,?...)

{

DWORD?dwLoadLib?=?0x7C801D77;

HMODULE?hDll?=?((HMODULE(WINAPI*)(char*))dwLoadLib)(pDllName);

PROC?dwFunAddr?=?((PROC(WINAPI*)(HMODULE,char*))0x7C80ADA0)(hDll,?pFunName);

DWORD?dwRet?=?0;

DWORD?dwParam[128],?dwParamTemp?=?0;

DWORD?dwParamLen?=?0;

va_list?stVaList;

va_start(stVaList,?pFunName);

while((dwParam[dwParamLen++]?=?va_arg(stVaList,DWORD))?!=?VA_END);

dwParamLen?-=?2;

while(dwParamLen?!=?-1)

{

dwParamTemp?=?dwParam[dwParamLen--];

_asm?push?dwParamTemp

}

_asm?mov?eax,?dwFunAddr

_asm?call?eax

_asm?mov?dwRet,?eax

va_end(stVaList);

return?dwRet;

}

總結

以上是生活随笔為你收集整理的C语言重新定位文件,C语言代码重定位 (原创)的全部內容,希望文章能夠幫你解決所遇到的問題。

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