该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
原贴: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;
}