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
| void work08() { PEFILE peFile{ 0 }; FILE* pFile = fopen("D:\\1.exe", "rb");
int fileLength = LoadFileToMemory(pFile, &peFile); int r = fclose(pFile);
if (peFile.h_pe == nullptr) { return; } DWORD bufferImageBase = (DWORD)peFile.h_dos;
PDATA_IMPORT_DIRECTORY pImportTable = nullptr; GetImportTable(&pImportTable, &peFile);
lpPETable newTable = (lpPETable)AddSection(&peFile, (char*)".crack", 0x1000); if (newTable == nullptr) { return; } DWORD index = bufferImageBase + newTable->PointerToRawData; const char* dllName = "TestDLL.dll"; DWORD dllNameFOA = index - bufferImageBase; DWORD dllNameRVA = Foa2Rva(dllNameFOA, &peFile); memcpy((LPVOID)index, dllName, strlen(dllName) + 1); index += strlen(dllName) + 1;
int importTableIndex = 0; PDATA_IMPORT_DIRECTORY pNewImportTable = (PDATA_IMPORT_DIRECTORY)index; while ((pImportTable + importTableIndex)->Characteristics != NULL) { memcpy( pNewImportTable + importTableIndex, pImportTable + importTableIndex, sizeof(DATA_IMPORT_DIRECTORY) ); index += sizeof(DATA_IMPORT_DIRECTORY); importTableIndex++; } PDATA_IMPORT_DIRECTORY newImportDirectory = (PDATA_IMPORT_DIRECTORY)index; index += sizeof(DATA_IMPORT_DIRECTORY); memset((LPVOID)index, 0, sizeof(DATA_IMPORT_DIRECTORY)); index += sizeof(DATA_IMPORT_DIRECTORY);
const char* funcNameStr = "mul"; PDATA_IMPORT_BY_NAME funcName = (PDATA_IMPORT_BY_NAME)index; DWORD funcNameRVA = Foa2Rva((DWORD)funcName - bufferImageBase, &peFile); funcName->Hint = 0; memcpy(funcName->Name, funcNameStr, strlen(funcNameStr) + 1); index += sizeof(WORD) + strlen(funcNameStr) + 1;
PDATA_THUNK_DATA lpNewINT = (PDATA_THUNK_DATA)index; index += sizeof(PDATA_THUNK_DATA); lpNewINT->AddressOfData = funcNameRVA; memset((LPVOID)index, 0, sizeof(PDATA_THUNK_DATA)); index += sizeof(PDATA_THUNK_DATA);
PDATA_THUNK_DATA lpNewIAT = (PDATA_THUNK_DATA)index; index += sizeof(PDATA_THUNK_DATA); lpNewIAT->AddressOfData = funcNameRVA; memset((LPVOID)index, 0, sizeof(PDATA_THUNK_DATA)); index += sizeof(PDATA_THUNK_DATA);
newImportDirectory->Name = dllNameRVA; newImportDirectory->OriginalFirstThunk = Foa2Rva((DWORD)lpNewINT - bufferImageBase, &peFile); newImportDirectory->FirstThunk = Foa2Rva((DWORD)lpNewIAT - bufferImageBase, &peFile); newImportDirectory->TimeDateStamp = 0;
lpPe_DATA_DIRECTORY lpImportDirectory = &peFile.h_op->DataDirectory[1]; lpImportDirectory->VirtualAddress = Foa2Rva((DWORD)pNewImportTable - bufferImageBase, &peFile);
pFile = fopen("D:\\2.exe", "wb"); DumpFileBufferToFile(pFile, &peFile); }
|