/*个人是拉伸成imageBuffer写的所以更难计算,不过也当磨练自己了*/
BOOL test() {
//&MessageBox = 750F10E0
//读取到imagebuffer 并且套入Headers
PVOID pFileBuffer = FileToFileBuffer("C:\\Users\\12459\\Downloads\\1.exe");
PVOID pImageBuffer = FileBufferToImageBuffer(pFileBuffer);
PIMAGE_DOS_HEADER pDosHeader = pImageBuffer;
PIMAGE_NT_HEADERS pNTHeader = (DWORD)pDosHeader + pDosHeader->e_lfanew;
PIMAGE_FILE_HEADER pFileHeader = &pNTHeader->FileHeader;
PIMAGE_OPTIONAL_HEADER pOptHeader = (DWORD)pFileHeader + sizeof(IMAGE_FILE_HEADER);
PIMAGE_SECTION_HEADER pSecHeader = (DWORD)pOptHeader + pFileHeader->SizeOfOptionalHeader;
//定位需要在内存种哪个位置写入
PVOID pWritePosition = (DWORD)pImageBuffer + pSecHeader->VirtualAddress +pSecHeader->Misc.VirtualSize;
//改变OEP
pOptHeader->AddressOfEntryPoint = (DWORD)pWritePosition - (DWORD)pImageBuffer;
//写入shellcode E8后面应该是 MessageBoxA-(ImageBase + VA + VS + 9 + 5) | E9 EOP - (ImageBase + VA + VS + E + 5)
/* 算了一堆最后发现不如拖进dbg让他帮忙算*/
BYTE shellcode[] = { 0x6a,0x00,0x6a,0x00,0x6a,0x00,0x6a,0x00,0xe8,0xD9,0x42,0xcd,0x74,0xe9,0x12,0xc9,0xff,0xff };
memcpy(pWritePosition, shellcode, sizeof(shellcode));
//存盘
pImageBuffer = ImageBufferToFileBuffer("C:\\Users\\12459\\Downloads\\111.exe", pImageBuffer);
if (!pImageBuffer) {
printf("fwrite failed\n");
return FALSE;
}
free(pImageBuffer);
return TRUE;
}
在.text节中写入shellcode
于 2024-04-01 21:27:42 首次发布