木马彩衣的实现原理,也就是在程序里面加多一个Section,并且把入口点指向我们新添加的Section,然后再在我们的Section的代码里加上一个jmp,jmp到真正的入口点.这样,一些识壳软件,它在识别入口点代码时,就跑到我们新加的Section,看到里面的代码是VC6或是Delphi的代码也就认为是VC6或是Delphi的程序了.
下面是我写的一个代码,修改自"Fi7ke"老大的Delphi代码,原文可以查看
314K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6Q4x3X3g2U0M7$3c8F1i4K6u0W2L8X3g2@1i4K6u0r3K9r3&6^5P5i4W2Q4x3V1k6S2M7X3y4Z5K9i4k6W2i4K6u0r3x3U0l9H3y4g2)9J5c8U0p5I4i4K6u0r3x3e0k6Q4x3V1j5#2x3K6l9$3z5e0c8Q4x3X3g2S2M7%4m8^5DWORD JMPOFF=43;
char OEPCODE[]={0x55, 0x8B, 0xEC, 0x6A, 0xFF, 0x68, 0x2A, 0x2C, 0x0A, 0x00, 0x68, 0x38,
0x90, 0x0D, 0x00, 0x64, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x50, 0x64, 0x89,
0x25, 0x00, 0x00, 0x00, 0x00, 0x58, 0x64, 0xA3, 0x00, 0x00, 0x00, 0x00,
0x58, 0x58, 0x58, 0x58, 0x8B, 0xE8, 0xB8,
0x00, 0x10, 0x40, 0x00, //此处的DWORD是跳转的地址
0xFF,0xE0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00};
//加壳
void Encrypt(LPCSTR szFileName)
{
//var
IMAGE_DOS_HEADER DosHeader;
IMAGE_NT_HEADERS PEHeader;
IMAGE_SECTION_HEADER SectionHeader;
//新添加的Section
IMAGE_SECTION_HEADER MySectionHeader;
//入口点地址
DWORD AddressOfEntryPoint;
//文件流
CFile PEFile;
//begin
try
{
PEFile.Open(szFileName,CFile::modeReadWrite);
//读取DOS头
PEFile.SeekToBegin();
PEFile.Read(&DosHeader,sizeof(DosHeader));
//读取NT头
PEFile.Seek(DosHeader.e_lfanew,CFile::begin);
PEFile.Read(&PEHeader,sizeof(PEHeader));
//读取Section
PEFile.Seek(sizeof(IMAGE_SECTION_HEADER)*(PEHeader.FileHeader.NumberOfSections-1),CFile::current);
PEFile.Read(&SectionHeader,sizeof(IMAGE_SECTION_HEADER));
strncpy((LPSTR)MySectionHeader.Name,"Fi7ke\0",6);
MySectionHeader.VirtualAddress = PEHeader.OptionalHeader.SizeOfImage;
MySectionHeader.Misc.VirtualSize = 0x200;
MySectionHeader.SizeOfRawData = (MySectionHeader.VirtualAddress / //div
PEHeader.OptionalHeader.FileAlignment + 1) * PEHeader.OptionalHeader.FileAlignment -
PEHeader.OptionalHeader.SizeOfImage;
MySectionHeader.PointerToRawData =SectionHeader.SizeOfRawData + SectionHeader.PointerToRawData;
MySectionHeader.Characteristics = 0x60000020;
PEHeader.FileHeader.NumberOfSections++;
PEFile.Write(&MySectionHeader, sizeof(MySectionHeader));
PEFile.Seek(DosHeader.e_lfanew, CFile::begin);
AddressOfEntryPoint = PEHeader.OptionalHeader.AddressOfEntryPoint;
PEHeader.OptionalHeader.AddressOfEntryPoint =MySectionHeader.VirtualAddress;
PEHeader.OptionalHeader.MajorLinkerVersion = 6;
PEHeader.OptionalHeader.MinorLinkerVersion = 0;
AddressOfEntryPoint = AddressOfEntryPoint + PEHeader.OptionalHeader.ImageBase;
__asm
{
PUSHAD
LEA eax, OEPCODE //将OEPCODE的地址交给寄存器
ADD eax, JMPOFF //添加JMPOFF值给寄存器
MOV edx, AddressOfEntryPoint //转移指令,相当于付值语句,左边给右边
MOV DWORD ptr [eax], edx //同上
POPAD
}
PEHeader.OptionalHeader.SizeOfImage =PEHeader.OptionalHeader.SizeOfImage + MySectionHeader.Misc.VirtualSize;
PEFile.Write(&PEHeader, sizeof(PEHeader));
PEFile.SeekToEnd();
PEFile.Write(OEPCODE, MySectionHeader.Misc.VirtualSize);
PEFile.Close();
}
catch (...)
{
PEFile.Close();
}
}
[CODE]
这个是编译后的程序,放在网络硬盘上.使用时,直接点"加壳"就行了.
351K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3k6J5k6h3g2Q4x3X3g2&6M7K6p5$3z5q4)9J5k6h3y4G2L8g2)9K6b7e0R3H3x3o6m8Q4x3V1k6&6M7K6p5$3z5s2g2H3i4K6u0r3c8o6u0Q4x3V1k6Q4x3@1k6y4K9h3&6A6i4@1f1$3i4K6W2o6i4@1p5^5i4@1f1&6i4@1p5&6i4@1q4o6i4@1f1#2i4@1u0p5i4@1p5&6i4@1f1^5i4@1p5I4i4@1p5K6i4K6u0W2k6i4S2W2P5e0M7H3P5U0M7I4k6X3c8H3z5h3j5&6j5U0m8T1x3i4Z5&6y4h3u0A6x3X3t1J5j5U0u0T1x3X3t1H3k6Y4p5&6k6X3b7I4j5U0c8X3z5h3t1H3k6U0k6W2x3o6q4W2x3U0m8W2x3o6q4W2x3U0c8T1x3h3t1I4k6U0u0T1x3r3t1I4k6U0W2X3L8r3x3@1k6X3b7%4P5R3`.`.
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课