|
upx3.03 unpack self MessageBox Code
Hello Everyone!This Is one UnpackMe,Use upx3.03 Target,Self Analyze ,Write Unpacker Code,This No Is one General Unpack Code.Pelloc Compile,Recovery Windows Extension Option! Code: #include <windows.h> #include <stdlib.h> #include "upx.h" #ifndef _IMAGEHLP_H #include "imagehlp.h" #pragma comment ( lib, "imagehlp.lib" ) #endif IMAGE_DOS_HEADER *DosHeader = NULL; //DOSͷ IMAGE_NT_HEADERS *NtHeader = NULL; //NTͷ IMAGE_FILE_HEADER *FileHeader = NULL; //�ļ�ͷ IMAGE_OPTIONAL_HEADER32 *OptHeader = NULL; //��ѡͷ IMAGE_SECTION_HEADER *SecHeader =NULL; IMAGE_IMPORT_DESCRIPTOR *pIID = NULL; //����Ŀ¼ DWORD dwImportBase; PIMAGE_DOS_HEADER GetDosHeader(LPVOID ImageBase) { //////////////////////////////�ṹ���� PIMAGE_DOS_HEADER pDosHeader = NULL; /////////////////////////////���DosHeader�ṹ pDosHeader = (PIMAGE_DOS_HEADER)ImageBase; return pDosHeader; } PIMAGE_NT_HEADERS GetNtHeader(LPVOID ImageBase) { //////////////////////////////�ṹ���� PIMAGE_DOS_HEADER pDosHeader = NULL; PIMAGE_NT_HEADERS pNtHeader = NULL; /////////////////////////////���NtHeader�ṹ pDosHeader = (PIMAGE_DOS_HEADER)ImageBase; pNtHeader = (PIMAGE_NT_HEADERS32)((DWORD)pDosHeader+pDosHeader->e_lfanew); return pNtHeader; } PIMAGE_FILE_HEADER GetFileHeader(LPVOID ImageBase) { //////////////////////////////�ṹ���� PIMAGE_DOS_HEADER pDosHeader = NULL; PIMAGE_NT_HEADERS pNtHeader = NULL; PIMAGE_FILE_HEADER pFileHeader = NULL; /////////////////////////////���FileHeader�ṹ pDosHeader = (PIMAGE_DOS_HEADER)ImageBase; pNtHeader = (PIMAGE_NT_HEADERS32)((DWORD)pDosHeader+pDosHeader->e_lfanew); pFileHeader =(PIMAGE_FILE_HEADER)&pNtHeader->FileHeader; return pFileHeader; } PIMAGE_OPTIONAL_HEADER GetOptionalHeader(LPVOID ImageBase) { //////////////////////////////�ṹ���� PIMAGE_DOS_HEADER pDosHeader = NULL; PIMAGE_NT_HEADERS pNtHeader = NULL; PIMAGE_OPTIONAL_HEADER pOptionHeader = NULL; /////////////////////////////���OptionalHeader�ṹ pDosHeader = (PIMAGE_DOS_HEADER)ImageBase; pNtHeader = (PIMAGE_NT_HEADERS32)((DWORD)pDosHeader+pDosHeader->e_lfanew); pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)&pNtHeader->OptionalHeader; return pOptionHeader; } PIMAGE_SECTION_HEADER GetSectionHeader(LPVOID ImageBase) { //////////////////////////////�ṹ���� PIMAGE_DOS_HEADER pDosHeader = NULL; PIMAGE_NT_HEADERS pNtHeader = NULL; PIMAGE_OPTIONAL_HEADER pOptionHeader = NULL; PIMAGE_FILE_HEADER pFileHeader = NULL; PIMAGE_SECTION_HEADER pSecHeader = NULL; /////////////////////////////���SectionHeader�ṹ pDosHeader = (PIMAGE_DOS_HEADER)ImageBase; pNtHeader = (PIMAGE_NT_HEADERS32)((DWORD)pDosHeader+pDosHeader->e_lfanew); pFileHeader =(PIMAGE_FILE_HEADER)&pNtHeader->FileHeader; pOptionHeader = (PIMAGE_OPTIONAL_HEADER)&pNtHeader->OptionalHeader; pSecHeader =(PIMAGE_SECTION_HEADER)((LPBYTE)pOptionHeader + pFileHeader->SizeOfOptionalHeader); return pSecHeader; } PIMAGE_IMPORT_DESCRIPTOR GetFirstImportDesc(LPVOID ImageBase) { //////////////////////////////�ṹ���� PIMAGE_DOS_HEADER pDosHeader = NULL; PIMAGE_NT_HEADERS pNtHeader = NULL; PIMAGE_OPTIONAL_HEADER pOptionHeader = NULL; PIMAGE_FILE_HEADER pFileHeader = NULL; PIMAGE_SECTION_HEADER pSecHeader = NULL; /////////////////////////////���OptionalHeader�ṹ pDosHeader = (PIMAGE_DOS_HEADER)ImageBase; pNtHeader = (PIMAGE_NT_HEADERS32)((DWORD)pDosHeader+pDosHeader->e_lfanew); pFileHeader =(PIMAGE_FILE_HEADER)&pNtHeader->FileHeader; pOptionHeader = (PIMAGE_OPTIONAL_HEADER)&pNtHeader->OptionalHeader; pSecHeader =(PIMAGE_SECTION_HEADER)((LPBYTE)pOptionHeader + pFileHeader->SizeOfOptionalHeader); DWORD pImportOffset = (pOptionHeader->DataDirectory[1]).VirtualAddress ; PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR) ImageRvaToVa (pNtHeader,ImageBase,pImportOffset,&pSecHeader ) ; return pImportDesc; } ////////////////////�Ƚ��Ƿ�ΪPE�ļ� BOOL MemCmpPe(LPVOID ImageBase) { PIMAGE_DOS_HEADER pDosHeader =(PIMAGE_DOS_HEADER)ImageBase; PIMAGE_NT_HEADERS pNtHeader =(PIMAGE_NT_HEADERS32)((DWORD)pDosHeader+pDosHeader->e_lfanew); while(!ImageBase) return FALSE; while(pDosHeader->e_magic!=IMAGE_DOS_SIGNATURE) return FALSE; while(pNtHeader->Signature!=IMAGE_NT_SIGNATURE) return FALSE; return TRUE; } ///////////////////////////��ȡ�ļ����ڴ� LPVOID MapFileToMemory(char *szFileName) { HANDLE hFile = CreateFile(szFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile==INVALID_HANDLE_VALUE) { MessageBox(NULL,"���ܴ��ļ�","��ʾ",MB_OK); return NULL; } HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READONLY | SEC_COMMIT, 0, 0, NULL); LPVOID pMap = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0); return pMap; } ///////////////////////////��ö���ֵ DWORD Alignment(DWORD Size,DWORD Align) { if(Size%Align!=0) return (Size/Align+1)*Align; return Size; } /////////////////////���������� void ModifySecName(PIMAGE_SECTION_HEADER SecHeader,DWORD SecNum) { int i=0; while(i<SecNum) { strcpy((char*)SecHeader[i].Name,"UnPack"); i++; } } ///////////////////������� void ModifyImport(DWORD SecOffset,DWORD SecOffsetA,DWORD SecOffsetB) { DWORD SecOffsetC=SecOffset+SecOffsetA; DWORD ImPort =*(DWORD*)SecOffsetC; while(ImPort) { DWORD FuncAddr =*(DWORD*)(SecOffsetC+4); HMODULE hMod=LoadLibraryA((char*)SecOffsetB+ImPort); FuncAddr+=SecOffset; SecOffsetC+=8; while(*(BYTE*)SecOffsetC!=0) { ++SecOffsetC; *(DWORD*)FuncAddr=(DWORD)GetProcAddress(hMod,(char*)SecOffsetC); FuncAddr+=4; SecOffsetC+=strlen((char*)SecOffsetC)+1; } ++SecOffsetC; ImPort=*(DWORD*)SecOffsetC; } } ////////////���ڴ���0xE8,0xE9//////////////C���Ա�ʾ///////////////�е����� void ModifyCall(BYTE *Start,int Size) { BYTE DB; DWORD DDb; DWORD FixAddr=(DWORD)Start; WORD DWA; BYTE Hi8; WORD Lo8; while(Size) { DB=*(BYTE*)Start-0xE8; ++Start; if(DB>1||*Start!=3) { continue; } DDb=*(DWORD*)Start; DWA=DDb&0x0ffff; DWA>>=8; DDb&=0xffff0000; DDb|=DWA; DDb=((DDb<<0x10)|(DDb>>0x10)); DWA=DDb&0x0ffff; Lo8=((WORD)DWA<<8); Hi8=(BYTE)(DWA>>8); DWA=(Lo8+Hi8); DDb&=0xffff0000; DDb|=DWA; DDb-=(DWORD)Start; *(DWORD*)Start=DDb+FixAddr; Start+=4; --Size; } } ///////////////////�������ζ��� void SetSectionAlignment(IMAGE_SECTION_HEADER *TempSecHeader,int SectionNum,DWORD SecValue) { int AlignValue=0; for(int i=0;i<SectionNum;i++) { AlignValue=Alignment(TempSecHeader->Misc.VirtualSize, SecValue); TempSecHeader->SizeOfRawData =AlignValue; TempSecHeader->Misc.VirtualSize=AlignValue; TempSecHeader->PointerToRawData=TempSecHeader->VirtualAddress; TempSecHeader++; } } BYTE PCode; //ѹ����Ĵ�����ļ�ָ�� BYTE *pImage; //�µ�ӳ��ռ� DWORD ImageSize; //�ӿǺ��ӳ���С int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { DWORD dwWrite; LPBYTE lpFile=(LPBYTE)MapFileToMemory("Test.exe"); if(MemCmpPe(lpFile)==FALSE) { MessageBoxA(NULL,"PEǩ����Ч","��ʾ",MB_OK); } DosHeader =GetDosHeader(lpFile); NtHeader =GetNtHeader(lpFile); FileHeader =GetFileHeader(lpFile); OptHeader =GetOptionalHeader(lpFile); SecHeader =GetSectionHeader(lpFile); pIID =GetFirstImportDesc(lpFile); /////////////////////������һ�����Σ������Ƶ��ڴ��� ImageSize=Alignment(OptHeader->SizeOfImage,OptHeader->SectionAlignment);//��üӿǺ��ӳ���С��Ҳ��������ռ��С pImage =VirtualAlloc(NULL,ImageSize,MEM_COMMIT,PAGE_READWRITE); //�����µ�PEӳ��ռ� memcpy(pImage,lpFile,OptHeader->SizeOfHeaders); //����PEͷ���·����ӳ��ؼ����� IMAGE_SECTION_HEADER *TempSecHeader =SecHeader; //��ʱ���νṹ ////////////////////���θ������ε��µ�PE����������ȥ for(int i=0;i<FileHeader->NumberOfSections;i++) //���θ��ƴ��뵽�µ�ӳ��ռ����� { memcpy(pImage+TempSecHeader->VirtualAddress, //���մ����ӳ���ַ lpFile+TempSecHeader->PointerToRawData, //���ƴ�����ļ�ƫ�Ƶ�ַ Alignment(TempSecHeader->SizeOfRawData,OptHeader->FileAlignment)//���ƴ����С���ļ���С�Ͷ������ ); ++TempSecHeader; } ////////////////////����Image�����PEͷ IMAGE_NT_HEADERS *NewNtHeader = GetNtHeader(pImage); //NTͷ IMAGE_SECTION_HEADER *NewSecHeader = GetSectionHeader(pImage); IMAGE_OPTIONAL_HEADER *NewOptHeader =GetOptionalHeader(pImage); ////////////////////������ڵ� NewNtHeader->OptionalHeader.AddressOfEntryPoint=0x1020; ////////////////////�ļ����뷽ʽ NewNtHeader->OptionalHeader.SizeOfImage =Alignment(NewOptHeader->SizeOfImage,NewOptHeader->SectionAlignment); NewNtHeader->OptionalHeader.FileAlignment =NewOptHeader->FileAlignment; NewNtHeader->OptionalHeader.SizeOfHeaders =NewSecHeader->VirtualAddress; ////////////////////��������λ�úʹ�С SetSectionAlignment(NewSecHeader,NewNtHeader->FileHeader.NumberOfSections,0x1000); //�����ζ��� ////////////////////��ʼ��ѹ���� UnCompress(pImage+SecHeader->VirtualAddress,(BYTE*)lpFile+SecHeader->PointerToRawData); //��ֻ���ڴ��е�ѹ�������ѹ��ӳ��ռ� //DisposureE8(pImage+SecHeader->VirtualAddress,0x84); //���ڴ���E8 ModifyCall(pImage+SecHeader->VirtualAddress,0x84); ////////////////////������� ModifyImport((DWORD)pImage+0x1000,0x9000,(DWORD)pImage+0xC000); ////////////////////���������� ModifySecName(GetSectionHeader(pImage),3); ///////////////////д���ļ� HANDLE Handle=CreateFile("UnpackMe.exe", GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); SetFilePointer(Handle,0,0,FILE_BEGIN); WriteFile(Handle,pImage,ImageSize,&dwWrite,NULL); MessageBox(NULL,"�ѿdzɹ�","UnpackMe",MB_OK); return TRUE; } In Which,UnCompress Is Quote Other Code,Code As Follows, Code: #define True 1 int getbit(unsigned __int64 *pcom_dword, unsigned char **ppsrc) { unsigned __int64 temp; //int result; *pcom_dword &= 0xffffffff; (*pcom_dword) *= 2; if(!(*pcom_dword & 0xffffffff)) { *pcom_dword = *(unsigned int *)(*ppsrc); temp = (unsigned int)(*ppsrc); temp -= (unsigned int)(-4); (*ppsrc) += 4; *pcom_dword = ((temp >> 32) & 1) + *pcom_dword + *pcom_dword; } return (int)((*pcom_dword >> 32) & 1); } int UnCompress(void *dst, void *src) { unsigned char *pdst = dst; unsigned char *psrc = src; unsigned char *xdst = NULL; unsigned __int64 com_dword = 0; unsigned __int64 off = 0; unsigned __int64 temp = 0; unsigned int length = 0; unsigned int last_off = (unsigned int)-1; int flag = 0; com_dword = *(unsigned int *)psrc; temp = (unsigned int)psrc; psrc += 4; temp -= (unsigned int)(-4); com_dword = com_dword * 2 + ((temp >> 32) & 1); if(((com_dword >> 32) & 1)) { do { *pdst++ = *psrc++; }while(getbit(&com_dword, &psrc)); } while(True) { if(flag) { while(getbit(&com_dword, &psrc)) { *pdst++ = *psrc++; } } flag = 1; off = 1; do { do { off = off * 2 + getbit(&com_dword, &psrc); }while(com_dword =com_dword + com_dword, ((com_dword >> 32) & 1) == 0); if(com_dword & 0xffffffff) { break; } com_dword = *(unsigned int *)psrc; temp = (unsigned int)psrc; psrc += 4; temp -= (unsigned int)(-4); }while(com_dword = com_dword + com_dword + ((temp >> 32) & 1), ((com_dword >> 32) & 1) == 0); length = 0; off -= 3; if(off >> 32 == 0) { off <<= 8; off = off + *psrc++; if((off = (off & 0xffffffff) ^ 0xffffffff) == 0) { break; } last_off = (unsigned int)off; } length = length + length + getbit(&com_dword, &psrc); length = length + length + getbit(&com_dword, &psrc); if(length == 0) { length++; do { do { length = length + length + getbit(&com_dword, &psrc); }while(com_dword = com_dword + com_dword, ((com_dword >> 32) & 1) == 0); if(com_dword & 0xffffffff) { break; } com_dword = *(unsigned int *)psrc; temp = (unsigned int)psrc; psrc += 4; temp -= (unsigned int)(-4); }while(com_dword = com_dword + com_dword + ((temp >> 32) & 1), ((com_dword >> 32) & 1) == 0); length += 2; } length++; if(last_off < (unsigned int)(-0xd00)) length++; xdst = last_off + pdst; temp = last_off; temp -= (unsigned int)(-4); if(temp != 0 && ((temp >> 32) & 1) == 0) { for(;length > 0; length--) { *pdst++ = *xdst++; } } else { for(;;) { *(unsigned int *)pdst = *(unsigned int *)xdst; pdst += 4; xdst += 4; temp = length; length -= 4; temp -= 4; if(temp == 0 || ((temp >> 32) & 1) == 1) break; } pdst += length; } } return pdst - (unsigned char *)dst; } Thank You Support! e-Mail: [email protected] Comments
| ||||||