首页
社区
课程
招聘
我去执行一个程序,如果重定位一部分数据.
发表于: 2012-12-11 18:01 4076

我去执行一个程序,如果重定位一部分数据.

2012-12-11 18:01
4076
我的DLL注入到一个程序EXE,

需要执行一些代码.

例如

asm
  mov eax,[$430506]
  push [$605010]
  CALL [$540100]
end;

如果是单纯的XP,那么上面那个CALL是绝对不会出错的.因为镜像基址是00400000,固定不变
但是在部分WIN7下,镜像基址偶尔会改变,例如WIN7下这次的镜像基址是10000000

那么必须如下才不会出错
asm
  mov eax,[$10030506]
  PUSH [$10205010]
  CALL [$10140100]
end;

我知道可以通过GetModuleHandle加偏移获取到正确的,
但是我要模拟大量代码,一个个加偏移,十分不方便,
而且弄变量的话也得MOV取两次才取到比如
var
  verbl:integer;
verbl := GetModuleHandle('1.exe')+$30506;

asm
  mov eax,[verbl]
  mov eax,[eax]
end;
上面两局才等于这一句 mov eax,[$10030506]

我想申请一块内存,把我模拟的这些过程COPY进去,
然后手动重定位,请教怎么重定位呢...

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 2815
活跃值: (2608)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
2
可能得手动添加重定位表,不过这个更复杂。还不如变量。
或者你可以删掉PE文件的重定位表,这样就不会自动重定位了。
2012-12-11 20:28
0
雪    币: 182
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
Next:
    call Next1
Next1:
    pop  ebx
    sub  ebx, offset Next1
2012-12-11 21:05
0
雪    币: 107
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
找到了一个重定位的代码,就是不知道怎么改成Delphi的?
或谁给注释一下?

LPVOID CWar::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; //VC是智能的,它自己知道加多长的字节!这里弄了好久
}
return 0;
}
BOOL CWar::DoWork()
{
HMODULE hMod = GetModuleHandleA("mana.dll");
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;
}
2012-12-13 09:51
0
雪    币: 2815
活跃值: (2608)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
5
重点不是重定位麻烦,而是你自己得根据你的代码 搞一个重定位表。
2012-12-13 13:44
0
游客
登录 | 注册 方可回帖
返回
//