能力值:
( LV3,RANK:20 )
|
-
-
2 楼
问题解决。呵呵!不留下痕迹了
|
能力值:
( LV3,RANK:20 )
|
-
-
3 楼
pExport=(PIMAGE_EXPORT_DIRECTORY)(dwIED);//这一步为什么出错?
得到的 PIMAGE_EXPORT_DIRECTORY 结构里所有字段均为0
三个图:左边是我软件弹出的对话框,右边是LordPE
最下面是VS2008 的调试窗口
|
能力值:
( LV13,RANK:260 )
|
-
-
4 楼
磁盘文件 映射文件 加载文件 弄清楚哈。。
|
能力值:
( LV3,RANK:20 )
|
-
-
5 楼
问题已解决。谢谢楼上。
|
能力值:
( LV3,RANK:20 )
|
-
-
6 楼
软件已完成 void CexportDlg::OnDropFiles(HDROP hDropInfo)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
UINT count;
TCHAR filePath[200];
count = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);
if(count>1)
{
AfxMessageBox(L"请不要拖入多个文件!");
return ;
}
//for(UINT i=0; i<count; i++)
//{
// int pathLen = DragQueryFile(hDropInfo, i, filePath, sizeof(filePath));
// //AfxMessageBox(filePath);
//}
DragQueryFile(hDropInfo, 0, filePath, sizeof(filePath));
//AfxMessageBox(filePath);
HANDLE hFile=CreateFile(filePath,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile==INVALID_HANDLE_VALUE)
{
AfxMessageBox(L"查询失败,本文件可能正被其他程序使用!");
return;
}
HANDLE hFileMapping=CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,0);
if (hFileMapping==NULL)
{
AfxMessageBox(L"查询失败,本文件可能正被其他程序使用");
return;
}
PVOID pImage=(PVOID)MapViewOfFile(hFileMapping,FILE_MAP_READ,0,0,0); //得到dll的基址
//判断是否为PE文件
PIMAGE_DOS_HEADER pDH=NULL;
PIMAGE_NT_HEADERS pNtH=NULL;
pDH=(PIMAGE_DOS_HEADER)pImage;
if (pDH->e_magic!=IMAGE_DOS_SIGNATURE)
{
AfxMessageBox(L"非PE文件!");
return ;
}
pNtH=(PIMAGE_NT_HEADERS)(pDH->e_lfanew+(DWORD)pImage);
if (pNtH->Signature!=IMAGE_NT_SIGNATURE)
{
AfxMessageBox(L"非PE文件!");
return ;
}
////得到数据目录表第一项:输出表结构
DWORD dwpIED=(DWORD)(pNtH)+0x78; //
DWORD dwIEDSize=*(DWORD*)(dwpIED+4); //IED结构的大小
if (dwIEDSize==0)
{
AfxMessageBox(L"没有通过名字输出的函数!");
return ;
}
DWORD dwIEDRVA=*(DWORD*)dwpIED;//IED的RVA
PVOID pDirData=(PVOID)ImageRvaToVa(pNtH,pImage,dwIEDRVA,NULL);
PIMAGE_EXPORT_DIRECTORY pExport=NULL;
pExport=(PIMAGE_EXPORT_DIRECTORY)(pDirData);
int num=pExport->NumberOfFunctions;
PDWORD pdwNames=NULL;
PDWORD pDllNameRNA=NULL;
CHAR * pDllName=NULL;
pdwNames=(PDWORD)ImageRvaToVa(pNtH,pImage,pExport->AddressOfNames,NULL);
/*pDllNameRNA=(PDWORD)ImageRvaToVa(pNtH,pImage,pExport->Name,NULL);
pDllName=(char*)ImageRvaToVa(pNtH,pImage,pDllNameRNA,NULL);
CHAR szBuf[MAX_PATH];*/
CString tips;
tips.Format(L"此dll可通过名字输出%d个函数!",num);
MessageBox(tips,L"提示",0x20);
CHAR * szFuncName=NULL;
list.ResetContent();
WCHAR szFunc[MAX_PATH]={0};
CString str;
for (int i=0;i<num;i++)
{
szFuncName=(char*)ImageRvaToVa(pNtH,pImage,pdwNames[i],NULL);
int len=MultiByteToWideChar(0,0,szFuncName,-1,NULL,0);
WCHAR szFunc[MAX_PATH]={0};
MultiByteToWideChar(0,0,szFuncName,len,szFunc,len);
str.Format(L"%s",szFuncName);
list.AddString((LPCTSTR)(LPTSTR)szFunc);
}
UnmapViewOfFile(hFileMapping);
CloseHandle(hFileMapping);
CloseHandle(hFile);
DragFinish(hDropInfo);
CDialog::OnDropFiles(hDropInfo);
}
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
感谢楼主分享!!谢谢了!!
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
看看。。。书藏。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
慢慢理解!
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
下载了。谢谢了。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
谢谢分享,下了学习!
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
标记一下,有时间来分析分析!~~~
|
能力值:
( LV8,RANK:120 )
|
-
-
13 楼
不够完美。你要弄可以查一个目录下的所有PE文件的导出函数。
而且支持用户输入一个函数查找。我当时也MFC了一个这样的玩具
|