网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
01月13日漏签0天
c程序吧 关注:13,411贴子:33,407
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 3回复贴,共1页
<<返回c程序吧
>0< 加载中...

【收集于互联网】C程序代码重定位

  • 只看楼主
  • 收藏

  • 回复
  • 额额发
  • 活跃吧友
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
许多人认为代码重定位在C语言中无法做到,它只属于汇编的专属,其实C语言也可以办到,当然了,里面要嵌入汇编.
在远程注入代码的时候,代码重定位用得比较多.但是还有2种取巧的方法就不用代码重定位,其中一种移植行查,一种要附加一个DLL.
第一种不用代码重定位的方法是:
1.自己在程序设定一个基址(最好不要设定一些比较常见的基址),这一步是必要的,因为很多的PE文件的基址都是相同的,所以可能会失败.
2.在使用VirtualAllocEx的时候,把这个基址作为申请内存区域的基址,如果成功的话,把代码写到这里的话,也就基本OK了.
第二种不用代码重定位的方法是:
1.把需要的远程执行的代码附加到一个DLL里面,然后把它注入到一个PE去执行.其实一般DLL也要重定位,只是这不是你的事而已.这种最简单,但是最不安全,因为别人用工具一看就知道一个PE加载了那些DLL.
下面是利用C语言进行代码重定位:
#include <windows.h>
#include <iostream>
#include<tlhelp32.h>
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;
}



  • 额瑞u
  • 活跃吧友
    4
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

没看的太懂
先赞一下
沙发
明天继续看


2026-01-13 07:25:47
广告
不感兴趣
开通SVIP免广告
  • 额额发
  • 活跃吧友
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
void End()
{
}
int main() 
{
printf("Begin Inject\n");
DWORD dwSize = (DWORD)End - (DWORD)&dwBegin;
WinExec("notepad.exe", SW_SHOW);
Sleep(100);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, GetProcessIdFromName("notepad.exe"));
PVOID pMem = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(hProcess, pMem, &dwBegin, dwSize, NULL);
pMem = (PVOID)((DWORD)pMem + (DWORD)Fun1 - (DWORD)&dwBegin);
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (DWORD(__stdcall *)(PVOID))pMem, NULL, NULL, NULL);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
printf("End Inject\n");
return 0;
} 
DWORD GetProcessIdFromName(LPCTSTR name) //通过执行文件名获得进程ID的方法
{
PROCESSENTRY32 pe;
DWORD id = 0;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
pe.dwSize = sizeof(PROCESSENTRY32);
if( !Process32First(hSnapshot,&pe) )
return 0;
do
{
pe.dwSize = sizeof(PROCESSENTRY32);
if( Process32Next(hSnapshot,&pe)==FALSE )
break;
if(strcmp(pe.szExeFile,name) == 0)
{
id = pe.th32ProcessID;
break;
}
} while(1);
CloseHandle(hSnapshot);
return id;
}


  • 222.133.91.*
快试试吧,
可以对自己使用挽尊卡咯~
◆
◆
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
谁说过
”许多人认为代码重定位在C语言中无法做到,它只属于汇编的专属“?


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 3回复贴,共1页
<<返回c程序吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示