首页
社区
课程
招聘
[旧帖] [求助]关于PE文件的问题 0.00雪花
发表于: 2012-6-18 20:26 1797

[旧帖] [求助]关于PE文件的问题 0.00雪花

2012-6-18 20:26
1797
菜鸟的一个小发现,这样居然也能运行?

#include <Windows.h>
#include <DbgHelp.h>
#pragma comment(lib, "DbgHelp.lib")
#include <stdio.h>

void JmpNewModuleExecute()
{
	PIMAGE_NT_HEADERS		pNtH;
	HMODULE					hOldMod;
	HMODULE					hNewMod;
	DWORD					dwImageSz;
	PIMAGE_BASE_RELOCATION	pIBR;
	LONG					lDifference;
	DWORD					dwRetAddr;

	hOldMod = ::GetModuleHandle(NULL);

	pNtH = ::ImageNtHeader(hOldMod);
	dwImageSz = pNtH->OptionalHeader.SizeOfImage;
	hNewMod = (HMODULE)new TCHAR[dwImageSz];
	RtlZeroMemory(hNewMod, dwImageSz);
	RtlCopyMemory(hNewMod, hOldMod, dwImageSz);
	pNtH = ::ImageNtHeader(hNewMod);

	//重定位处理
	if(pNtH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size > 0)
	{
		pIBR = (PIMAGE_BASE_RELOCATION)((DWORD)hNewMod + \
			pNtH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress);

		lDifference = (LONG)hNewMod - pNtH->OptionalHeader.ImageBase;

		for(; pIBR->VirtualAddress != 0; )
		{
			LPTSTR lpMemPage = (LPTSTR)hNewMod + pIBR->VirtualAddress;
			DWORD dwCount = (pIBR->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) >> 1;

			PWORD pRelocationItem = (PWORD)((LPTSTR)pIBR + sizeof(IMAGE_BASE_RELOCATION));
			for(DWORD i = 0; i < dwCount; i++)
			{
				INT nOffset = pRelocationItem[i] & 0x0fff;
				INT nType = pRelocationItem[i] >> 12;

				if(nType == IMAGE_REL_BASED_HIGHLOW)
				{
					*(LPDWORD)(lpMemPage + nOffset) += lDifference;
				}
			}

			pIBR = (PIMAGE_BASE_RELOCATION)(pRelocationItem + dwCount);
		}
	}
//获取原先返回地址,如果是debug的话ebp + 4函数执行完后的返回地址
	__asm
	{
		mov eax, ds:[ebp + 4]
		mov dwRetAddr, eax
	}

	dwRetAddr -= (DWORD)hOldMod;
	dwRetAddr += (DWORD)hNewMod;
//修改返回地址为新模块地址
	__asm
	{
		mov eax, dwRetAddr
		mov ds:[ebp + 4], eax
	}
}

void main()
{
	HMODULE hModule = NULL;

	hModule= ::GetModuleHandle(NULL);
	JmpNewModuleExecute();//该函数执行完后,下面的代码就等于在分配的缓存区里面执行

	MessageBox(0, 0, 0, 0);
}

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 622
活跃值: (294)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
2
为什么不可以?

计算机只关心2个信息,第一,访问哪边?第二,那边能不能被访问到。
2012-6-18 20:29
0
雪    币: 446
活跃值: (186)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
3
其实我是想这样写的,我看了网上的自删除文件代码,结果发现做了半天,才发现CloseHandle(HANDLE(4))在xp下不行
[CODE]
void main()
{
        HMODULE hModule = NULL;
        TCHAR szBuf[MAX_PATH] = {0};

        hModule= ::GetModuleHandle(NULL);
        GetModuleFileName(hModule, szBuf, MAX_PATH);
        JmpNewModuleExecute();
        CloseHandle(HANDLE(4));
        UnmapViewOfFile(hModule);
        DeleteFile(szBuf);

}
CODE]
2012-6-18 20:38
0
雪    币: 622
活跃值: (294)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
4
有些句柄是受到保护的。
2012-6-18 22:12
0
游客
登录 | 注册 方可回帖
返回
//