首页
社区
课程
招聘
[求助]一个加壳的问题,高人急救啊!!
发表于: 2006-4-20 20:54 4605

[求助]一个加壳的问题,高人急救啊!!

2006-4-20 20:54
4605
BOOL ReadFileToMem(HANDLE hFile,LPVOID ImageBase)
{

        PIMAGE_FILE_HEADER  pFH=NULL;
        PIMAGE_SECTION_HEADER pSH=NULL;
        PIMAGE_NT_HEADERS pNtH=NULL;
        LPDWORD lpNumberOfBytsRead=0;
        DWORD SizeOfImage=0;  //内存中整个PE映像尺寸
        DWORD SizeOfHeader=0;  //PE头大小
        DWORD MapOfFile=0;    //申请所得内存的基址
        DWORD SectionAlignment=0;  //内存中的块对齐粒度
        if (!hFile)                                  
                return FALSE;

        pFH=GetFileHeader(ImageBase);     //得到文件头指针(PE头中的文件头)
        if(!pFH)
                return FALSE;
        pNtH=GetNtHeaders(ImageBase);     //取得PE文件头
        if(!pNtH)
                return FALSE;
        SizeOfImage = pNtH->OptionalHeader.SizeOfImage;
        MapOfFile=(DWORD)VirtualAlloc(NULL,SizeOfImage,MEM_COMMIT,PAGE_READWRITE);  //申请内存
        if(!MapOfFile)
                MessageBox(hwnd,"内存分配失败!","mypack",MB_OK);
//取PE头大小,读入PE头
        SizeOfHeader = pNtH->OptionalHeader.SizeOfHeaders;
        SetFilePointer(hFile,0,NULL,FILE_BEGIN);
        ReadFile(hFile,(LPDWORD)MapOfFile,SizeOfHeader,lpNumberOfBytsRead, NULL);
        pNtH->OptionalHeader.FileAlignment=0x200;   //文件中的块对齐粒度 (默认的就是0x200)
        SectionAlignment = pNtH->OptionalHeader.SectionAlignment;

        pSH = GetFirstSectionHeader(ImageBase);   //得到第一个区块表的指针
        for(int i=0;i<pFH->NumberOfSections;i++)
        {
                SetFilePointer(hFile,pSH->PointerToRawData,NULL,FILE_BEGIN);
                ReadFile(hFile,(LPDWORD)(MapOfFile+pSH->VirtualAddress),pSH->SizeOfRawData,lpNumberOfBytsRead,NULL);
               
                //对区块映像大小对齐
                pSH->Misc.VirtualSize=GetIntegral(pSH->Misc.VirtualSize,SectionAlignment);
                pSH++;   //指向下一区块.
        }
        //对整个文件大小对齐
        pNtH->OptionalHeader.SizeOfImage = GetIntegral(SizeOfImage,SectionAlignment);
        return TRUE;
}

我欲将文件读入内存,调试到ReadFile时出现0xC0000005: Access Violation.
错误.我定义MapOfFile为DWORD,传入ReadFile时显示转换为(LPDWORD)是否正确?
不转换出现cannot convert parameter 2 from 'unsigned long' to 'void *'
        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.
错误.
哪位前辈看看问题在哪?

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 44229
活跃值: (19965)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
ReadFile(hFile,(LPDWORD)(MapOfFile+pSH->VirtualAddress),pSH->SizeOfRawData,lpNumberOfBytsRead,NULL);


PCHAR        MapOfFile = 0;       
MapOfFile=new char[SizeOfImage];

for(int i=0;i<pFH->NumberOfSections;i++)
  {
        nRawDataSize    = pSH->SizeOfRawData;
        nVirtualAddress = pSH->VirtualAddress;

       ....
       ReadFile(hFile, &MapOfFile[nVirtualAddress], nRawDataSize,&NumberOfBytesRW, NULL);
       ....
  }
2006-4-20 21:32
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢老大的回复.但如果文件很大,能否分配出足够的空间呢?
2006-4-20 23:17
0
雪    币: 44229
活跃值: (19965)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
最初由 tangf 发布
感谢老大的回复.但如果文件很大,能否分配出足够的空间呢?


大到什么程度?
2006-4-21 07:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
如果SizeOfImage有几M大呢?

跟踪时发现可以正确读入数据,但发现一个向NULL地址写入的操作.
2006-4-21 11:40
0
游客
登录 | 注册 方可回帖
返回
//