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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值