首页
社区
课程
招聘
[求助]AddressOfEntryPoint的值没变
发表于: 2007-8-2 20:36 5718

[求助]AddressOfEntryPoint的值没变

2007-8-2 20:36
5718
int k;
        DWORD codeLength,codeRVA,codeOffset;
        DWORD add=(DWORD)(newcode);
        DWORD add1=(DWORD)(ending);
        codeLength=add1-add;
        DWORD *ss = (DWORD*)&pMem;
        DWORD jj = *ss;
        for (k=0;k<image_nt_headers->FileHeader.NumberOfSections;k++)
        {
               
                if (image_section_header[k]->Misc.VirtualSize - image_section_header[k]->SizeOfRawData> codeLength)
                {
                codeRVA = image_section_header[k]->VirtualAddress + image_section_header[k]->Misc.VirtualSize;
                codeOffset = image_section_header[k]->PointerToRawData + image_section_header[k]->Misc.VirtualSize;
                image_section_header[k]->Characteristics =0x0E0000020;
                image_section_header[k]->Misc.VirtualSize = image_section_header[k]->Misc.VirtualSize + codeLength;
                MoveMemory((char*)pMem + codeOffset,newcode,codeLength);
                break;
                }
        }
       
       
                OldEntry = jj + image_nt_headers->OptionalHeader.AddressOfEntryPoint;
                image_nt_headers->OptionalHeader.AddressOfEntryPoint =  codeRVA;  //插入代码的RVA

