30659653 发表于 2020-4-20 20:10

【注入】导入表注入

有几位大哥看了远程线程之后问了其他注入,其中导入表注入问的挺多的,我一介小白会的不多,只能勉强写个简单的过程,内容很潦草,但是注释是认真的。
发个简单的写法,其中RVA转FOV我直接写的函数,看文章的应该都懂。为了好理解,里面类型我都用的unsigned XX,注释也都尽量详细了。
希望能得到大家的免费评分,我想换个ID{:5_117:}
如果你是在学习导入表注入,建议打开导入表的结构图,看着导入表的结构体同时看下面的代码。如果你是个大佬只是为了重温那当我没说。


        //导入表注入前先新增一个节,标志属性为0XC0000040

       
        //得到导入表文件偏移
        unsigned int pImportFov = RvaToFov(*(unsigned int*)(ImageBuffer + muluAddress + 1 * 8), MINEFileSize);

        int flag1 = 0, count = 0;
        //计算导入表原尺寸
        for (int i = 0;; ++i)
        {
                //判断是否结束
                if (*(unsigned int*)(FileBuffer + pImportFov + 20 * i) == 0)
                {
                        for (int k = 0; k < 20; ++k)
                        {
                                if (*(unsigned char*)(FileBuffer + pImportFov + 20 * i + k) == 0)
                                {
                                        flag1 = 1;
                                        continue;
                                }
                                else
                                {
                                        flag1 = 0;
                                        break;
                                }

                        }

                }
               
                if (flag1 == 1)//如果返回flag==1,那么结束
                {
                        break;
                }
                count++;//有效结构+1

        }
        //count结构数量
       
        //获取新增节的首地址,并转为fov
        unsigned int NewImportFov = RvaToFov(VirtualAddress, MINEFileSize);

        //将原导入表复制到新导入表位置
        memcpy(FileBuffer + NewImportFov, FileBuffer + pImportFov, sizeof(unsigned char)*count * 20);

        //添加新导入表结构
        unsigned int NewImportStructFov = NewImportFov + count * 20;
        *(unsigned int*)(FileBuffer+NewImportStructFov+4) = 0;//时间戳属性!!!!!


        //结构末尾追加20个0,20为结构尺寸
        memset(FileBuffer + NewImportStructFov + 20, 0, 20);

        //追加8字节的INT表,rva赋给int属性
        memset(FileBuffer + NewImportStructFov + 40, 0, 8);
        unsigned int intrva = NewImportStructFov + 40 - NewImportFov + VirtualAddress;
        *(unsigned int*)(FileBuffer + NewImportStructFov + 0) = intrva;//INT属性!!!!!

        //追加8字节IAT表,rva赋给iat属性
        memset(FileBuffer + NewImportStructFov + 48, 0, 8);
        unsigned int iatrva = NewImportStructFov + 48 - NewImportFov + VirtualAddress;
        *(unsigned int*)(FileBuffer + NewImportStructFov + 16) = iatrva;//IAT属性!!!!!

        //追加被INT和IAT指向的名称结构给24个字节,前两字节00,从+58开始是名称
        memset(FileBuffer + NewImportStructFov + 56, 0, 24);
        strcpy((char*)FileBuffer + NewImportStructFov + 58,"exportfun");

        //把上面的名称结构赋值给INT和IAT,INT和IAT存的是RVA,转换!
        unsigned int tmprva = NewImportStructFov + 56 - NewImportFov + VirtualAddress;
        *(unsigned int*)(FileBuffer + NewImportStructFov + 40) = tmprva;
        *(unsigned int*)(FileBuffer + NewImportStructFov + 48) = tmprva;

        //追加dll名称,并将rva赋值给name属性
        strcpy((char*)FileBuffer + NewImportStructFov + 80, "Win32Project15.dll");
        unsigned int dllnamerva = NewImportStructFov + 80 - NewImportFov + VirtualAddress;
        *(unsigned int*)(FileBuffer + NewImportStructFov + 12) = dllnamerva;//NAME属性!!!!!
       
        //修正目录项
        *(unsigned int*)(FileBuffer + muluAddress + 1 * 8) = VirtualAddress;

        //写到文件
        FILE* NewFile = fopen(str2, "wb+");
        fwrite(FileBuffer, sizeof(unsigned char), MINEFileSize, NewFile);

        fclose(NewFile);

cunzhang2016 发表于 2020-4-20 20:20

学习下 看不懂

kf9974831 发表于 2020-4-20 22:29

看的娃娃 一脸懵B {:6_209:} 路过打酱油了 {:6_210:}

adime 发表于 2020-9-6 11:13

谢谢分享,写得不错

audition 发表于 2020-9-13 10:53

感谢大神的分享哦

FKEUiMSn0 发表于 2022-2-25 07:39

感谢楼主的热心分享

gEL1730 发表于 2022-2-28 17:05

感谢楼主

rSiCd 发表于 2022-2-28 17:13

太好了,我看看,谢谢!

CBJ6245 发表于 2022-3-1 01:17

被标题吸引进来了,回复看看

DGY24736 发表于 2022-3-1 11:58

感谢楼主
页: [1] 2 3 4 5 6 7 8
查看完整版本: 【注入】导入表注入