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); }
 
  |