羽夏壳世界——实现篇小结


写在前面

??此系列是本人一个字一个字码出来的,包括代码实现和效果截图。如有好的建议,欢迎反馈。码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作。如想转载,请把我的转载信息附在文章后面,并声明我的个人信息和本人博客地址即可,但必须事先通知我

你如果是从中间插过来看的,请仔细阅读 ,方便学习本教程。

小结

??前面我们详细介绍了本项目的实现的每一个细节,最终的结构图如下:

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"}">

??介绍完了实现,我们来简单谈谈加密相关的流程,先看相关代码:

BOOL CWingProtect::Proctect(UINT protections)
{
    auto ret = TRUE;
    auto reloc = peinfo.OptionalHeaderDllCharacteristics & IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE;
    auto antidebug = ProtectionsHasFlag(protections,Protections::AnitDebug);
    auto fakecode = ProtectionsHasFlag(protections, Protections::JunkCode);

    if (EnableIATEncrypt && ProtectionsHasFlag(protections, Protections::IATEncrypt))
    {
        ret &= IATEncrypt(antidebug,fakecode);
    }

    DestoryRelocation();
    ProcessTLS(ProtectionsHasFlag(protections, Protections::TLSEncrypt));

    if (ProtectionsHasFlag(protections, Protections::XOREncrypt))
    {
        ret &= XORCodeSection(reloc, fakecode);
        reloc = FALSE;
    }

    if (ProtectionsHasFlag(protections, Protections::Compress))
    {
        ret &= CompressSeciton(reloc,fakecode);
        reloc = FALSE;        
    }

    //最后根据保护,生成 ShellCode
    GenerateLoadingShellCode(protections, fakecode);

    return ret;
}

??首先,加密的时候首先判断有没有IAT加密标识,有的话启用加密,然后摧毁导入表,处理TLS,如果有异或加密,就先异或。接着如果有压缩,就压缩,最后生成引导汇编代码,指导整个PE的解密和执行。
??下面我们看看GenerateLoadingShellCode具体细节:

//
// GNU AFFERO GENERAL PUBLIC LICENSE
//Version 3, 19 November 2007
//
//Copyright(C) 2007 Free Software Foundation, Inc.
//Everyone is permitted to copyand distribute verbatim copies
//of this license document, but changing it is not allowed.
// Author : WingSummer (寂静的羽夏)
// 
//Warning: You can not use it for any commerical use,except you get 
// my AUTHORIZED FORM ME!This project is used for tutorial to teach
// the beginners what is the PE structure and how the packer of the PE files works.
// 
// 注意:你不能将该项目用于任何商业用途,除非你获得了我的授权!该项目用来
// 教初学者什么是 PE 结构和 PE 文件加壳程序是如何工作的。
//
// Statement : It cost me about one week to write all these nearly 2500 lines of code. 
// The Assembly Engine of this project is asmjit , which is a Amazing and Fantastic toolkit 
// for generating assembly code, of course it has more powerful functions.Please keep these 
// statements  and declarations.Thanks!
// 
// 声明:该项目的代码编写用了我将近一个周的时间来写差不多2500行代码,使用的汇编引擎是 asmjit ,
// 它是一个能够生成汇编代码的强大而惊人的工具,当然它还有更多的功能。请保留这些声明,万分感谢。
//

