| Сейчас на форуме: ==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 Ах ну да, традиционный аттач. И заметьте, никаких трейсеров, никаких дамперов, и никакого импрека. А отладчик я вообще забыл когда последний раз запускал, чего и всем желаю =) 136a_unpacked.rar
![]() |
|
|
Создано: 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 |








, потом допёрло: "Автор, пиши ещё".
Для печати