精易论坛

标题: C编程, 通过打开文件获取OEP [打印本页]

作者: AKAsallen    时间: 2011-8-4 18:12
标题: C编程, 通过打开文件获取OEP
  1. #include <stdio.h>

  2. #include <windows.h>

  3. //声明并开始定义获取OEP的函数

  4. bool myfindope(LPCSTR szFilename)

  5. {

  6. //申请一个句柄变量

  7. HANDLE hfile;

  8. ////调用CreateFile打开制定的文件,并把句柄返回给hfile变量,函数的具体参数说明请参阅MSDN

  9. if ((hfile = CreateFile(szFilename,GENERIC_READ,FILE_SHARE_READ,

  10. 0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0)) == INVALID_HANDLE_VALUE)

  11. // 判断createfile函数的返回值,如果为INVALID_HANDLE_VALUE则输出打开文件失败,返回false!

  12. {

  13. printf("can not open this file\n");

  14. return false;

  15. }

  16. //申请 两个DWORD类型变量,

  17. DWORD dwOEP,cbRead;

  18. //申请一个IMAGE_DOS_HEADER 结构类型的变量imagedos

  19. IMAGE_DOS_HEADER imagedos;

  20. //从打开的文件句柄中读取文件的DOS头,错误则关闭句柄,返回false,输出提示

  21. if( !ReadFile(hfile,&imagedos,sizeof(IMAGE_DOS_HEADER),&cbRead,NULL))

  22. {

  23. printf("read image dos header failed\n");

  24. CloseHandle(hfile);

  25. return false;

  26. }

  27. //申请并初始化一个变量的值为IMAGE_OPTIONAL_HEADER结构了成员AdressofEntryPoint的RVA值

  28. int Entrypos = imagedos.e_lfanew + 40;

  29. //设置文件的当前读写位置为AdressofEntryPoint成员所在的位置;

  30. SetFilePointer(hfile,Entrypos,NULL,FILE_BEGIN);

  31. //读取AdressofEntrypoint的值,大小为4个字节,存入dwOEP变量中,失败则返回

  32. if (!ReadFile(hfile,&dwOEP,sizeof(dwOEP),&cbRead,NULL))

  33. {

  34. printf("read OEP failed\n");

  35. CloseHandle(hfile);

  36. return false;

  37. }

  38. //关闭文件句柄

  39. CloseHandle(hfile);

  40. //输出文件OEP值

  41. printf("The File OEP are 0x%x\n",dwOEP);

  42. return true;



  43. }

  44. void main()

  45. {

  46. LPCSTR filename; //申请一个字符串常量指针filename

  47. filename = "nimei.exe"; //初始化filename

  48. myfindope(filename); //调用写的函数

  49. system("pause");

  50. }
复制代码

本文只是获取未加壳文件的OEP信息,对加过壳的文件无效!




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4