我要修改AddressOfEntryPoint,但是它的值却没变,why?请大家帮我看看

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
大家请帮帮忙
2007-8-3 19:17
0
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
3
把代码放全一点,片段看不出来什么特点
2007-8-3 20:51
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
HANDLE        hFile= NULL,hMapFile= NULL;
        LPVOID pMem=NULL;;
        DWORD SectionNum;
        DWORD i;
        PIMAGE_SECTION_HEADER sectionHead;
        DWORD dwRO_first_section;
       
        //----------------------------------------
        hFile=CreateFile(cFnameOpen,
                GENERIC_READ|GENERIC_WRITE,
                FILE_SHARE_WRITE | FILE_SHARE_READ,
                NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
        if(hFile==INVALID_HANDLE_VALUE)
        {
                CloseHandle(hFile);
                return;
        }
        hMapFile = CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,0,NULL);
       
        if(hMapFile ==INVALID_HANDLE_VALUE)
        {
               
                CloseHandle(hMapFile);
CloseHandle(hFile);
                return;
        }
        pMem = MapViewOfFile(hMapFile,FILE_MAP_WRITE|FILE_MAP_READ,0,0,0);
        if(!pMem)
        {
CloseHandle(hMapFile);
CloseHandle(hFile);
                CloseHandle(pMem);
                return;
        }               
        //----------------------------------------
        //得到dos_header
        memcpy(image_dos_header,pMem,sizeof(IMAGE_DOS_HEADER));
        DWORD *AddressOfpMem = (DWORD*)&pMem;
        DWORD ValueOfpMem = *AddressOfpMem;
        //根程序尺寸
        dwDosStubSize=image_dos_header->e_lfanew-sizeof(IMAGE_DOS_HEADER);
        dwDosStubOffset=sizeof(IMAGE_DOS_HEADER);
        pDosStub=new CHAR[dwDosStubSize];
        if((dwDosStubSize&0x80000000)==0x00000000)
        {
                CopyMemory(pDosStub,(char*)pMem+dwDosStubOffset,dwDosStubSize);
        }
        //得到nt_header
        memcpy(image_nt_headers,
                (char*)pMem+image_dos_header->e_lfanew,
                sizeof(IMAGE_NT_HEADERS));
        dwRO_first_section=image_dos_header->e_lfanew+sizeof(IMAGE_NT_HEADERS);
        //第一个节头的首地址
        sectionHead = (PIMAGE_SECTION_HEADER)((char *)image_nt_headers + sizeof(IMAGE_NT_HEADERS));
        if(image_dos_header->e_magic!=IMAGE_DOS_SIGNATURE)// MZ
        {
                MessageBox("Invalid PE Format");
                GlobalFree(pMem);
                return;
        }
        if(image_nt_headers->Signature!=IMAGE_NT_SIGNATURE)// PE00
        {

               
                return;
        }
        //节头数量
        SectionNum=image_nt_headers->FileHeader.NumberOfSections;
        for( i=0;i<SectionNum;i++)
        {
                //得到每节节头
                CopyMemory(image_section_header[i],(char*)pMem+dwRO_first_section+i*sizeof(IMAGE_SECTION_HEADER),
                        sizeof(IMAGE_SECTION_HEADER));
        }
        //----------------------------------------
        for(i=0;i<SectionNum;i++)
        {
                //为每节分配内存
                image_section[i]=(char*)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT,
                        PEAlign(image_section_header[i]->SizeOfRawData,
                        image_nt_headers->OptionalHeader.FileAlignment));
                //得到每节内容
                CopyMemory(image_section[i],
                        (char*)pMem+image_section_header[i]->PointerToRawData,
                        image_section_header[i]->SizeOfRawData);
        }
        int k;
        DWORD codeLength,codeRVA,codeOffset;
        callAddress = newcode;
        endAddress = ending;
        codeLength = reinterpret_cast<DWORD>(endAddress) - reinterpret_cast<DWORD>(callAddress);
        DWORD add=(DWORD)(newcode);
        DWORD add1=(DWORD)(ending);
        codeLength=add1-add;
       
        for (k=0;k<image_nt_headers->FileHeader.NumberOfSections;k++)
        {

                if (((image_section_header[k]->Misc.VirtualSize) - (image_section_header[k]->SizeOfRawData))> codeLength)
                {
                        codeRVA = image_section_header[k]->VirtualAddress + image_section_header[k]->Misc.VirtualSize;
                        codeOffset = image_section_header[k]->PointerToRawData + image_section_header[k]->Misc.VirtualSize;
                        image_section_header[k]->Characteristics = image_section_header[k]->Characteristics | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE;
                        image_section_header[k]->Misc.VirtualSize = image_section_header[k]->Misc.VirtualSize + codeLength;
               
                        image_nt_headers->OptionalHeader.AddressOfEntryPoint =  codeRVA;====这句有问题!!

                        RtlMoveMemory((char*)pMem + codeOffset,newcode,codeLength);
                        break;
                }
        }
       
        UnmapViewOfFile(pMem);
        CloseHandle(hMapFile);
        CloseHandle(hFile);
2007-8-3 21:03
0
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
5
把自己的代码写到节的空隙中去?
codeRVA = image_section_header[k]->VirtualAddress + image_section_header[k]->Misc.VirtualSize;

