美文网首页
IAT加密的一些粗浅理解

IAT加密的一些粗浅理解

作者: bluewind1230 | 来源:发表于2018-03-01 16:12 被阅读0次

先上一段代码

void afxiat()
{
    
    PIMAGE_IMPORT_BY_NAME; //名称

    _IMAGE_THUNK_DATA32; //iat
    DWORD ImageBase = g_stubConf.ntheader.OptionalHeader.ImageBase;

    //导入表
    PIMAGE_IMPORT_DESCRIPTOR exeimport = 
        (PIMAGE_IMPORT_DESCRIPTOR)
        (g_stubConf.ntheader.OptionalHeader.DataDirectory[1].VirtualAddress+
        g_stubConf.ntheader.OptionalHeader.ImageBase);

    HANDLE heap = apis.pfnGetProcessHeap();

    //遍历导入表中的INT修复IAT
    while (exeimport->Name != NULL) //遍历模块
    {
        HMODULE h_dllModule = apis.pfnLoadLibraryA((char *)(exeimport->Name + ImageBase));
        PIMAGE_THUNK_DATA  import_Int = (PIMAGE_THUNK_DATA)(exeimport->OriginalFirstThunk+ImageBase);
        PIMAGE_THUNK_DATA  import_IAT = (PIMAGE_THUNK_DATA )(exeimport->FirstThunk+ ImageBase);

        while (import_Int->u1.Ordinal != 0) //遍历函数
        {
            UCHAR *buf = (UCHAR *)apis.pfnHeapAlloc(heap, HEAP_ZERO_MEMORY, 10);            //HeapAlloc的作用有点类似于VIrtualAlloc这个API
            buf[0] = 0xb8;
            buf[5] = 0xff;
            buf[6] = 0xe0;
            //new char[20]{ "\xB8\x00\x00\x00\0x00\0xff\0xe0" };
            DWORD opl = 0;
            apis.pfnVirtualProtect((LPVOID)buf, 20, PAGE_EXECUTE_READWRITE, &opl);
            if (import_Int->u1.Ordinal &0x80000000) //序号导出, 最高位为1,这里是获取最高位,如果最高位为1,就执行下面里面的语句,即
                                    //以序号导入 ,否则以名称导入,执行else中的语句
            {

            
                //获取序号函数
                LPVOID apiaddr =
                    apis.pfnGetProcAddress(h_dllModule, (char *)(import_Int->u1.Ordinal & 0xFFFF));

                *(DWORD*)&buf[1] = (DWORD)apiaddr;  //函数写入shellcode

                //DWORD funaddr = ;
                
            
                apis.pfnVirtualProtect((LPVOID)(import_IAT ), 4, PAGE_EXECUTE_READWRITE, &opl);
                *(DWORD*)((DWORD)import_IAT ) = (DWORD)buf; //将函数写入到iat
            }
            else
            {
                //DWORD Faddr = *(DWORD*)(import_Int->u1.AddressOfData + ImageBase);
                PIMAGE_IMPORT_BY_NAME funname = (PIMAGE_IMPORT_BY_NAME)(import_Int->u1.AddressOfData+ImageBase);
                LPVOID apiaddr =
                    apis.pfnGetProcAddress(h_dllModule, funname->Name);

                *(DWORD*)&buf[1] = (DWORD)apiaddr;  //函数写入shellcode

                apis.pfnVirtualProtect((LPVOID)(import_IAT), 4, PAGE_EXECUTE_READWRITE, &opl);
                *(DWORD*)((DWORD)import_IAT ) = (DWORD)buf; //将函数写入到iat
//              DWORD funaddr =import_IAT->u1.Function  ;  //获取iat地址
// 
//              apis.pfnVirtualProtect((LPVOID)funaddr, 4, PAGE_EXECUTE_READWRITE, &opl);
//              *(DWORD*)(funaddr) = (DWORD)buf; //将函数写入到iat
            }

            import_Int++;
            import_IAT++;

        }
        exeimport++;
    }

}

先叙说一下整个逻辑:
一般IAT的加密是这样的,导入表里面有一个IAT表,一般PE加载的时候会把函数地址填入这个表里面,这里一般用VirtualAlloc(上面这个例子没有用这个API)申请一块内存地址填入IAT表里面,申请的这块空间里面存放的是一段Shellcode,这个shellcode可以存放真正的地址,然后可以对地址进行加密(上面这个例子里面没有进行加密!!!,上面例子中的Shellcode的意思是:mov eax,0xXXXX(函数地址),jmp eax),如果加密了的话,汇编代码可以写成这样:

mov eax,0x90909090(加密后的地址)
xor eax,15151515(通过某个操作数进行异或)     (这一步的作用是得到真正的地址)
jmp eax

然后再将这段汇编代码写成Shellcode即可
IAT不加密的话,IAT表里面存放的是原来的函数地址
IAT加密的话,IAT里面存放的是VirtualAlloc申请出来的那块内存空间的地址,其实到达这个地址之后,可以对地址加密用一些比较复杂的算法,那样就比较难了!

相关文章

  • IAT加密的一些粗浅理解

    先上一段代码 先叙说一下整个逻辑:一般IAT的加密是这样的,导入表里面有一个IAT表,一般PE加载的时候会把函数地...

  • 关于MVVM的一些粗浅理解

    直入主题吧,MVVM究竟是什么? 首先MVVM(Model-View-View Model)应该说是一种开发的架构...

  • 粗浅理解JVM

    Java语言写的源程序通过Java编译器,编译成与平台无关的字节码程序(.class文件,也就是0,1二进制程序)...

  • 粗浅理解181224

    当前状态 NB网络是新兴的窄带通信设备所用的网络,目前正在大力发展,但是无论是设备数目还是基站数目短时间内都无法比...

  • 对于熵增的一些粗浅的理解

    孤立系统演进遵循熵增定律。 即从简单到复杂,臃肿,最终进入难以维护的过程中不断的演化,推进。 从系统外部演进的角度...

  • 对OKRs粗浅的理解

    O和KR的不同 O指的是Objectives(目标),O是要是有挑战性的,如果是板上钉钉的事情就是不够的;KRs指...

  • 关于政德的粗浅理解

    今天下午在济宁政德学院听取了刘峰教授的讲座—《不忘初心使命,加强政德修养》,初次接受这类培训,难以理解透...

  • 关于promise的粗浅理解

    定义 在JavaScript的世界中,所有代码都是单线程执行的。 由于这个“缺陷”,导致JavaScript的所有...

  • GreenDao理解(粗浅,帮助理解)

    优点: 性能高,号称Android最快的关系型数据库 内存占用小 库文件比较小,小于100K,编译时间低,而且可以...

  • 浅谈数据加密和证书生成

    原理 在说具体操作之前,我们先研究下数据加密的原理。首先就要理解一些概念 对称加密、非对称加密、公钥、私钥、签名一...

网友评论

      本文标题:IAT加密的一些粗浅理解

      本文链接:https://www.haomeiwen.com/subject/dsagxftx.html