能力值:
( LV2,RANK:10 )
|
-
-
2 楼
你是要直接执行dll的代码么?
这样直接copy进去的话 可不是dll正常加载到内存的呀
输入表 还有重定位啥的都没处理,看下内存加载dll的那个库吧
放假还不玩玩撒,,楼主11搞的咋样了
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
已经搞出来了,异常处理+硬件断点+hook getthreadcontext+hook KiUserExceptionDispatcher,不过4个断点实现的功能太少
所以想搞搞这样
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
你说你的吧
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
重定位做了没.......
而且你应该用 PAGE_EXECUTE_READWRITE啊
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
怎么重定位
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
必须要做重定位,具体的看PE的资料。有点奇怪的是,不重定位,楼主大人的程序是怎么运行起来的,好奇一下
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
没用运行起来。。直接蹦了
不过我virtualalloc,复制了dll,然后把dll重定位,运行virtualalloc的那部分,程序运行了1秒就自动关闭了,咋回事
typedef struct _UNICODE_STRING
{
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING,*PUNICODE_STRING;
typedef struct _PEB_LDR_DATA {
ULONG Length;
BOOLEAN Initialized;
PVOID SsHandle;
LIST_ENTRY InLoadOrderModuleList;
LIST_ENTRY InMemoryOrderModuleList;
LIST_ENTRY InInitializationOrderModuleList;
} PEB_LDR_DATA, *PPEB_LDR_DATA;
typedef struct _LDR_MODULE
{
LIST_ENTRY InLoadOrderModuleList; //+0x00
LIST_ENTRY InMemoryOrderModuleList; //+0x08
LIST_ENTRY InInitializationOrderModuleList; //+0x10
void* BaseAddress; //+0x18
void* EntryPoint; //+0x1c
ULONG SizeOfImage;
UNICODE_STRING FullDllName;
UNICODE_STRING BaseDllName;
ULONG Flags;
SHORT LoadCount;
SHORT TlsIndex;
HANDLE SectionHandle;
ULONG CheckSum;
ULONG TimeDateStamp;
} LDR_MODULE, *PLDR_MODULE;
VOID RebaseModule(HMODULE hModToRebase,ULONG newBase)
{
char *ModuleBase=NULL;//映射后的基址
PIMAGE_DATA_DIRECTORY pRelocTable=NULL;//指向重定位表
PIMAGE_DOS_HEADER pDosHeader;
PIMAGE_FILE_HEADER pFileHeader;
PIMAGE_OPTIONAL_HEADER pOptHeader;
PIMAGE_BASE_RELOCATION pRelocBlock;
DWORD dwIoCnt;
DWORD newValue = 0 ;
WORD i=0;//用作循环计数
ModuleBase=(char*)hModToRebase;
// printf("Mode Base=0x%08X\n",ModuleBase);
pDosHeader=(PIMAGE_DOS_HEADER)ModuleBase;
pFileHeader=(PIMAGE_FILE_HEADER)(ModuleBase+pDosHeader->e_lfanew+4);
pOptHeader=(PIMAGE_OPTIONAL_HEADER)((char*)pFileHeader+sizeof(IMAGE_FILE_HEADER));
//保存重定位表信息
pRelocTable=&(pOptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC]);
// printf("IMAGE_DIRECTORY_ENTRY_BASERELOC:0x%08X Size=0x%X\n",pRelocTable->VirtualAddress,pRelocTable->Size);
//开始处理重定位数据
//先取得第一个重定位块的地址
pRelocBlock=(PIMAGE_BASE_RELOCATION)(ModuleBase+pRelocTable->VirtualAddress);
// printf("After Loaded,Reloc Table=0x%08X\n",pRelocBlock);
do
{//处理一个接一个的重定位块,最后一个重定位块以RAV=0结束
//需要重定位的个数,是本块的大小减去块头的大小,结果是以DWORD表示的大小
//而重定位数据是16位的,那就得除以2
int numofReloc=(pRelocBlock->SizeOfBlock-sizeof(IMAGE_BASE_RELOCATION))/2;
//printf("Reloc Data num=%d\n",numofReloc);
//重定位数据是16位的
WORD offset=0;
WORD *pRelocData=(WORD*)((char*)pRelocBlock+sizeof(IMAGE_BASE_RELOCATION));
for (i=0;i<numofReloc;i++)//循环,或直接判断*pData是否为0也可以作为结束标记
{
DWORD *RelocAddress=0;//需要重定位的地址
//重定位的高4位是重定位类型,
if (((*pRelocData)>>12)==IMAGE_REL_BASED_HIGHLOW)//判断重定位类型是否为IMAGE_REL_BASED_HIGHLOW
{
//计算需要进行重定位的地址
//重定位数据的低12位再加上本重定位块头的RAV即真正需要重定位的数据的RAV
offset=(*pRelocData)&0xFFF;//小偏移
RelocAddress=(DWORD*)(ModuleBase+pRelocBlock->VirtualAddress+offset);
//对需要重定位的数据进行修正
//修正方法:减去IMAGE_OPTINAL_HEADER中的基址,再加上新的基址即可
//*RelocAddress=*RelocAddress-pOptHeader->ImageBase+newBase;
newValue =*RelocAddress - (DWORD)ModuleBase + newBase;
WriteProcessMemory(GetCurrentProcess(),RelocAddress,&newValue,sizeof(DWORD),&dwIoCnt);
}
pRelocData++;
}
//指向下一个重定位块
pRelocBlock=(PIMAGE_BASE_RELOCATION)((char*)pRelocBlock+pRelocBlock->SizeOfBlock);
}while (pRelocBlock->VirtualAddress);
}
我调用的是RebaseModule(dll基地址,malloc的地址)
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
你设置内存保护属性了么?另外有些dll要运行一下dll入口
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
dll里有个重定位节区 按照节区里的信息对代码进行重定位处理
手动加载dll需要处理重定位节区并且对导入表进行重定位 因为你是拷贝已经加载的dll所以只要处理重定位节区即可 导入表系统已经帮你处理了
至于怎么处理你度娘下 peloader 原理基本一样 论坛上也有一大堆
另外执行代码需要page_execute_readwrite 光是读写权限是不行的
|
|
|