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语言代码重定位 (原创)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 12位18Bb20计算公式c语言,C语言
- 下一篇: android-support安装不,导