Сейчас на форуме: ==DJ==[ZLO], Magister Yoda, Rio (+6 невидимых) |
![]() |
eXeL@B —› Основной форум —› Распаковка French Layor 1.81 |
Посл.ответ | Сообщение |
|
Создано: 10 февраля 2005 23:53 · Личное сообщение · #1 |
|
Создано: 11 февраля 2005 00:18 · Личное сообщение · #2 |
|
Создано: 11 февраля 2005 00:28 · Личное сообщение · #3 |
|
Создано: 11 февраля 2005 00:29 · Личное сообщение · #4 |
|
Создано: 11 февраля 2005 00:39 · Личное сообщение · #5 Гы! Фтыкай! Остальные посты можно считать грязным плагиатом неа мой распаковщик =) DupeFiles(); Size = *(DWORD*)(&OEP[0x51]); Offs = *(DWORD*)(&OEP[0x37]); Offs = Offs ^ *(DWORD*)(&OEP[0x3F]); Offs = Offs ^ *(DWORD*)(&OEP[0x45]); CKey = (BYTE)OEP[0x4A]; // seek to data Offs = Offs - PE->OptionalHeader.ImageBase; Offs = RVAToRawP(Offs); PackedSeek(Offs, SEEK_SET); UnpackedSeek(Offs); // decrypt while( Size != 0 ) { Cnt = (WORD)MIN(Size, BUFF_SIZE); if ( Cnt != PackRead(Buff, Cnt) ) return(ERR); for ( I = 0; I < Cnt; I++ ) Buff[I] ^= CKey; if ( Cnt != UnpackWrite(Buff, Cnt) ) return(DISK); Size -= Cnt; } // rebuild import table IDirOfs = PE->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]. VirtualAddress = PE->OptionalHeader.AddressOfEntryPoint; ISize = sizeof(IMPORT_DIRECTORY_ENTRY); IRVA = PE->OptionalHeader.AddressOfEntryPoint + 0x27D; IRaw = RVAToRawP(IRVA); IDirOfs = RVAToRawP(IDirOfs); // read names offset and dll count PackSeek(IRaw, SEEK_SET); if ( 4 != PackRead((BYTE*)(&Offs), 4) ) return(ERR); if ( 4 != PackRead((BYTE*)(&DCnt), 4) ) return(ERR); // make names ptr NRVA = (IRVA + Offs); NRaw = (IRaw + Offs); IRaw += (2 * 4); IRVA += (2 * 4); // process modules while( DCnt-- ) { ISize += sizeof(IMPORT_DIRECTORY_ENTRY); // read iat value & proc count PackSeek(NRaw, SEEK_SET); if ( 4 != PackRead((BYTE*)(&Offs), 4) ) return(ERR); if ( 4 != PackRead((BYTE*)(&NCnt), 4) ) return(ERR); NRaw += (2 * 4); NRVA += (2 * 4); // create directory memset(&IDir, 0, sizeof(IDir)); IDir.AddressTableRVA = Offs; IDir.ForwardChain = 0xFFFFFFFFU; IDir.NameRVA = IRVA; UnpackSeek(IDirOfs); if ( sizeof(IDir) != UnpackWrite(&IDir, sizeof(IDir)) ) return(ERR); IDirOfs += sizeof(IDir); // read dll name PackSeek(IRaw, SEEK_SET); Len = PackRead(Buff, 0x100); Buff[Len] = '\0'; if ( 0 == (Len = strlen(Buff)) ) return(ERR); IRVA += (Len + 1); IRaw += (Len + 1); // process procs Offs = RVAToRawP(Offs); while( NCnt-- ) { PackSeek(NRaw, SEEK_SET); Len = PackRead(Buff, 0x100); Buff[Len] = '\0'; if ( 0 == (Len = strlen(Page_C)) ) return(ERR); // update iat UnpackSeek(Offs); DVal = (NRVA - 2); if ( 4 != UnpackWrite(&DVal, 4) ) return(ERR); Offs += 4; NRVA += (Len + 1); NRaw += (Len + 1); } // write zero iat DVal = 0; if ( 4 != UnpackWrite(&DVal, 4) ) return(ERR); } // write last zero entry memset(&IDir, 0, sizeof(IDir)); UnpackSeek(IDirOfs); if ( sizeof(IDir) != UnpackWrite(&IDir, sizeof(IDir)) ) return(ERR); // update header Offs = *(DWORD*)(&OEP[0x65]); Offs = Offs ^ *(DWORD*)(&OEP[0x70]); Offs = Offs - PE->OptionalHeader.ImageBase; PE->OptionalHeader.AddressOfEntryPoint = Offs; PE->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size = ISize; UnpackSeek(PEHeaderOffset); if ( PE_HEADER_SIZE != UnpackWrite(PE, PE_HEADER_SIZE) ) return(ERR); ![]() |
|
Создано: 11 февраля 2005 00:46 · Личное сообщение · #6 |
|
Создано: 11 февраля 2005 00:47 · Личное сообщение · #7 Ах ну да, традиционный аттач. И заметьте, никаких трейсеров, никаких дамперов, и никакого импрека. А отладчик я вообще забыл когда последний раз запускал, чего и всем желаю =) ![]() ![]() |
|
Создано: 11 февраля 2005 00:52 · Личное сообщение · #8 |
|
Создано: 11 февраля 2005 01:20 · Личное сообщение · #9 |
|
Создано: 11 февраля 2005 06:48 · Личное сообщение · #10 |
|
Создано: 12 февраля 2005 21:33 · Личное сообщение · #11 |
|
Создано: 12 февраля 2005 23:33 · Личное сообщение · #12 |
![]() |
eXeL@B —› Основной форум —› Распаковка French Layor 1.81 |