Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void SetFlags(IMAGE_SECTION_HEADER* pSectHeader) {
- pSectHeader->Characteristics = 2684354592;
- }
- void CompleteSection(IMAGE_NT_HEADERS *pHeader, IMAGE_SECTION_HEADER *pLastSectHeader, LPBYTE pBase, TCHAR *FileName) {
- unsigned long FileAlignment = pHeader->OptionalHeader.FileAlignment;
- unsigned long SectionAlignment = pHeader->OptionalHeader.SectionAlignment;
- IMAGE_SECTION_HEADER* pFirstSectHeader = IMAGE_FIRST_SECTION(pHeader);
- unsigned long StartPoint = pFirstSectHeader->VirtualAddress;
- unsigned long FinishPoint = pLastSectHeader->VirtualAddress;
- unsigned long RVAAddress = pHeader->OptionalHeader.AddressOfEntryPoint;
- unsigned long TempEntryPoint = pHeader->OptionalHeader.BaseOfCode;
- printf("\nInit Address...\nStart Address = %d\nFinish Adress = %d\nNumber of Characters = %d\n",
- StartPoint, FinishPoint, FinishPoint - StartPoint);
- printf("Start Writing Encoder Data ");
- FILE *BinaryGoal = fopen(FileName, "ab+");
- if (!BinaryGoal) {
- printf("Error! File is not opened (BinaryFile)!\n");
- return;
- }
- fseek(BinaryGoal, pLastSectHeader->SizeOfRawData + pLastSectHeader->PointerToRawData, SEEK_SET);
- struct output *StartInHex = GetASMValue(StartPoint);
- struct output *FinishInHex = GetASMValue(FinishPoint);
- struct output *NumberOfData = GetASMValue(FinishPoint - StartPoint);
- struct output *EntryPoint = GetASMValue(TempEntryPoint);
- int data[] = {
- 0xB8,/* mov eax + 4 byte*/
- 0xBB, /*mov ebx + 4 byte*/
- 0x66, 0xB9,/*mov cx + 2 byte*/
- 0x8A, 0x28,/*mov,ch,eax*/
- 0x80, 0xF5, 0x02, /*xor ch, 2*/
- 0x88, 0x28, /*mov [eax], ch*/
- 0x40, /*inc eax*/
- 0xE2, 0xF6, /*loop*/
- 0xFF, 0xE3 /*jmp ebx*/
- };
- int i = 4;
- int j = 0;
- fprintf(BinaryGoal, "%с", data[0]);
- for (j = 0; j < StartInHex->length; j++)
- fprintf(BinaryGoal, "%с", StartInHex->digit[j]);
- while (j < 4) {
- fprintf(BinaryGoal, "%с", 0);
- j++;
- }
- fprintf(BinaryGoal, "%c", data[1]);
- for (j = 0; j < EntryPoint->length; j++)
- fprintf(BinaryGoal, "%c", EntryPoint->digit[j]);
- while (j < 4) {
- fprintf(BinaryGoal, "%c", 0);
- j++;
- }
- fprintf(BinaryGoal, "%c", data[2]);
- fprintf(BinaryGoal, "%c", data[3]);
- for (j = 0; j < NumberOfData->length; j++)
- fprintf(BinaryGoal, "%c", NumberOfData->digit[j]);
- while (j < 2) {
- fprintf(BinaryGoal, "%c", 0);
- j++;
- }
- for (; i < 16; i++)
- fprintf(BinaryGoal, "%c", data[i]);
- fclose(BinaryGoal);
- printf("[ok]\n");
- printf("Set Flags Value...");
- SetFlags(pLastSectHeader);
- printf("[ok]\n");
- unsigned long NewEntryPoint = pLastSectHeader->Misc.VirtualSize;
- pHeader->OptionalHeader.BaseOfCode = NewEntryPoint;
- pLastSectHeader->Misc.VirtualSize += 26;
- pLastSectHeader->SizeOfRawData += 26;
- if (pLastSectHeader->SizeOfRawData % FileAlignment) {
- unsigned long temp = pLastSectHeader->SizeOfRawData / FileAlignment;
- temp = pLastSectHeader->SizeOfRawData - (temp * FileAlignment);
- pLastSectHeader->SizeOfRawData += FileAlignment - temp;
- }
- pHeader->OptionalHeader.SizeOfImage = pLastSectHeader->Misc.VirtualSize + pLastSectHeader->VirtualAddress;
- if (pHeader->OptionalHeader.SizeOfImage % SectionAlignment) {
- unsigned long temp = pHeader->OptionalHeader.SizeOfImage / SectionAlignment;
- temp = pHeader->OptionalHeader.SizeOfImage - (temp * SectionAlignment);
- pHeader->OptionalHeader.SizeOfImage += SectionAlignment - temp;
- }
- StartPoint = pFirstSectHeader->PointerToRawData;
- FinishPoint = pLastSectHeader->PointerToRawData;
- int counter = StartPoint;
- printf("Encrypt...");
- /*XOR'ed Data*/
- while (counter != FinishPoint) {
- pBase[counter] = pBase[counter] ^ 2;
- counter++;
- }
- printf("[ok]\n");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement