1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| #include "PE.h" #include "PEStruct.h" #include "InjectPE.h"
void work05() { PEFILE peFile{ 0 }; FILE* pFile = fopen("D:\\TestDLL.dll", "rb"); int fileLength = LoadFileToMemory(pFile, &peFile); int r = fclose(pFile);
if (peFile.h_pe == nullptr) { return; } DWORD bufferImageBase = (DWORD)peFile.h_dos;
PDATA_EXPORT_DIRECTORY lpExportTable = nullptr; GetExportTable(&lpExportTable, &peFile); if (lpExportTable == nullptr) { return; }
lpPETable newTable = (lpPETable)AddSection(&peFile, (char*)".crack", 0x1000); if (newTable == nullptr) { return; } DWORD index = bufferImageBase + newTable->PointerToRawData;
DWORD functionTableFOA = Rva2Foa(lpExportTable->AddressOfFunctions, &peFile); void* functionTableAddress = (void*)(bufferImageBase + functionTableFOA); DWORD functionTableSize = sizeof(DWORD) * lpExportTable->NumberOfFunctions; memcpy((void*)index, functionTableAddress, functionTableSize); index += functionTableSize;
DWORD orderTableFOA = Rva2Foa(lpExportTable->AddressOfNameOrdinals, &peFile); void* orderTableAddress = (void*)(bufferImageBase + orderTableFOA); DWORD orderTableSize = sizeof(WORD) * lpExportTable->NumberOfNames; memcpy((void*)index, orderTableAddress, orderTableSize); index += orderTableSize;
DWORD nameTableFOA = Rva2Foa(lpExportTable->AddressOfNames, &peFile); void* nameTableAddress = (void*)(bufferImageBase + nameTableFOA); DWORD nameTableSize = sizeof(DWORD) * lpExportTable->NumberOfNames; memcpy((void*)index, nameTableAddress, nameTableSize); DWORD* newNameTableItems = (DWORD*)index; index += nameTableSize;
for (int i = 0; i < lpExportTable->NumberOfNames; i++) { DWORD nameRVA = ((DWORD*)nameTableAddress)[i]; DWORD nameFOA = Rva2Foa(nameRVA, &peFile); char* nameItem = (char*)(nameFOA + bufferImageBase); int nameSize = strlen(nameItem); memcpy((void*)index, nameItem, nameSize + 1); newNameTableItems[i] = (DWORD)index; index += nameSize + 1; }
DWORD exportDirectorySize = sizeof(DATA_EXPORT_DIRECTORY); PDATA_EXPORT_DIRECTORY lpNewExportTable = (PDATA_EXPORT_DIRECTORY)index; memcpy((void*)index, lpExportTable, exportDirectorySize); index += exportDirectorySize;
lpNewExportTable->AddressOfFunctions = Foa2Rva(functionTableFOA, &peFile); lpNewExportTable->AddressOfNameOrdinals = Foa2Rva(orderTableFOA, &peFile); lpNewExportTable->AddressOfNames = Foa2Rva(nameTableFOA, &peFile);
DWORD NewExportTableFOA = (DWORD)lpNewExportTable - bufferImageBase; DWORD NewExportTableRVA = Foa2Rva(NewExportTableFOA, &peFile); lpPe_DATA_DIRECTORY directory = &peFile.h_op->DataDirectory[0]; directory->VirtualAddress = NewExportTableRVA;
pFile = fopen("D:\\TestDLL2.dll", "wb"); DumpFileBufferToFile(pFile, &peFile); }
|