有几位大哥看了远程线程之后问了其他注入,其中导入表注入问的挺多的,我一介小白会的不多,只能勉强写个简单的过程,内容很潦草,但是注释是认真的。
发个简单的写法,其中RVA转FOV我直接写的函数,看文章的应该都懂。为了好理解,里面类型我都用的unsigned XX,注释也都尽量详细了。
希望能得到大家的免费评分,我想换个ID
如果你是在学习导入表注入,建议打开导入表的结构图,看着导入表的结构体同时看下面的代码。如果你是个大佬只是为了重温那当我没说。
[C] 纯文本查看 复制代码
//导入表注入前先新增一个节,标志属性为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[NumberOfSections - 1], 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[NumberOfSections - 1];
*(unsigned int*)(FileBuffer + NewImportStructFov + 0) = intrva;//INT属性!!!!!
//追加8字节IAT表,rva赋给iat属性
memset(FileBuffer + NewImportStructFov + 48, 0, 8);
unsigned int iatrva = NewImportStructFov + 48 - NewImportFov + VirtualAddress[NumberOfSections - 1];
*(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[NumberOfSections - 1];
*(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[NumberOfSections - 1];
*(unsigned int*)(FileBuffer + NewImportStructFov + 12) = dllnamerva;//NAME属性!!!!!
//修正目录项
*(unsigned int*)(FileBuffer + muluAddress + 1 * 8) = VirtualAddress[NumberOfSections - 1];
//写到文件
FILE* NewFile = fopen(str2, "wb+");
fwrite(FileBuffer, sizeof(unsigned char), MINEFileSize, NewFile);
fclose(NewFile);
|