cursorloader的使用 PE怎么使用

2436人阅读
黑色代碼(15)
&& 本人接触pe文件格式不久,参考网上的一些资料写了一个pe loader,主要是通过把需要加载的文件的所所有section加载到相应的RVA上,然后进行重定位处理、导入表和导出表处理、资源段处理。由于本loader.exe会被加载到0x0f400000处,因此可以把0x400000给被加载的文件预留了,这样可以避免重定位所带来的性能损耗。导入表的处理主要是通过调用GetProcAddress获取导入表中函数的地址。导出表一般仅在dll中使用,而此主要是用于load exe文件,所以不用做任何处理。资源段处理资料不多,我这里好像有些问题,加载console程序可以正常执行,但是当加载一部分gui程序则不能成功,而令一些gui程序则会成功。望高手能指教一二。&&& 下面是源代码部分:
view plaincopy to clipboardprint?/*& &*LocalFile是对读文件操作的一个简单封装& &*/& //LocalFile.h&& #pragma once&& & class CLocalFile&& {&& public:&& &&& CLocalFile(const char * name);&& &&& ~CLocalFile(void);&& & &&& int Read(size_t offset, size_t size, void *ppBuf);&& & &&& size_t GetSize() const { return m_}&& & private:&& &&& HANDLE&&&&&&&&&& m_&& &&& size_t&&&&&&&&& m_&& };&& & //LocalFile.cpp&& #include "LocalFile.h"&& & CLocalFile::CLocalFile(const char * name)&& {&& &&& assert(NULL != name);&& &&& assert(0 != name[0]);&& & &&& m_fd = CreateFileA(name, GENERIC_READ,&& &&&&&&&&&&&&&&&&&&&&&&& FILE_SHARE_READ, NULL,&& &&&&&&&&&&&&&&&&&&&&&&& OPEN_EXISTING,&& &&&&&&&&&&&&&&&&&&&&&&& FILE_ATTRIBUTE_NORMAL, NULL);&& &&& if (INVALID_HANDLE_VALUE == m_fd) {&& &&&&&&& printf("Open file %s failed, error: %d!/n",name, GetLastError());&& &&&&&&&&& &&& }&& & &&& m_size = GetFileSize(m_fd, NULL);&& &&&&& }&& & CLocalFile::~CLocalFile(void)&& {&& &&& if (NULL != m_fd) {&& &&&&&&& CloseHandle(m_fd);&& &&& }&& }&& & int CLocalFile::Read(size_t offset,&& &&&&&&&&&&&&&&&&&&&& size_t size,&& &&&&&&&&&&&&&&&&&&&& void * pBuf)&& {&& &&& DWORD&& &&& ULONG&& & &&& ret = SetFilePointer(m_fd, offset, NULL, FILE_BEGIN);&& &&& if (INVALID_SET_FILE_POINTER == ret) {&& &&&&&&& ret = GetLastError();&& &&&&&&& printf("Seek file failed, error: %d!/n", ret);&& &&&&&&&&& &&& }&& & &&& if (!ReadFile(m_fd, pBuf, size, &rdsize, NULL)) {&& &&&&&&& ret = GetLastError();&& &&&&&&& printf("Read file failed, error: %d/n", ret);&& &&&&&&&&& &&& }&& & &&& return 0;&& }&& & //loader.cpp&& & #include "LocalFile.h"&& & /*把该loader.exe的加载地址设置为0x0f400000,从而可以把0x地址& &*预留给将要被加载的程序,从而可以避免因地址重定位而带来的性能损耗。& &*/& #pragma comment(linker, "/BASE:0x0f400000")&& & inline int CDECL DebugPrint(const char *fmt,...)&& {&& &&& int nLength = 0;&& #if defined(_DEBUG)&& &&& va_&& &&& va_start(ap, fmt);&& &&& nLength = vprintf(fmt, ap);&& &&& va_end(ap);&& #endif&& &&& return nL&& }&& & void DumpPeInfo(PeInfo *pInfo)&& {&& &&& DebugPrint("------------headers info------------/n" /&& &&&&&&&&&&&&&& "imageBase:&&&&&&& 0x%x. /n" /&& &&&&&&&&&&&&&& "entryPoint:&&&&&& 0x%x. /n" /&& &&&&&&&&&&&&&& "sections:&&&&&&&& 0x%x. /n" /&& &&&&&&&&&&&&&& "imageSize:&&&&&&& 0x%x. /n" /&& &&&&&&&&&&&&&& "exportRva:&&&&&&& 0x%x. /n" /&& &&&&&&&&&&&&&& "exportSize:&&&&&& 0x%x. /n" /&& &&&&&&&&&&&&&& "importRva:&&&&&&& 0x%x. /n" /&& &&&&&&&&&&&&&& "importSize:&&&&&& 0x%x. /n" /&& &&&&&&&&&&&&&& "resourceRva:&&&&& 0x%x. /n" /&& &&&&&&&&&&&&&& "resourceSize:&&&& 0x%x. /n" /&& &&&&&&&&&&&&&& "relocRva:&&&&&&&& 0x%x. /n" /&& &&&&&&&&&&&&&& "relocSize:&&&&&&& 0x%x. /n" /&& &&&&&&&&&&&&&& "debugRva:&&&&&&&& 0x%x. /n" /&& &&&&&&&&&&&&&& "debugSize:&&&&&&& 0x%x. /n" /&& &&&&&&&&&&&&&& "offsetSections:&& 0x%x. /n" /&& &&&&&&&&&&&&&& "fileType:&&&&&&&& %s. /n",&& &&&&&&&&&&&&&&& pInfo-&imageBase,&& &&&&&&&&&&&&&&& pInfo-&entryPoint,&& &&&&&&&&&&&&&&& pInfo-&sections,&& &&&&&&&&&&&&&&& pInfo-&imageSize,&& &&&&&&&&&&&&&&& pInfo-&exRva,&& &&&&&&&&&&&&&&& pInfo-&exSize,&& &&&&&&&&&&&&&&& pInfo-&imRva,&& &&&&&&&&&&&&&&& pInfo-&imSize,&& &&&&&&&&&&&&&&& pInfo-&resRva,&& &&&&&&&&&&&&&&& pInfo-&resSize,&& &&&&&&&&&&&&&&& pInfo-&relocRva,&& &&&&&&&&&&&&&&& pInfo-&relocSize,&& &&&&&&&&&&&&&&& pInfo-&dbgRva,&& &&&&&&&&&&&&&&& pInfo-&dbgSize,&& &&&&&&&&&&&&&&& pInfo-&offsetSection,&& &&&&&&&&&&&&&&& pInfo-&fileType == 0 ? "exe":"dll");&& }&& & BOOL IsPEFile(CLocalFile& lf)&& {&& &&& IMAGE_DOS_HEADER&& &&& IMAGE_NT_HEADERS&& & &&& lf.Read(0, sizeof(IMAGE_DOS_HEADER), &dh);&& &&& if (IMAGE_DOS_SIGNATURE != dh.e_magic) {&& &&&&&&& return FALSE;&& &&& }&& & &&& lf.Read(dh.e_lfanew, sizeof(IMAGE_NT_HEADERS), &nh);&& &&& if (IMAGE_NT_SIGNATURE != nh.Signature) {&& &&&&&&& return FALSE;&& &&& }&& & &&& return TRUE;&& }&& & BOOL ParseNTHeader(CLocalFile &lf, PeInfo &pe)&& {&& &&& IMAGE_DOS_HEADER&& &&& IMAGE_NT_HEADERS&& &&& PIMAGE_FILE_HEADER&& &&& PIMAGE_OPTIONAL_HEADER32&& & &&& lf.Read(0, sizeof(IMAGE_DOS_HEADER), &dh);&& &&& pe.offsetSection = dh.e_lfanew + sizeof(IMAGE_NT_HEADERS);&& &&& lf.Read(dh.e_lfanew, sizeof(IMAGE_NT_HEADERS), &nh);&& & &&& pfh = &nh.FileH&& &&& poh = &nh.OptionalH&& & &&& assert(IMAGE_FILE_MACHINE_I386 == pfh-&Machine);&& &&& assert(pfh-&SizeOfOptionalHeader == sizeof(IMAGE_OPTIONAL_HEADER32));&& & &&& pe.sections = pfh-&NumberOfS&& &&& pe.imageBase = poh-&ImageB&& &&& pe.entryPoint = poh-&AddressOfEntryP&& &&& pe.imageSize = poh-&SizeOfI&& & &&& pe.exRva = poh-&DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualA&& &&& pe.exSize = poh-&DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].S&& &&& pe.imRva = poh-&DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualA&& &&& pe.imSize = poh-&DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].S&& &&& pe.resRva = poh-&DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualA&& &&& pe.resSize = poh-&DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].S&& &&& pe.relocRva = poh-&DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualA&& &&& pe.relocSize = poh-&DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].S&& &&& pe.dbgRva = poh-&DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualA&& &&& pe.dbgSize = poh-&DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].S&& & &&& pe.fileType = pfh-&Characteristics == IMAGE_FILE_DLL ? IMAGE_FILE_DLL : 0;&& & &&& DumpPeInfo(&pe);&& & &&& return TRUE;&& }&& & BOOL LoadSections(CLocalFile &lf, PeInfo &pe, MODULEINFO &mi)&& {&& &&& PIMAGE_SECTION_HEADER psh,&& &&& DWORD protect = 0, oldProtect = 0;&& &&& char name[9] = "/0";&& & &&& psh = (PIMAGE_SECTION_HEADER)_alloca(pe.sections * sizeof(IMAGE_SECTION_HEADER));&& &&& if (NULL == psh) {&& &&&&&&& printf("Memory not enough!/n");&& &&&&&&& return FALSE;&& &&& }&& &&& lf.Read(pe.offsetSection, pe.sections * sizeof(IMAGE_SECTION_HEADER), psh);&& &&& ptmp =&& & &&& DebugPrint("/n/n------------sections info------------/n" /&& &&&&&&&&&&&&&& "name/tVA/tSOD/tPTR/tPTR/tPTL/tNOR/tNOL/tCrt/n");&& & &&& /* 循环从被加载的文件中读取各个section内容,并存放在该section所指定的& &&&& * VirtualAddress地址空间中。& &&&& */& &&& for (int i = 0; i & pe. ++i, ptmp++) {&& &&&&&&& memcpy(name, ptmp-&Name, 8);&& & &&&&&&& if (NULL != ptmp-&PointerToRawData && 0 != ptmp-&SizeOfRawData) {&& &&&&&&&&&&& lf.Read(ptmp-&PointerToRawData,&& &&&&&&&&&&&&&&&&&&&&&&& ptmp-&SizeOfRawData,&& &&&&&&&&&&&&&&&&&&&&&&& (void *)((DWORD)mi.lpBaseOfDll + ptmp-&VirtualAddress));&& &&&&&&& }&& & & &&&&&&& /* 此处代码主要功能是根据各个区段的Characteristics值,& &&&&&&&& * 来设置其所在内存的页属性,但因在RelocPeModule机制重定位时还需要对相关内存& &&&&&&&& * 进行写入,因此此处的代码应该在RelocPeModule函数调用之后才能执行。& &&&&&&&& */& #if 0&&& &&&&&&& if (ptmp-&Characteristics & IMAGE_SCN_MEM_READ) {&& &&&&&&&&&&& protect = PAGE_READONLY;&& &&&&&&& }&& &&&&&&& if (ptmp-&Characteristics & IMAGE_SCN_MEM_WRITE) {&& &&&&&&&&&&& protect = PAGE_READWRITE;&& &&&&&&& }&& &&&&&&& if (ptmp-&Characteristics & IMAGE_SCN_MEM_EXECUTE) {&& &&&&&&&&&&& if (protect & PAGE_READONLY) {&& &&&&&&&&&&&&&&& protect = PAGE_EXECUTE_READ;&& &&&&&&&&&&& }&& &&&&&&&&&&& else if (protect & PAGE_READWRITE) {&& &&&&&&&&&&&&&&& protect = PAGE_EXECUTE_READWRITE;&& &&&&&&&&&&& }&& &&&&&&&&&&& else {&& &&&&&&&&&&&&&&& protect = PAGE_EXECUTE;&& &&&&&&&&&&& }&& &&&&&&& }&& & &&&&&&& if (!VirtualProtect((LPVOID)(ptmp-&VirtualAddress + (DWORD)mi.lpBaseOfDll),&& &&&&&&&&&&&&&&&&&&&&&&&&&&& ptmp-&SizeOfRawData, protect, &oldProtect)) {&& &&&&&&&&&&& printf("Set memory protection failed, error: %d/n", GetLastError());&& &&&&&&&&&&& return FALSE;&& &&&&&&& }&& #endif&& &&&&&&& DebugPrint("%-8s" /&& &&&&&&&&&&&&&&&&&& "0x%x/t" /&& &&&&&&&&&&&&&&&&&& "0x%x/t" /&& &&&&&&&&&&&&&&&&&& "0x%x/t" /&& &&&&&&&&&&&&&&&&&& "0x%x/t" /&& &&&&&&&&&&&&&&&&&& "0x%x/t" /&& &&&&&&&&&&&&&&&&&& "0x%x/t" /&& &&&&&&&&&&&&&&&&&& "0x%x/t" /&& &&&&&&&&&&&&&&&&&& "0x%x/n",&& &&&&&&&&&&&&&&&&&& name,&& &&&&&&&&&&&&&&&&&& ptmp-&VirtualAddress,&& &&&&&&&&&&&&&&&&&& ptmp-&SizeOfRawData,&& &&&&&&&&&&&&&&&&&& ptmp-&PointerToRawData,&& &&&&&&&&&&&&&&&&&& ptmp-&PointerToRelocations,&& &&&&&&&&&&&&&&&&&& ptmp-&PointerToLinenumbers,&& &&&&&&&&&&&&&&&&&& ptmp-&NumberOfRelocations,&& &&&&&&&&&&&&&&&&&& ptmp-&NumberOfLinenumbers,&& &&&&&&&&&&&&&&&&&& ptmp-&Characteristics);&& &&& }&& & &&& return TRUE;&& }&& & BOOL FixupResource(PIMAGE_RESOURCE_DIRECTORY pRes, DWORD imagebase, int offsetRlc)&& {&& &&& PIMAGE_RESOURCE_DIRECTORY_ENTRY pE&& &&& DWORD nE&& & &&& nEntries = pRes-&NumberOfIdEntries + pRes-&NumberOfNamedE&& & &&& pEntry = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((DWORD)pRes + sizeof(IMAGE_RESOURCE_DIRECTORY));&& & &&& for (DWORD i = 0; i & nE ++i, ++pEntry) {&& & &&&&&&& if (IMAGE_RESOURCE_DATA_IS_DIRECTORY & pEntry-&OffsetToData) {&& &&&&&&&&&&& PIMAGE_RESOURCE_DIRECTORY pRes2;&& &&&&&&&&&&& PIMAGE_RESOURCE_DIRECTORY_ENTRY pEntry2;&& &&&&&&&&&&& DWORD nEntries2;&& & &&&&&&&&&&& pRes2 = (PIMAGE_RESOURCE_DIRECTORY)((DWORD)pRes&& &&&&&&&&&&&&&&&&&&&&&&& + (~IMAGE_RESOURCE_DATA_IS_DIRECTORY & pEntry-&OffsetToData));&& &&&&&&&&&&& nEntries2 = pRes2-&NumberOfIdEntries + pRes2-&NumberOfNamedE&& &&&&&&&&&&& pEntry2 = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((DWORD)pRes2 + sizeof(IMAGE_RESOURCE_DIRECTORY));&& &&&&&&&&&&&&&& &&&&&&&&&&& for (DWORD j = 0; j & nEntries2; ++j, ++pEntry2) {&& &&&&&&&&&&&&&&& if (IMAGE_RESOURCE_NAME_IS_STRING & pEntry2-&Name) {&& &&&&&&&&&&&&&&&&&&& PIMAGE_RESOURCE_DIR_STRING_U pDirS&& &&&&&&&&&&&&&&&&&&& pDirStr = (PIMAGE_RESOURCE_DIR_STRING_U)((DWORD)pRes&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& + (~IMAGE_RESOURCE_NAME_IS_STRING & pEntry2-&Name));&& &&&&&&&&&&&&&&& }&& &&&&&&&&&&&&&&& if (IMAGE_RESOURCE_DATA_IS_DIRECTORY & pEntry2-&OffsetToData) {&& &&&&&&&&&&&&&&&&&&& PIMAGE_RESOURCE_DIRECTORY pRes3;&& &&&&&&&&&&&&&&&&&&& PIMAGE_RESOURCE_DIRECTORY_ENTRY pEntry3;&& &&&&&&&&&&&&&&&&&&& DWORD nEntries3;&& & &&&&&&&&&&&&&&&&&&& pRes3 = (PIMAGE_RESOURCE_DIRECTORY)((DWORD)pRes&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& + (~IMAGE_RESOURCE_DATA_IS_DIRECTORY & pEntry2-&OffsetToData));&& &&&&&&&&&&&&&&&&&&& nEntries3 = pRes3-&NumberOfIdEntries + pRes3-&NumberOfNamedE&& &&&&&&&&&&&&&&&&&&& pEntry3 = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((DWORD)pRes3 + sizeof(IMAGE_RESOURCE_DIRECTORY));&& & &&&&&&&&&&&&&&&&&&& for (DWORD k = 0; k & nEntries3; ++k) {&& &&&&&&&&&&&&&&&&&&&&&&& PIMAGE_RESOURCE_DATA_ENTRY pD&& & &&&&&&&&&&&&&&&&&&&&&&& assert(~IMAGE_RESOURCE_DATA_IS_DIRECTORY & pEntry3-&OffsetToData);&& & &&&&&&&&&&&&&&&&&&&&&&& pData = (PIMAGE_RESOURCE_DATA_ENTRY)((DWORD)pRes + pEntry3-&OffsetToData);&& &&&&&&&&&&&&&&&&&&&&&&& pData-&OffsetToData += (DWORD)&& &&&&&&&&&&&&&&&&&&& }&& &&&&&&&&&&&&&&& }&& &&&&&&&&&&& }&& & &&&&&&& }&& &&& }&& & &&& return TRUE;&& }&& & BOOL RelocPeModule(PIMAGE_BASE_RELOCATION pBlc, DWORD imagebase, int offsetRlc)&& {&& &&& DWORD vaddr, count, offset,&& &&& WORD *items = NULL;&& & &&& while (NULL != pBlc-&VirtualAddress) {&& &&&&&&& vaddr = imagebase + pBlc-&VirtualA&& & &&&&&&& count = (pBlc-&SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) && 1;&& &&&&&&& items = (WORD *)((char *)pBlc + sizeof(IMAGE_BASE_RELOCATION));&& & &&&&&&& for (DWORD i = 0; i & ++i) {&& &&&&&&&&&&& offset = items[i] & 0x0&& &&&&&&&&&&& type = items[i] && 12;&& & &&&&&&&&&&& if (type == 3) {&& &&&&&&&&&&&&&&& *(DWORD *)(vaddr + offset) += offsetR&& &&&&&&&&&&& }&& &&&&&&& }&& &&&&&&& pBlc = (PIMAGE_BASE_RELOCATION)(items + count);&& &&& }&& & &&& return TRUE;&& }&& & BOOL FixupExport(PIMAGE_EXPORT_DIRECTORY pExp, DWORD imagebase)&& {&& &&& return TRUE;&& }&& & BOOL FixupImport(PIMAGE_IMPORT_DESCRIPTOR pImp, DWORD imagebase)&& {&& &&& PIMAGE_THUNK_DATA pOrgThunk, pFirstT&& &&& PIMAGE_IMPORT_BY_NAME pImportN&& & &&& DebugPrint("/n/n------------import table info------------/n");&& & &&& while (NULL != pImp-&OriginalFirstThunk) {&& &&&&&&& pImp-&Name +=&& & &&&&&&& DebugPrint("DLL: %s/n", pImp-&Name);&& & &&&&&&& FARPROC fpF&& &&&&&&& HINSTANCE hInstance = LoadLibraryA((LPCSTR)pImp-&Name);&& &&&&&&& if (NULL == hInstance) {&& &&&&&&&&&&& printf("Load library %s failed, error: %d/n", pImp-&Name, GetLastError());&& &&&&&&&&&&& return FALSE;&& &&&&&&& }&& & &&&&&&& pOrgThunk = (PIMAGE_THUNK_DATA)(imagebase + pImp-&OriginalFirstThunk);&& &&&&&&& pFirstThunk = (PIMAGE_THUNK_DATA)(imagebase + pImp-&FirstThunk);&& & &&&&&&& while (NULL != *(DWORD *)pOrgThunk) {&& &&&&&&&&&&& if (pOrgThunk-&u1.Ordinal & IMAGE_ORDINAL_FLAG32) {&& &&&&&&&&&&&&&&& fpFun = GetProcAddress(hInstance, (LPCSTR)(pOrgThunk-&u1.Ordinal & 0x0000ffff));&& & &&&&&&&&&&&&&&& //DebugPrint("/t0x%x/n", pOrgThunk-&u1.Ordinal);&& &&&&&&&&&&& }&& &&&&&&&&&&& else {&& &&&&&&&&&&&&&&& pImportName = (PIMAGE_IMPORT_BY_NAME)(imagebase + pOrgThunk-&u1.AddressOfData);&& &&&&&&&&&&&&&&& fpFun = GetProcAddress(hInstance, (LPCSTR)pImportName-&Name);&& & &&&&&&&&&&&&&&& //DebugPrint("/t%s/n", pImportName-&Name);&& &&&&&&&&&&& }&& & &&&&&&&&&&& //DebugPrint("/t/t0x%x/n", fpFun);&& & &&&&&&&&&&& pFirstThunk-&u1.Ordinal = (LONG)fpF&& &&&&&&&&&&&&&& &&&&&&&&&&& ++pFirstT&& &&&&&&&&&&& ++pOrgT&& &&&&&&& }&& &&&&&&& FreeLibrary(hInstance);&& & &&&&&&& ++pI&& &&& }&& & &&& return TRUE;&& }&& & int LoadPeModule(const char * name, int argc, _TCHAR* argv[])&& {&& &&& CLocalFile lf(name);&& &&& LPVOID&& &&& PeI&& &&& MODULEINFO&& & &&& /* 验证是否为合法的pe文件 */& &&& assert(IsPEFile(lf));&& & &&& /* 处理nt header,获取pe文件的相关信息 */& &&& ParseNTHeader(lf, pe);&& & &&& /*为image按照imageBase优先原则分配空间地址。& &&&& *如该空间地址已被reserved或commit,则重新分配一个可用的空间地址,& &&&& *但此种情况下需要做基址重定位处理。*/& &&& addr = VirtualAlloc((LPVOID)(pe.imageBase),&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& pe.imageSize,&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& MEM_RESERVE | MEM_COMMIT,&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& PAGE_EXECUTE_READWRITE);&& &&& if (NULL == addr) {&& &&&&&&& printf("VirtualAlloc failed, error: %d/n", GetLastError());&& &&&&&&& addr = VirtualAlloc(NULL, pe.imageSize, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);&& &&&&&&& if (NULL == addr) {&& &&&&&&&&&&& printf("VirtualAlloc failed, error: %d/n", GetLastError());&& &&&&&&&&&&& return -1;&& &&&&&&& }&& &&& }&& &&& memset((void *)addr, 0, pe.imageSize);&& & &&& mi.EntryPoint = (LPVOID)pe.entryP&& &&& mi.lpBaseOfDll = (LPVOID)&& &&& mi.SizeOfImage = pe.imageS&& & &&& /* 把sections加载到内存 */& &&& LoadSections(lf, pe, mi);&& & &&& /* 如果实际分配的空间地址和pe文件的基址不一样,则需要做基址重定位处理 */& &&& if ((int)mi.lpBaseOfDll != pe.imageBase) {&& &&&&&&& if (0 == pe.relocSize) {&& &&&&&&&&&&& printf("Cannot reloc address!/n");&& &&&&&&&&&&& return -1;&& &&&&&&& }&& &&&&&&& PIMAGE_BASE_RELOCATION pBrlc = (PIMAGE_BASE_RELOCATION)((DWORD)mi.lpBaseOfDll + pe.relocRva);&& &&&&&&& RelocPeModule(pBrlc, (DWORD)mi.lpBaseOfDll, (DWORD)mi.lpBaseOfDll - pe.imageBase);&& &&& }&& & &&& /* 如果该pe文件有导出表,则处理导出表区段 */& &&& if (0 != pe.exSize) {&& &&&&&&& PIMAGE_EXPORT_DIRECTORY pExp = (PIMAGE_EXPORT_DIRECTORY)((DWORD)mi.lpBaseOfDll + pe.exRva);&& &&&&&&& FixupExport(pExp, (DWORD)mi.lpBaseOfDll);&& &&& }&& & &&& /* 如果pe文件有资源文件,则需要处理资源区段 */& &&& if (0 != pe.resSize) {&& &&&&&&& PIMAGE_RESOURCE_DIRECTORY pRes = (PIMAGE_RESOURCE_DIRECTORY)((DWORD)mi.lpBaseOfDll + pe.resRva);&& &&&&&&& FixupResource(pRes, (DWORD)mi.lpBaseOfDll, (DWORD)mi.lpBaseOfDll - pe.imageBase);&& &&& }&& & &&& /* 如果pe文件有导入表,则需要处理导入表区段 */& &&& if (0 != pe.imSize) {&& &&&&&&& PIMAGE_IMPORT_DESCRIPTOR pImp = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)mi.lpBaseOfDll + pe.imRva);&& &&&&&&& FixupImport(pImp, (DWORD)mi.lpBaseOfDll);&& &&& }&& & &&& DebugPrint("/n/nentry: 0x%x/n/n", (DWORD)mi.EntryPoint + (DWORD)mi.lpBaseOfDll);&& & &&& /* 进入该pe文件的entry pointer,执行该pe文件 */& &&& __asm {&& &&&&&&&&& &&&&&&&&& &&&&&&& mov eax, mi.EntryP&& &&&&&&& add eax, mi.lpBaseOfD&& &&&&&&&&& &&& }&& }&& & int _tmain(int argc, _TCHAR* argv[])&& {&& &&& //LoadPeModule("HelloWorld.exe", argc - 1, argv + 1);&& &&& LoadPeModule("btnlook.exe", argc - 1, argv + 1);&& & &&& return 0;&& }&
本文来自CSDN博客,转载请标明出处:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:699801次
积分:8220
积分:8220
排名:第1603名
原创:63篇
转载:338篇
评论:108条
(3)(1)(4)(7)(5)(3)(8)(3)(1)(4)(4)(1)(3)(8)(5)(3)(1)(3)(3)(4)(7)(21)(3)(11)(6)(1)(2)(13)(8)(11)(6)(12)(26)(7)(16)(5)(13)(1)(2)(13)(6)(4)(8)(11)(4)(2)(9)(1)(1)(1)(3)(2)(5)(4)(3)(1)(1)(1)(6)(1)(1)(1)(3)(6)(2)(5)(2)(6)(1)(2)(3)(7)(6)(12)(1)(3)(12)(15)(5)教你怎么汉化WINPE系统 - 通用PE工具箱
WINPE是英文版的,而自己的英语又不太好,完全看不懂WINPE启动时出现的英文。是不是给你造成不小的困扰呢?不如跟我一起来汉化WINPE吧!一、首先找到&setupldr.bin&文件,将“Loading RAMDISK image...”改为“正在加载RAMDISK映像...”。二、将“setupldr.bin”文件中的“Please wait...”修改成“请等待...”;三、将“setupldr.bin”文件中的”Press F6 if you need to install a third party SCSI or RAID driver...“修改成 “按F6如果您需要安装第三方SCSI或RAID驱动程序”;四、在“ TXTSETUP.SIF”里,将loaderprompt=“Starting Micro Uepon PE ...”改为loaderprompt=“正在启动Windows PE系统维护光盘 ...”,具体可以自己定义loaderprompt的内容。注:还需在根目录下增加“Bootfont.bin”文件。这个可以在XP系统根目录下拷贝过来。
热门常见问题利用通用pe制作多启动U盘
暑假有空,想搞个多启动U盘,pe+linux+dos的,打算用grub4dos实现,结果win7下无法安装grub到U盘,grubinst无法在win7下运行,总是报错,想在ubuntu下做,可因为ubuntu对ivybridge驱动不好刚卸载了,只能想点偏路。
一直是喜欢通用pe的,就下了win7内核的pe,安装选项里发现可以通过grub启动,就选了pe+maxdos的选项,装完后,选显示系统文件,在U盘根目录看到了7777这个文件夹,打开后傻了,和grub结构不同啊,menu.lst为毛不见了呢?不过有7777.ini文件,打开后发现与menu.lst内容相似,语法相同,就照着以前做法做了多启动盘,顺便把maxdos换了,换成功能多些的dos工具箱,实验了几次发现若要加上linux的话必须只能有一层目录,我加了beini和dsl,一开始为了美观共3层目录(7777这还有一层),结果beini无法加载tce里的软件和驱动,dsl更是只剩字符界面,连busybox都没有,后来把boot,tce等文件夹直接放在根目录,就解决了,但beini的背景有时正常有时是corelinux的,但这个不要紧。
最后启动项是pe+dos+dsl+beini+menuetos,还放了nod32进去,dos和pe下能杀毒,虽然几乎没中过毒,还加了个menuetos进去,虽然鸡肋,但贵在好玩,grub启动界面真心不错,佩服通用pe的设计,以前我做的启动界面就是一坨*。
& &为了美观和方便,把文件夹设成系统文件,cmd下
&attrib 目标文件夹或文件 +s +h +r
就行了,但nod32文件夹不能设为隐藏,不然dos下认不到。
& & 贴下7777.ini的内容:
timeout 10
gfxmenu /7777/MESSAGE
title [01] PE
find --set-root /7777/7PE_MGR
chainloader /7777/7PE_MGR
title [02] DOStools
map --mem /7777/DOSTOOLS.IMG (fd0)
map --hook
chainloader (fd0)+1
rootnoverify (fd0)
title [03] DSL
kernel /dboot/isolinux/linux24
ramdisk_size=100000&
initrd /dboot/isolinux/minirt24.gz
title [04] Beini
kernel /boot/bzImage quiet waitusb=6
initrd /boot/tinycore.gz
title [05] menuetos
map --mem /7777/menuetos.img (fd0)
map --hook
chainloader (fd0)+1
rootnoverify (fd0)
title [06] Reboot
title [07] Shutdown
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。多个PE启动实现方法-老毛桃winpe u盘
多个PE启动实现方法
有些朋友想在启动盘中集成多个PE,其实这也不难,现在就来说说实现的方法:
首先安装好 EASYBOOT、WINHEX(或ULTRAEDIT)、ULTRAISO 这3个软件。在硬盘上建立一个临时目录,如D:\BOOT,再建二级子目录EZBOOT,把EASYBOOT需要的几个文件EZBOOT.DAT,LOADER.BIN,CDMENU.EZB(样例文件)拷贝到EZBOOT目录。
一、首先了解WinPE光盘的启动过程:
以老毛桃WinPE的BOOTCD_070310.ISO文件为例,这个ISO文件是个可引导的光盘文件,用ULTRAISO打开这个ISO文件,保存引导文件到D:\BOOT\EZBOOT\XP.BIF,把光盘中所有文件提取到D:\BOOT。
从上面的目录结构可以看出WinPE光盘的引导过程,首先启动引导文件XP.BIF,再找到WXPE目录下SETUPLDR.BIN,读取WINNT.XPE,加载WINPE.IS_,再启动WINPE,即:XP.BIF-&SETUPLDR.BIN-&WINNT.XPE-&WINPE.IS_-&(注:easyboot从版本5.08开始,加入了BCDW命令,如果你的EASYBOOT版本比5.08新,都是支持BCDW命令的。从EASYBOOT的安装目录中拷贝BCDW.BIN到上面D:\BOOT\EZBOOT,在菜单中原来用RUN XP.BIF 用下面命令代替BCDW \WXPE\SETUPLDR.BIN,这里注意写上光盘绝对路径。原这样的XP.BIF文件就可删除了)。
二、如何集成老毛桃的第二个WinPE:
因为老毛桃的WINPE,启动文件都是相同的,所以,需要将它改名。以集成老毛桃的BOOTCD_070305.ISO为例,用ULTRAISO打开保存引导文件为XP305.BIF放到D:\BOOT\EZBOOT,把WXPE\SETUPLDR.BIN提取改名为SETUPLDR.305放到D:\BOOT\WXPE。这里XP305.BIF引导后要找的文件是SETUPLDR.BIN,所以要修改XP305.BIF文件,用WINHEX打开,把所有SETUPLDR.BIN替换为SETUPLDR.305,保存。同样WINNT.XPE名字相同,提取后改名为WINNT.305拷贝到D:\BOOT,用WINHEX打开SETUPLDR.305,把所有WINNT.XPE替换为WINNT.305,保存。同样WINPE.IS_名字相同,提取后改名为WINPE305.IS_,拷贝到D:\BOOT,用记事本打开WINNT.305,把里面的WINPE.IS_替换为WINPE305.IS_。
三、如何修改外置程序目录名:
多个winpe系统,使用同一个外置程序不太可能,特别是XPPE和2003PE同时在一个光盘的情况。上面BOOTCD_070305.ISO为例,提取外置程序改名为外置程序305,拷贝到D:\BOOT,把WINPE305.IS_改名WINPE305.CAB(或.RAR),用WINRAR打开得到一个WINPE.ISO文件,用ULTRAISO打开,提取\WXPE\SYSTEM32\PECMD.INI,用记事本打开,把里面所有的&\外置程序&替换为&\外置程序305&,保存再替换到WINPE.ISO文件中。再把这个WINPE.ISO压缩为WINPE305.IS_拷贝替换到D:\BOOT。同时修改\外置程序305目录下的WINPE.INI文件内容,把所有&外置程序&替换为&外置程序305&。
四、光盘内IS_(ISO)与IM_(IM_)启动文件有什么不同:
就一个文件内容不同,如WINNT.305,IM_(IM_) 内容是:
[SetupData]
BootDevice = &ramdisk(0)&
BootPath = &\WXPE\System32\&
OsLoadOptions = &/minint /fastdetect /rdpath=WinPE.IM_&
IS_(ISO)内容是:
[SetupData]
BootDevice=&ramdisk(0)&
BootPath=&\WXPE\SYSTEM32\&
OsLoadOptions=&/minint /fastdetect /rdexportascd /rdpath=WinPE.IS_&
上面注意系统目录及文件名不要错(以RAMDISK方式为例)。
五、用EASYBOOT集成:
这步没什么好讲的,应该都会,每个菜单对应,要注意的是选上&优化光盘文件&、&DOS&、&Joliet&,其中最后一个表示支持长文件(目录)名。
向大家介绍一个快速启动技巧:
1、用WinRAR将WinPE.IM_或WinPE.IS_解压缩得到WinPE.IMG和WinPE.ISO,取代ISO镜像里面的IM_或者IS_文件;
2、用记事本修改WINNT.SIF和WINNT.XPE,将WinPE.IM_或WinPE.IS_改为WinPE.IMG和WinPE.ISO;
3、替换setup/setup.bat里面的WinPE.IM_和WinPE.IS_为WinPE.IMG和WinPE.ISO;
这样,虽然WinPE体积增加了(估计一张CD放下没有问题),但是启动时节约了解压CBA文件的时间,启动速度明显增加。}

我要回帖

更多关于 imageloader使用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信