| 
 
TA的每日心情|  | 怒 2014-12-12 07:01
 | 
|---|
 签到天数: 8 天 [LV.3]偶尔看看II 逆向联盟VIP会员    
 
	积分344 
 | 
 
| 要插入代码到程序中?哇,这听起来好酷哦。
 不过,做起来就有一点困难了。首先要知道哪里可以插入?
 慢点,好像我们也可以自己为PE添加一个Section来做,不必插入代码。
 呵呵。。。当然可以了,不过这帖中带领大家来到PE格式之旅第一旅:先寻找有没有可以插入的代码点。
 我们都知道磁盘上的PE和内容上的PE存在很大的不同的。其中这贴中我们最关心的应该是文件对齐的问题了。
 我们用工具LoadPe很简单就看到,一般程序在磁盘上的对齐大小是0x200,而在内存上就是0x1000,不过
 如果程序的作者在写的时候可以通过改变连接方式来改变这个值
 比如#pragma comment(linker,"/align:0x300")就可以改变内存对齐,而#pragma comment(linker,"/filealign:0x300")
 就是把文件对齐设为0x300大小。这个编译的域,分别对应于PE文件中的两个域,我们可以自己读出来!
 不管怎么说如果采用默认的方式的话,还是会产生PE空隙的,如果我们能把这段空隙利用起来,那我们就能
 不改变原大小的情况下来插入代码了。。。。好了。。。好了。。。这些概念貌似太简单了。。。很多资料和
 前辈都有说过了。问题是如何计算空隙的大小和开始的地址,这个简单!(帖子刚开始嘛,水平也有限,而且大想法就是有
 小想法一个一个组成的)
 
 一些计算公式是这样的:
 
 
 //空隙计算公式:
 //空隙大小 = SizeOfRawData - Misc.VirtualSize - 1;
 //节的起始点 = PointerToRawData;
 //空隙起始点 = PointerToRawData + Misc.VirtualSize;
 
 哇,太简单了。有些朋友就等不捞了,没有耐心了,包括我。。。呵呵。。。不过真正的黑客是最有耐心的,我这样告诉我自己,小知识
 变成大知识!
 代码很少,也只是测试代码,就直接上来了。
 
 复制代码unsigned long g_psection=0;//point to section start 
typedef        struct _sect_
{
        char secname[256];//section name,0x100
        long gapsize;
        PVOID        secstart;
        PVOID        gapstart;
}sect,*psect;
sect        g_section[50]={0};
unsigned long g_filealign=0;//文件对齐值
unsigned long g_viralign=0;//内存对齐值
unsigned short g_type=0;//可以进行一些dll,或exe的判读,分别对文件的类型进行感染是不同的
unsigned short g_secnumber=0;//numbers of section
void section_read(char *szfile)
{
        //section name...size..
        HANDLE        hfile=CreateFile(
                szfile
                ,GENERIC_ALL
                ,NULL
                ,NULL
                ,OPEN_EXISTING
                ,FILE_ATTRIBUTE_NORMAL
                ,NULL
                );
        if(hfile==INVALID_HANDLE_VALUE)
                return ;
        //create mapping
        HANDLE        hmap=CreateFileMapping(
                hfile
                ,NULL
                ,PAGE_EXECUTE_READWRITE
                ,0,0
                ,NULL
                );
        if(hmap==NULL)
                return ;
        long pmodule=(long)MapViewOfFile(hmap,FILE_MAP_ALL_ACCESS,0,0/*offset*/,0);
        if(pmodule==0||*(short*)pmodule!=IMAGE_DOS_SIGNATURE)
                return ;
        long ppeheader=*(long*)(pmodule+0x3c/*e_lfanew*/)+pmodule;
        IMAGE_NT_HEADERS        *ntheader=(IMAGE_NT_HEADERS*)ppeheader;
        if(ntheader->Signature!=IMAGE_NT_SIGNATURE)
                return ;
        g_type=ntheader->FileHeader.Characteristics;
        g_secnumber=ntheader->FileHeader.NumberOfSections;
        g_filealign=ntheader->OptionalHeader.FileAlignment;
        g_viralign=ntheader->OptionalHeader.SectionAlignment;
//定位到section区段,读取section header
        IMAGE_SECTION_HEADER        *psection=(IMAGE_SECTION_HEADER*)(sizeof(IMAGE_NT_HEADERS)+ppeheader);
        for (int i=0;i<g_secnumber;i++)
        {
                lstrcpy((char*)g_section.secname,(char*)psection.Name);
                //空隙计算公式:
                //空隙大小 = SizeOfRawData - Misc.VirtualSize - 1;
                //节的起始点 = PointerToRawData;
                //空隙起始点 = PointerToRawData + Misc.VirtualSize;
                g_section.gapsize=psection.SizeOfRawData-psection.Misc.VirtualSize-1;
                g_section.secstart=(PVOID)psection.PointerToRawData;
                g_section.gapstart=(PVOID)(psection.PointerToRawData+psection.Misc.VirtualSize);
        }
}
int main(int argc, char* argv[])
{
        section_read("c:\\splitfile.exe");
        for (int i=0;0!=g_section.gapsize;i++)
        {
                printf("name:%s,gapstart:%p,gapsize:%d\n",g_section.secname,g_section.gapstart,g_section.gapsize);
        }
        return 0;
}
 
 
 
 
 | 
 |