日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

移动重定位表到新增节

發(fā)布時間:2025/3/21 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 移动重定位表到新增节 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、為什么要移動重定位表

數(shù)據(jù)目錄中的表是分散在各個節(jié)里的,如果對節(jié)進(jìn)行加密,操作系統(tǒng)找不到表,就無法加載程序。因此加密前要先把表移動到新的節(jié)里。

二、怎么移動

計算重定位表的大小,首先要遍歷重定位表,累加 SizeOfBlock,然后新增一個節(jié),大小是表的大小文件對齊。最后把表復(fù)制到新增節(jié)的開頭,然后更新數(shù)據(jù)目錄的VirtualAddress指向新的重定位表。

三、代碼

// 移動重定位表到新增節(jié),返回新緩沖區(qū)的大小 DWORD MoveRelocationTableToNewSection(LPVOID pFileBuffer, LPVOID *pNewFileBuffer, DWORD dwFileBufferSize) {PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pFileBuffer;PIMAGE_FILE_HEADER pPEHeader = (PIMAGE_FILE_HEADER)(pDosHeader->e_lfanew + (DWORD)pDosHeader + 4);PIMAGE_OPTIONAL_HEADER32 pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader + sizeof(IMAGE_FILE_HEADER));PIMAGE_SECTION_HEADER pSectionHeader = \(PIMAGE_SECTION_HEADER)((DWORD)pOptionHeader + pPEHeader->SizeOfOptionalHeader);PIMAGE_BASE_RELOCATION pRelocationTable = (PIMAGE_BASE_RELOCATION)((DWORD)pFileBuffer + \RvaToFoa(pFileBuffer, pOptionHeader->DataDirectory[5].VirtualAddress));size_t i = 0;DWORD dwRelocationTableSize = 0;while (pRelocationTable->VirtualAddress || pRelocationTable->SizeOfBlock){dwRelocationTableSize += pRelocationTable->SizeOfBlock;//printf("%x\n", (pRelocationTable->SizeOfBlock - 8) / 2 );pRelocationTable = (PIMAGE_BASE_RELOCATION)((DWORD)pRelocationTable + pRelocationTable->SizeOfBlock);}DWORD dwNewBufferSize = AddSection(pFileBuffer, pNewFileBuffer, dwFileBufferSize, \Align(dwRelocationTableSize, pOptionHeader->FileAlignment));pDosHeader = (PIMAGE_DOS_HEADER)*pNewFileBuffer;pPEHeader = (PIMAGE_FILE_HEADER)(pDosHeader->e_lfanew + (DWORD)pDosHeader + 4);pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader + sizeof(IMAGE_FILE_HEADER));pSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)pOptionHeader + pPEHeader->SizeOfOptionalHeader);// 修改新增節(jié)屬性為可讀、含已初始化數(shù)據(jù)pSectionHeader[pPEHeader->NumberOfSections - 1].Characteristics = 0x40000040;// 指針指向重定位表pRelocationTable = (PIMAGE_BASE_RELOCATION)((DWORD)*pNewFileBuffer + \RvaToFoa(*pNewFileBuffer, pOptionHeader->DataDirectory[5].VirtualAddress));// 定義插入點為新增節(jié)的起始地址LPVOID pInsert = (LPVOID)((DWORD)*pNewFileBuffer + pSectionHeader[pPEHeader->NumberOfSections - 1].PointerToRawData);// 拷貝重定位表memcpy(pInsert, (LPVOID)pRelocationTable, dwRelocationTableSize);// 更新目錄項,指向新的重定位表pOptionHeader->DataDirectory[5].VirtualAddress = FoaToRva(*pNewFileBuffer, \(DWORD)pInsert - (DWORD)*pNewFileBuffer);return dwNewBufferSize; }

四、運行結(jié)果

修改前和修改后對比

五、完整代碼

https://blog.csdn.net/Kwansy/article/details/106234264

總結(jié)

以上是生活随笔為你收集整理的移动重定位表到新增节的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。