首页
社区
课程
招聘
编写PE分析工具是遇到的问题
发表于: 2006-5-22 17:43 4701

编写PE分析工具是遇到的问题

2006-5-22 17:43
4701
我试者自己编写PE分析工具,结果遇到提示
"0x00401154"指令引用的"0x1020000"内存。该内存不能为"read".
很多Copy了阿勇的代码.
主要的代码如下:
BOOL DlgProc (HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
int lowID;
switch (uMsg){
        case WM_INITDIALOG:
                LoadIcon( hInst , MAKEINTRESOURCE(10));
                break;
        case WM_COMMAND:
                lowID=LOWORD(wParam);
                if (lowID==1001)
                        LoadFile("a.exe");//我在当前目录下放的一个PE格式的文件
                        ShowFileHeaderInfo(hWnd);//显示文件头信息
                break;
        case WM_CLOSE:
                EndDialog(hWnd,FALSE);
                break;
        default:
                return FALSE;
}
return TRUE;
}

BOOL LoadFile(LPSTR pszFileName,HWND hWnd)
{
        HANDLE hFile;
        BOOL bSuccess=FALSE;
        char buf[20];
        hFile=CreateFile(pszFileName,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING ,FILE_ATTRIBUTE_ARCHIVE,0);
        if(hFile!=INVALID_HANDLE_VALUE)
        {
                DWORD dwFileSize;
                HANDLE hMapFile;
                LPVOID lpMem;
                stMapFile.hFile=hFile;
                dwFileSize=GetFileSize(hFile,0);
                hMapFile=CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);
                if(hMapFile)
                {       
                        stMapFile.hMapping =hMapFile;
                        lpMem=MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);
                        if(lpMem)
                        {
                                if(IsPEFile(lpMem)==FALSE)
                                {
                                MessageBox(NULL,"不是PE格式的文件","info",MB_ICONINFORMATION|MB_OK);
                                }
                                else
                                {
                                stMapFile.ImageBase=(LPVOID)lpMem;       
                                MessageBox(NULL,"是PE格式的文件","info",MB_ICONINFORMATION|MB_OK);
                                bSuccess=TRUE;
                                ShowFileHeaderInfo(hWnd);
                                }
                                UnmapViewOfFile(lpMem);
                        }
                CloseHandle(hMapFile);       
                }
                CloseHandle(hFile);               
        }
        return bSuccess;
}
急啊!帮帮忙!谢谢各位了!
这是Radasm代码http://home.goofar.com/buluo/pe.rar

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
2
这类错误一般不容易直接看出来,一般通过调试来解决
如果自己调试有困难的话可以把,可以把文件传上来,大伙来帮你调
2006-5-22 18:17
0
雪    币: 255
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
代码我上传了,帮忙调试啊,谢谢了!!
2006-5-23 05:26
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
4
BOOL DlgProc (HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
int lowID;
switch (uMsg){
  case WM_INITDIALOG:
    LoadIcon( hInst , MAKEINTRESOURCE(10));
    break;
  case WM_COMMAND:
    lowID=LOWORD(wParam);
    if (lowID==1001)
      LoadFile("a.exe");/*主要是你这一句出了问题,你在这个函数里取得的hMap在退函数之后已经被你在函数里面释放了,所以你下一句ShowFileHeaderInfo再使用被释放后的hMap自然会出现错误。*/
/*      ShowFileHeaderInfo(hWnd);*/  /*将这一句注释掉就没问题了 */

    break;
  case WM_CLOSE:
    EndDialog(hWnd,FALSE);
    break;
  default:
    return FALSE;
}
return TRUE;
}

BOOL LoadFile(LPSTR pszFileName,HWND hWnd)
{
  HANDLE hFile;
  BOOL bSuccess=FALSE;
  char buf[20];
  hFile=CreateFile(pszFileName,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING ,FILE_ATTRIBUTE_ARCHIVE,0);
  if(hFile!=INVALID_HANDLE_VALUE)
  {
    DWORD dwFileSize;
    HANDLE hMapFile;
    LPVOID lpMem;
    stMapFile.hFile=hFile;
    dwFileSize=GetFileSize(hFile,0);
    hMapFile=CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);
    if(hMapFile)
    {  
      stMapFile.hMapping =hMapFile;
      lpMem=MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);
      if(lpMem)
      {
        if(IsPEFile(lpMem)==FALSE)
        {
        MessageBox(NULL,"不是PE格式的文件","info",MB_ICONINFORMATION|MB_OK);
        }
        else
        {
        stMapFile.ImageBase=(LPVOID)lpMem;  
        MessageBox(NULL,"是PE格式的文件","info",MB_ICONINFORMATION|MB_OK);
        bSuccess=TRUE;
        ShowFileHeaderInfo(hWnd);
        }
        UnmapViewOfFile(lpMem);
      }
    CloseHandle(hMapFile);  
    }
    CloseHandle(hFile);   
  }
  return bSuccess;
}
2006-5-23 08:46
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
5
如果你要其它地方再次使用hMap句柄,那么释放语句必须放在程序退出时再释放。不能放在LoadFile函数内。
2006-5-23 08:49
0
雪    币: 255
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
谢谢斑竹,这个错误我我注释了,但还是不能在文本框里显示PE信息,该怎么办啊!
2006-5-25 16:39
0
雪    币: 255
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
我整好了,原来是函数声明时露调了一个参数
好郁闷,我好像每次都是错在粗心大意上
看来编程得 很 细心和需要很好的耐心的
2006-5-25 17:06
0
游客
登录 | 注册 方可回帖
返回
//