|

- #include <stdio.h>
- #include <windows.h>
- //声明并开始定义获取OEP的函数
- bool myfindope(LPCSTR szFilename)
- {
- //申请一个句柄变量
- HANDLE hfile;
- ////调用CreateFile打开制定的文件,并把句柄返回给hfile变量,函数的具体参数说明请参阅MSDN
- if ((hfile = CreateFile(szFilename,GENERIC_READ,FILE_SHARE_READ,
- 0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0)) == INVALID_HANDLE_VALUE)
- // 判断createfile函数的返回值,如果为INVALID_HANDLE_VALUE则输出打开文件失败,返回false!
- {
- printf("can not open this file\n");
- return false;
- }
- //申请 两个DWORD类型变量,
- DWORD dwOEP,cbRead;
- //申请一个IMAGE_DOS_HEADER 结构类型的变量imagedos
- IMAGE_DOS_HEADER imagedos;
- //从打开的文件句柄中读取文件的DOS头,错误则关闭句柄,返回false,输出提示
- if( !ReadFile(hfile,&imagedos,sizeof(IMAGE_DOS_HEADER),&cbRead,NULL))
- {
- printf("read image dos header failed\n");
- CloseHandle(hfile);
- return false;
- }
- //申请并初始化一个变量的值为IMAGE_OPTIONAL_HEADER结构了成员AdressofEntryPoint的RVA值
- int Entrypos = imagedos.e_lfanew + 40;
- //设置文件的当前读写位置为AdressofEntryPoint成员所在的位置;
- SetFilePointer(hfile,Entrypos,NULL,FILE_BEGIN);
- //读取AdressofEntrypoint的值,大小为4个字节,存入dwOEP变量中,失败则返回
- if (!ReadFile(hfile,&dwOEP,sizeof(dwOEP),&cbRead,NULL))
- {
- printf("read OEP failed\n");
- CloseHandle(hfile);
- return false;
- }
- //关闭文件句柄
- CloseHandle(hfile);
- //输出文件OEP值
- printf("The File OEP are 0x%x\n",dwOEP);
- return true;
- }
- void main()
- {
- LPCSTR filename; //申请一个字符串常量指针filename
- filename = "nimei.exe"; //初始化filename
- myfindope(filename); //调用写的函数
- system("pause");
- }
复制代码
本文只是获取未加壳文件的OEP信息,对加过壳的文件无效! |
|