如果image_section_header[k]->Misc.VirtualSize按SectionAlignment对齐了,似乎就会写到下一节去了
2007-8-3 21:34
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢回答,是添加到空隙中
现在的问题是先假设codeRVA正确,我更改了AddressOfEntryPoint,而查看更改后的文件,发现AddressOfEntryPoint 没变
2007-8-3 22:52
0
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
7
如果程序没有问题的话,试试用FlushViewOfFile刷一下视图文件
2007-8-4 11:41
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
FlushViewOfFile(image_nt_headers,sizeof(image_nt_headers);
还是没用,要么把代码发给你,麻烦你帮我看看
2007-8-4 14:05
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
AddressOfEntryPoint还是无法改变,大家帮忙看看
2007-8-6 20:45
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
10
随便看了一下,你修改的似乎只是拷贝到你自己里的内存数据,没有修改pMem的数据。要修改文件你必须修改pMem里的数据才对。
2007-8-6 21:28
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
11
memcpy((void*)image_nt_headers,
    (char*)pMem+image_dos_header->e_lfanew,
    sizeof(IMAGE_NT_HEADERS));

image_nt_headers只是一个程序的变量,你将pMem文件的数据拷贝到程序的变量,对程序的变量修改数据只对变量有效,而不会对文件有影响。

image_nt_headers->OptionalHeader.AddressOfEntryPoint =  codeRVA; //你这里只是修改image_nt_headers变量的数据,但他和pMem变量是没有任何联系的,也就是说他和文件没有任何联系,你修改这里只是变量里的数据被改动了,但文件的pMem数据并没有改变。
2007-8-6 21:34
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
谢谢小虾的提醒,知道原因了
也谢谢llydd
2007-8-6 23:35
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
DWORD dwNtHeader=((PIMAGE_DOS_HEADER)pMem)->e_lfanew;
        int iSecNum = (PIMAGE_NT_HEADERS((char*)pMem + dwNtHeader))->FileHeader.NumberOfSections;
        DWORD dwFirstSecHeader = dwNtHeader + sizeof(IMAGE_NT_HEADERS);
        int k;
        DWORD codeLength,codeRVA,codeOffset,OldEntry;
        callAddress = newcode;
        endAddress = ending;
        codeLength = reinterpret_cast<DWORD>(endAddress) - reinterpret_cast<DWORD>(callAddress);
        DWORD add=(DWORD)(newcode);
        DWORD add1=(DWORD)(ending);
        codeLength=add1-add;
        for(k=0;k<iSecNum;k++)
        {
                if (((PIMAGE_SECTION_HEADER((char*)pMem + dwFirstSecHeader + k*sizeof(IMAGE_SECTION_HEADER)))->Misc.VirtualSize
                        -(PIMAGE_SECTION_HEADER((char*)pMem + dwFirstSecHeader + k*sizeof(IMAGE_SECTION_HEADER)))->SizeOfRawData)
                        >codeLength)
                {
                        codeRVA = (PIMAGE_SECTION_HEADER((char*)pMem + dwFirstSecHeader + k*sizeof(IMAGE_SECTION_HEADER)))->Misc.VirtualSize
                                + (PIMAGE_SECTION_HEADER((char*)pMem + dwFirstSecHeader + k*sizeof(IMAGE_SECTION_HEADER)))->VirtualAddress;
                        codeOffset = (PIMAGE_SECTION_HEADER((char*)pMem + dwFirstSecHeader + k*sizeof(IMAGE_SECTION_HEADER)))->Misc.VirtualSize
                                + (PIMAGE_SECTION_HEADER((char*)pMem + dwFirstSecHeader + k*sizeof(IMAGE_SECTION_HEADER)))->PointerToRawData;
                        (PIMAGE_SECTION_HEADER((char*)pMem + dwFirstSecHeader + k*sizeof(IMAGE_SECTION_HEADER)))->Characteristics =0xc0000040;
                        RtlMoveMemory((char*)pMem + codeOffset,callAddress,codeLength);
                        OldEntry = (PIMAGE_NT_HEADERS((char*)pMem + dwNtHeader))->OptionalHeader.AddressOfEntryPoint + (PIMAGE_NT_HEADERS((char*)pMem + dwNtHeader))->OptionalHeader.ImageBase;
                        (PIMAGE_NT_HEADERS((char*)pMem + dwNtHeader))->OptionalHeader.AddressOfEntryPoint = codeRVA;
                       
                        break;
                }

        }

AddressOfEntryPoint修改成功,我想先执行newcode,然后回到原AddressOfEntryPoint,文件改了以后,没有执行AfxMessageBox,用peid看EP区段也没有内容,怎么办??
void newcode()
{
        AfxMessageBox("dd");
        __asm
        {
                jmp OldEntry
        }
}
2007-8-7 21:33
0
游客
登录 | 注册 方可回帖
返回
//