很笨的方法
(写过才能知道,哪些地方,需要注意,开始想的很简单,就三部,写了 一个多小时!!)
001 | void TestMoveRelocDirectory( LPSTR lpszFile) |
008 | LPVOID pFileBuffer = NULL; |
009 | pFileBuffer= ReadPEFile(lpszFile); |
016 | PIMAGE_DOS_HEADER pDosHeader = NULL; |
017 | PIMAGE_NT_HEADERS pNTHeader = NULL; |
018 | PIMAGE_FILE_HEADER pPEHeader = NULL; |
019 | PIMAGE_OPTIONAL_HEADER32 pOptionHeader = NULL; |
020 | PIMAGE_SECTION_HEADER pSectionHeader = NULL; |
021 | PIMAGE_SECTION_HEADER pSectionHeader_ADD = NULL; |
022 | PIMAGE_DATA_DIRECTORY DataDirectory=NULL; |
025 | pDosHeader = (PIMAGE_DOS_HEADER)pFileBuffer; |
026 | pNTHeader = (PIMAGE_NT_HEADERS)(( DWORD )pFileBuffer+pDosHeader->e_lfanew); |
027 | pPEHeader = (PIMAGE_FILE_HEADER)((( DWORD )pNTHeader)+4); |
028 | pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)(( DWORD )pPEHeader+IMAGE_SIZEOF_FILE_HEADER); |
029 | pSectionHeader = (PIMAGE_SECTION_HEADER)(( DWORD )pOptionHeader+pPEHeader->SizeOfOptionalHeader); |
030 | pSectionHeader_ADD = pSectionHeader; |
033 | DWORD Header_size = pDosHeader->e_lfanew + 4 + 20 + pPEHeader->SizeOfOptionalHeader + pPEHeader->NumberOfSections*40; |
034 | if (pOptionHeader->SizeOfHeaders-Header_size<80) |
036 | printf ( "没有可用空间填充节表\n" ); |
041 | printf ( "空间:%d\n" ,pOptionHeader->SizeOfHeaders-Header_size); |
046 | PIMAGE_SECTION_HEADER pSectionHeader_LAST = (PIMAGE_SECTION_HEADER)(( DWORD )pSectionHeader+(pPEHeader->NumberOfSections-1)*40); |
047 | pSectionHeader_ADD=(PIMAGE_SECTION_HEADER)(( DWORD )pSectionHeader_ADD+(pPEHeader->NumberOfSections)*40); |
049 | strcpy (( char *)pSectionHeader_ADD->Name, "NewSec" ); |
050 | pSectionHeader_ADD->Misc.VirtualSize = 0x2000; |
051 | pSectionHeader_ADD->VirtualAddress = pOptionHeader->SizeOfImage; |
052 | pSectionHeader_ADD->SizeOfRawData = 0x2000; |
053 | pSectionHeader_ADD->PointerToRawData = pSectionHeader_LAST->PointerToRawData+pSectionHeader_LAST->SizeOfRawData; |
054 | pSectionHeader_ADD->Characteristics = pSectionHeader->Characteristics; |
057 | LPVOID pSectionEND = ( LPVOID )(( DWORD )pSectionHeader_ADD+40); |
058 | memset (pSectionEND,0,IMAGE_SIZEOF_SECTION_HEADER); |
062 | pPEHeader->NumberOfSections = pPEHeader->NumberOfSections +1; |
063 | pOptionHeader->SizeOfImage = pOptionHeader->SizeOfImage+0x2000; |
066 | FILE *pOutFile = NULL; |
072 | printf ( "无法打开文件EXE文件" ); |
076 | printf ( "length: %x \n " ,pSectionHeader_ADD->PointerToRawData+pSectionHeader_ADD->SizeOfRawData); |
078 | size_t writeSize = fwrite (pFileBuffer,pSectionHeader_ADD->PointerToRawData,1,pOutFile); |
079 | printf ( "WirteSize:%d\n" ,writeSize); |
081 | LPVOID pNewBuffer=( LPVOID ) malloc (0x2000); |
084 | printf ( "pNewBuffer分配空间失败\n" ); |
087 | memset (pNewBuffer,0,0x2000); |
088 | writeSize = fwrite (pNewBuffer,0x2000,1,pOutFile); |
099 | pDosHeader = (PIMAGE_DOS_HEADER)pFileBuffer; |
100 | pNTHeader = (PIMAGE_NT_HEADERS)(( DWORD )pFileBuffer+pDosHeader->e_lfanew); |
101 | pPEHeader = (PIMAGE_FILE_HEADER)((( DWORD )pNTHeader)+4); |
102 | pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)(( DWORD )pPEHeader+IMAGE_SIZEOF_FILE_HEADER); |
103 | pSectionHeader = (PIMAGE_SECTION_HEADER)(( DWORD )pOptionHeader+pPEHeader->SizeOfOptionalHeader); |
105 | pSectionHeader_ADD=(PIMAGE_SECTION_HEADER)(( DWORD )pSectionHeader+(pPEHeader->NumberOfSections-1)*40); |
108 | DataDirectory = pOptionHeader->DataDirectory; |
112 | printf ( "IMAGE_DIRECTORY_ENTRY_BASERELOC: Address: %x ,Size: %x \n" ,DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress, |
113 | DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size); |
116 | DWORD FoA = RVAToFileOffset(pFileBuffer,0x2df10); |
118 | DWORD BaseReloc_Directory_Address = DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress; |
119 | DWORD BaseReloc_Directory_Size = DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size; |
120 | FoA = RVAToFileOffset(pFileBuffer,BaseReloc_Directory_Address); |
124 | PIMAGE_BASE_RELOCATION pRelocData = (PIMAGE_BASE_RELOCATION)(( DWORD )pFileBuffer + FoA); |
125 | PIMAGE_BASE_RELOCATION pRelocData_Start = (PIMAGE_BASE_RELOCATION)(( DWORD )pFileBuffer + FoA); |
127 | DWORD sizeOfRelocDirectory = 0; |
129 | while (pRelocData->VirtualAddress||pRelocData->SizeOfBlock) |
131 | DWORD RelocVirtualAddress = pRelocData->VirtualAddress; |
132 | DWORD RelocSize = pRelocData->SizeOfBlock; |
134 | sizeOfRelocDirectory = sizeOfRelocDirectory + RelocSize; |
136 | pRelocData = (PIMAGE_BASE_RELOCATION)(( DWORD )pRelocData + RelocSize); |
143 | PDWORD myRelocLoc = (PDWORD)pSectionHeader_ADD->PointerToRawData; |
144 | printf ( "Reloc: %x , Size: %x \n" ,pRelocData,sizeOfRelocDirectory); |
148 | LPVOID destStart = ( LPVOID )(( DWORD )pFileBuffer + ( DWORD )myRelocLoc); |
150 | printf ( "pFileBuffer:%x, myRelocLoc: %x \n" ,pFileBuffer,destStart); |
152 | LPVOID srcStart = ( LPVOID )(pRelocData_Start); |
154 | memcpy (destStart,srcStart,sizeOfRelocDirectory); |
158 | DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress = FileOffsetToRVA(pFileBuffer,pSectionHeader_ADD->PointerToRawData); |
161 | DWORD FileSize = pSectionHeader_ADD->PointerToRawData + pSectionHeader_ADD->SizeOfRawData; |
0则评论给“重定位表的移动”