void CWingProtect::GenerateLoadingShellCode(UINT protections, BOOL FakeCode)
{
    auto buffer = GetPointerByOffset(peinfo.WingSecitonBuffer, peinfo.PointerOfWingSeciton);

    encryptInfo.ShellCodeLoader = (UINT)peinfo.PointerOfWingSeciton;

    using namespace asmjit;
    if (is64bit)
    {
        Environment env(Arch::kX64);
        CodeHolder holder;
        holder.init(env);
        x86::Assembler a(&holder);

        x86::Mem mem;
        mem.setSegment(x86::gs);
        mem.setOffset(0x60);

        a.mov(x86::rax, mem);
        a.mov(x86::rax, x86::qword_ptr(x86::rax, 0x10));

        auto rvabase = peinfo.AnalysisInfo.MinAvailableVirtualAddress;
#define AddRVABase(offset) ((UINT)offset + (UINT)rvabase)

        if (ProtectionsHasFlag(protections,Protections::IATEncrypt))
        {
            a.push(x86::rax);
            a.add(x86::rax, AddRVABase(encryptInfo.IATShellCode));
            a.call(x86::rax);
            a.pop(x86::rax);
            a.nop();
        }

        if (ProtectionsHasFlag(protections,Protections::Compress))
        {
            a.push(x86::rax);
            a.add(x86::rax, AddRVABase(encryptInfo.ShellCodeDeCompress));
            a.call(x86::rax);
            a.pop(x86::rax);
            a.nop();
        }

        if (ProtectionsHasFlag(protections,Protections::XOREncrypt))
        {
            a.push(x86::rax);
            a.add(x86::rax, AddRVABase(encryptInfo.XORDecodeShellCode));
            a.call(x86::rax);
            a.pop(x86::rax);
            a.nop();
        }

        if (HasTLS)
        {
            Label loop = a.newLabel();
            Label loop_j = a.newLabel();
            Label addn = a.newLabel();

            a.push(x86::rax);
            a.push(x86::rdi);
            a.push(x86::rsi);
            a.push(x86::rbx);

            a.mov(x86::rsi, encryptInfo.OldTLSCallBacks);
            a.mov(x86::rdi, AddRVABase(encryptInfo.TLSBuffer));
            a.add(x86::rsi, x86::rax);
            a.add(x86::rdi, x86::rax);

            a.bind(loop);
            a.mov(x86::rbx, x86::qword_ptr(x86::rsi));
            a.test(x86::ebx, x86::ebx);
            a.jz(loop_j);

            a.cmp(x86::rbx, x86::rax);        //如果没开 TLS 保护,则表示 RVA ,需要转化为地址
            a.ja(addn);
            a.add(x86::rbx, x86::rax);
            a.bind(addn);

            a.mov(x86::qword_ptr(x86::rdi), x86::rbx);
            a.add(x86::rsi, 8);
            a.add(x86::rdi, 8);
            a.jmp(loop);
            a.bind(loop_j);

            a.pop(x86::rbx);
            a.pop(x86::rsi);
            a.pop(x86::rdi);
            a.pop(x86::rax);
            a.nop();
        }

        a.add(x86::rax, peinfo.AddressOfEntryPoint);
        a.jmp(x86::rax);

        BYTE* shellcode = a.bufferData();
        UINT codesize = (UINT)holder.codeSize();

        memcpy_s(buffer, codesize, shellcode, codesize);
        peinfo.PointerOfWingSeciton += codesize;
    }
    else
    {
        Environment env(Arch::kX86);
        CodeHolder holder;
        holder.init(env);
        x86::Assembler a(&holder);

        x86::Mem mem;
        mem.setSegment(x86::fs);
        mem.setOffset(0x30);

        a.mov(x86::eax, mem);
        a.mov(x86::eax, x86::qword_ptr(x86::eax, 0x10));
        a.push(x86::ebx);

        auto rvabase = peinfo.AnalysisInfo.MinAvailableVirtualAddress;
#define AddRVABase(offset) ((UINT)offset + (UINT)rvabase)

        if (ProtectionsHasFlag(protections, Protections::IATEncrypt))
        {
            a.push(x86::eax);
            a.mov(x86::ebx, AddRVABase(encryptInfo.IATShellCode));
            a.add(x86::ebx, x86::eax);
            a.call(x86::ebx);
            a.pop(x86::eax);
            a.nop();
        }

        if (ProtectionsHasFlag(protections, Protections::Compress))
        {
            a.push(x86::eax);
            a.mov(x86::ebx, AddRVABase(encryptInfo.ShellCodeDeCompress));
            a.add(x86::ebx, x86::eax);
            a.call(x86::ebx);
            a.pop(x86::eax);
            a.nop();
        }

        if (ProtectionsHasFlag(protections, Protections::XOREncrypt))
        {
            a.push(x86::eax);
            a.mov(x86::ebx, AddRVABase(encryptInfo.XORDecodeShellCode));
            a.add(x86::ebx, x86::eax);
            a.call(x86::ebx);
            a.pop(x86::eax);
            a.nop();
        }

        a.pop(x86::ebx);
        a.add(x86::eax, peinfo.AddressOfEntryPoint);
        a.jmp(x86::eax);

        BYTE* shellcode = a.bufferData();
        UINT codesize = (UINT)holder.codeSize();

        memcpy_s(buffer, codesize, shellcode, codesize);
        peinfo.PointerOfWingSeciton += codesize;
    }
}

??通过生成的汇编我们可以看出,每一个负责解密的ShellCode都会通过call的方式进行调用返回,如果TLS开启了保护,就等所有解密完毕后,填写正确的TLS派发入口函数,然后跳回原来的入口地址,开始执行之后的正常流程。
??有关该加密壳是实现就这么多,剩余的小总结性的说明将会在下一篇介绍。

下一篇