谁懂重定位表?帮忙看看

Howie1013 2010-11-01 11:47:58
加精
下面是我一个从网上找到无模块注入代码的方法.
具体是先自身载入DLL, 然后修复.reloc section后写入到目标进程。

测试过,如果注入的是C++ DLL可以正常运行,但如果是DELPHI的DLL,调用ShowMessage函数就会出错。
例如下面的代码,使用ShowMessage不行,但用MessageBox就可以。
有谁知道是什么原因吗?


procedure showDlg; stdcall; export;
begin
ShowMessage('Delphi Dialog');
//MessageBox(0, 'Win32 Dialog', 'Win32 Dialog', MB_OK);
end;


LPVOID GetRelocBase(LPVOID lpModuleBaseAddr)
{
PIMAGE_DOS_HEADER pImg_DOS_Header = (PIMAGE_DOS_HEADER)lpModuleBaseAddr;
PIMAGE_NT_HEADERS pImg_NT_Header = (PIMAGE_NT_HEADERS)((ULONG)pImg_DOS_Header + pImg_DOS_Header->e_lfanew);



_IMAGE_FILE_HEADER FileHeader = pImg_NT_Header->FileHeader;
WORD NumberOfSections = FileHeader.NumberOfSections;
IMAGE_SECTION_HEADER* pIMAGE_SECTION_HEADER = (IMAGE_SECTION_HEADER*)((DWORD)pImg_NT_Header + sizeof(IMAGE_NT_HEADERS));
for (WORD i=0; i<NumberOfSections; i++)
{
if (!lstrcmpiA((CHAR*)(pIMAGE_SECTION_HEADER->Name), ".reloc"))
{
return (LPVOID)((DWORD)lpModuleBaseAddr + pIMAGE_SECTION_HEADER->VirtualAddress);
}
pIMAGE_SECTION_HEADER += 1;
}
return 0;
}


BOOL CWar::DoWork()
{
HMODULE hMod = LoadLibrary(TEXT("Project1.DLL"));
typedef BOOL (*FUNC)();
FUNC HaveFun = (FUNC)GetProcAddress(hMod, "showDlg");

MODULEINFO info;
GetModuleInformation(GetCurrentProcess(), hMod, &info, sizeof(info));
LPVOID lpAlloc = VirtualAlloc(NULL, info.SizeOfImage, MEM_COMMIT, PAGE_READWRITE);
memcpy(lpAlloc, info.lpBaseOfDll, info.SizeOfImage);
LPVOID lpReloc = GetRelocBase(lpAlloc);

LPVOID lpTargAddr = VirtualAllocEx(m_handle, NULL, info.SizeOfImage, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
DWORD dwX = (DWORD)lpTargAddr - (DWORD)info.lpBaseOfDll; // 差值
char* pcurReloc = (char*)lpReloc;
DWORD pBlockRVA;
DWORD dwBlockSize, dwCurSize;
WORD itemRVA;
do
{
pBlockRVA = *(DWORD *)pcurReloc;
dwBlockSize = *(DWORD *)(pcurReloc + 4);
dwCurSize = 8;
pcurReloc += 8;
if ( dwBlockSize > 8 )
{
do
{
itemRVA = *(WORD *)pcurReloc;
pcurReloc += 2;
dwCurSize += 2;
if ( itemRVA >> 12 )
{
if ( itemRVA >> 12 != 3 )
return 4;
*(DWORD *)((char *)lpAlloc + pBlockRVA + (itemRVA & 0xFFF)) += dwX;
}
}
while ( dwCurSize < dwBlockSize );
}
}
while ( dwBlockSize );

DWORD dwTid;
WriteProcessMemory(m_handle, lpTargAddr, lpAlloc, info.SizeOfImage, &dwTid);
HANDLE hThread = CreateRemoteThread(m_handle, NULL, 0, LPTHREAD_START_ROUTINE((char*)HaveFun - (char*)info.lpBaseOfDll + (char*)lpTargAddr), 0, CREATE_DEFAULT_ERROR_MODE, &dwTid);
//WaitForSingleObject(hThread, 10*1000);
VirtualFree(lpAlloc, 0, MEM_RELEASE);
//VirtualFreeEx(m_handle, lpTargAddr, 0, MEM_RELEASE);
return TRUE;
}
...全文
974 84 打赏 收藏 转发到动态 举报
写回复
用AI写文章
84 条回复
切换为时间正序
请发表友善的回复…
发表回复
henryhoo1114 2010-11-10
  • 打赏
  • 举报
回复
不懂!还没到这个地步呢。赶紧进步。。。
ljzforever 2010-11-09
  • 打赏
  • 举报
回复
不懂,帮项!
mcag1111 2010-11-09
  • 打赏
  • 举报
回复
感谢楼主分享!
Tkun 2010-11-08
  • 打赏
  • 举报
回复
顶!!!!!!!!!!!
zjgaofei 2010-11-08
  • 打赏
  • 举报
回复
procedure showDlg; stdcall; export;
begin
ShowMessage('Delphi Dialog');
//MessageBox(0, 'Win32 Dialog', 'Win32 Dialog', MB_OK);
end;


shinianjingmeng 2010-11-08
  • 打赏
  • 举报
回复
学习学习。。。
shanyue198 2010-11-08
  • 打赏
  • 举报
回复
学习学习··
citypanther 2010-11-07
  • 打赏
  • 举报
回复
看看!!!!!学习!!!!!!!!
xiaoxiangqing 2010-11-07
  • 打赏
  • 举报
回复
没用过
yuan0716 2010-11-07
  • 打赏
  • 举报
回复
顶只为分!!
dangernous 2010-11-07
  • 打赏
  • 举报
回复
打酱油的
tanfenfly 2010-11-06
  • 打赏
  • 举报
回复
打酱油 学习的
cl337684569 2010-11-06
  • 打赏
  • 举报
回复
看看!!!!!学习!!!!!!!!
  • 打赏
  • 举报
回复
好东西 呵呵
w268002682 2010-11-05
  • 打赏
  • 举报
回复
学习......
hyq1222 2010-11-05
  • 打赏
  • 举报
回复
可能是句柄问题, 即DLL的APPLICATION的句柄.
jxjachengling 2010-11-05
  • 打赏
  • 举报
回复
buhui
foandy 2010-11-05
  • 打赏
  • 举报
回复
这个有难度
xushaohuain 2010-11-04
  • 打赏
  • 举报
回复
好强大··
ww55833952 2010-11-04
  • 打赏
  • 举报
回复
学习 学习学习 学习
加载更多回复(34)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