能力值:
( LV2,RANK:10 )
|
-
-
2 楼
mark
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
找到问题根源了
IMAGE_REL_BASED_DIR64
修正方法不同
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
强烈关注中。。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
x64不可以的
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
可以的
我试过\
void FixBaseRelocTable(PVOID pNewImage)
{
ULONG uIndex;
ULONG uRelocTableSize;
ULONG_PTR OriginalImageBase;
ULONG Type;
ULONG_PTR *uRelocAddress;
PIMAGE_DOS_HEADER pImageDosHeader;
PIMAGE_NT_HEADERS64 pImageNtHeader;
IMAGE_DATA_DIRECTORY ImageDataDirectory;
IMAGE_BASE_RELOCATION *pImageBaseRelocation;
//将新内核地址作为一个PE文件头,依次向下,目的是寻找重定位表结构
pImageDosHeader=(PIMAGE_DOS_HEADER)pNewImage;
//定位到IMAGE_NT_HEADER
pImageNtHeader=(PIMAGE_NT_HEADERS64)((ULONG_PTR)pNewImage+pImageDosHeader->e_lfanew);
//获取内核文件的imagebase,以便后面做偏移修改。
OriginalImageBase=pImageNtHeader->OptionalHeader.ImageBase;
//定位到数据目录
ImageDataDirectory = pImageNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC];
//定位到重定位表结构
pImageBaseRelocation = (PIMAGE_BASE_RELOCATION)(ImageDataDirectory.VirtualAddress + (ULONG_PTR)pNewImage);
if (pImageBaseRelocation==NULL)
{
return;
}
while (pImageBaseRelocation->SizeOfBlock)
{ //计算需要修改的地址的个数
uRelocTableSize=(pImageBaseRelocation->SizeOfBlock-8)/2;
//循环遍历
for (uIndex=0;uIndex<uRelocTableSize;uIndex++)
{//判断高4位是否等于3
Type=pImageBaseRelocation->TypeOffset[uIndex]>>12;
if (Type==IMAGE_REL_BASED_DIR64)
{
//修改地址,相对地址加上一个新内核地址,使其成为一个实际地址
uRelocAddress=(ULONG64 *)((ULONG64)(pImageBaseRelocation->TypeOffset[uIndex]&0x0fff)+pImageBaseRelocation->VirtualAddress+(ULONG64)pNewImage);
//再加上内核首地址到imagebase的偏移
*uRelocAddress=*uRelocAddress+(OrigImage-OriginalImageBase);
}
}
//进行下一个重定位表的修改
pImageBaseRelocation=(IMAGE_BASE_RELOCATION *)((ULONG64)pImageBaseRelocation+pImageBaseRelocation->SizeOfBlock);
}
}
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
你调用一个函数执行试试,例如ZwDeleteFile,或者DbgPrint。发现调用失败,我用Windbg看过了,WIN32没问题,但WIN64修复不了。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
你调用一个函数执行试试,例如ZwDeleteFile,或者DbgPrint。发现调用失败。我用Windbg看过了,WIN32没问题,但WIN64修复不了。
|
能力值:
( LV3,RANK:20 )
|
-
-
9 楼
想知道你第二张图片里是哪本书?呵呵
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
Windows PE 权威指南
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
那你查一下64位的寻址方式吧,和32位不一样
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
都是直接寻址吧!
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
LARGE_INTEGER Addr;
ULONG delta = call的地址的二进制
Addr.LowPart += delta+ 3 + 4;
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
求这句话:
10 IMAGE_REL_BASED_DIR64 进行基地址重定位时将差值加到指定偏移处的一个64位域上
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
弄好这个,WIN64重载内核才有点希望。
|
能力值:
( LV4,RANK:50 )
|
-
-
16 楼
内存分配时,看看内存地址是多少,nt的地址是多少,就会明白应该是64位系统存在4g的寻址问题。
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
那么还有没可能修复重定位表
|
能力值:
( LV5,RANK:60 )
|
-
-
18 楼
64位JMP寻址长度有2GB空间限制
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
mark一下。。到时候写完32的再来看
|
|
|