找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 3702|回复: 1

TP的学习笔记:Ring3下获取当前系统的真实版本

[复制链接]

78

主题

190

回帖

9

精华

贵宾会员

积分
15605
发表于 2016-2-19 23:31:07 | 显示全部楼层 |阅读模式
近期在搞ARK,发现一件事情就是如果病毒木马在获取操作系统的版本值得路径上做手脚的话,比如设置兼容模式,就会引起杀毒软件报错从而无法加载,当然这个Bug一去不复返了。那么我们如何克服这个Bug呢?答案在内核文件上。
我们要解析PE文件结构,本文偷懒,只搞了32位的版本。
总体思路如下:打开文件->读取NT文件头->读取可选文件头的MajorImageVersion、MinorImageVersion,这两个值就是GetVersionEx得到的NT主版本号和次版本号了!代码如下:
  1. Public Sub GetFileVer(ByVal lpFileName As String,ByRef Version As Double)
  2. Dim hFile As Long
  3. Dim SecAttr As SECURITY_ATTRIBUTES
  4. Dim DosHead As IMAGE_DOS_HEADER
  5. Dim NtHead As IMAGE_NT_HEADERS
  6. Dim dwRead As Long
  7. Dim pBuffer As Long
  8. SecAttr.nLength = 12
  9. SecAttr.bInheritHandle = False
  10. hFile = CreateFile(lpFileName, GENERIC_READ, 0, SecAttr, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)
  11. If hFile <> -1 Then
  12.     SetFilePointer hFile, 0, 0, 0
  13.     ReadFile hFile, VarPtr(DosHead), Len(DosHead), dwRead, ByVal &H0
  14.     If DosHead.Magic <> &H5A4D Then MsgBox "Invalid Application", vbExclamation, "Error": Exit Sub
  15.     pBuffer = VirtualAlloc(0, DosHead.lfanew + Len(NtHead), &H1000, &H4)
  16.     ReadFile hFile, pBuffer, DosHead.lfanew + Len(NtHead), dwRead, 0
  17.     RtlMoveMemory VarPtr(NtHead), pBuffer + DosHead.lfanew, Len(NtHead)
  18.     Version = NtHead.OptionalHeader.MajorImageVer + NtHead.OptionalHeader.MinorImageVer /10
  19.     CloseHandle hFile
  20. Else
  21.     MsgBox "Failed to open file!", vbExclamation, "Error"
  22. End If
  23. End Sub
复制代码

貌似对PE文件结构的定义,VB的coder对其各有各的定义,那么我贴出我这里的定义
  1. Public Type SECURITY_ATTRIBUTES
  2.         nLength As Long
  3.         lpSecurityDescriptor As Long
  4.         bInheritHandle As Long
  5. End Type
  6. Private Type IMAGE_DOS_HEADER
  7.     Magic    As Integer
  8.     cblp     As Integer
  9.     cp       As Integer
  10.     crlc     As Integer
  11.     cparhdr  As Integer
  12.     minalloc As Integer
  13.     maxalloc As Integer
  14.     ss       As Integer
  15.     sp       As Integer
  16.     csum     As Integer
  17.     ip       As Integer
  18.     cs       As Integer
  19.     lfarlc   As Integer
  20.     ovno     As Integer
  21.     res(3)   As Integer
  22.     oemid    As Integer
  23.     oeminfo  As Integer
  24.     res2(9)  As Integer
  25.     lfanew      As Long
  26. End Type
  27. Private Type IMAGE_FILE_HEADER
  28.     Machine              As Integer
  29.     NumberOfSections     As Integer
  30.     TimeDateStamp        As Long
  31.     PointerToSymbolTable As Long
  32.     NumberOfSymbols      As Long
  33.     SizeOfOtionalHeader  As Integer
  34.     Characteristics      As Integer  '标志Dll
  35. End Type
  36. Private Type IMAGE_DATA_DIRECTORY
  37.     DataRVA     As Long
  38.     DataSize    As Long
  39. End Type
  40. Private Type IMAGE_OPTIONAL_HEADER
  41.     Magic             As Integer
  42.     MajorLinkVer      As Byte
  43.     MinorLinkVer      As Byte
  44.     CodeSize          As Long
  45.     InitDataSize      As Long
  46.     unInitDataSize    As Long
  47.     EntryPoint        As Long
  48.     CodeBase          As Long
  49.     DataBase          As Long
  50.     ImageBase         As Long
  51.     SectionAlignment  As Long
  52.     FileAlignment     As Long
  53.     MajorOSVer        As Integer
  54.     MinorOSVer        As Integer
  55.     MajorImageVer     As Integer
  56.     MinorImageVer     As Integer
  57.     MajorSSVer        As Integer
  58.     MinorSSVer        As Integer
  59.     Win32Ver          As Long
  60.     ImageSize         As Long
  61.     HeaderSize        As Long
  62.     Checksum          As Long
  63.     Subsystem         As Integer
  64.     DLLChars          As Integer
  65.     StackRes          As Long
  66.     StackCommit       As Long
  67.     HeapReserve       As Long
  68.     HeapCommit        As Long
  69.     LoaderFlags       As Long
  70.     RVAsAndSizes      As Long
  71.     DataEntries(15)   As IMAGE_DATA_DIRECTORY
  72. End Type
  73. Public Type IMAGE_NT_HEADERS
  74.     Signature As Long
  75.     FileHeader As IMAGE_FILE_HEADER
  76.     OptionalHeader As IMAGE_OPTIONAL_HEADER
  77. End Type
复制代码

本文的代码中只要对文件结构的定义作出修改,改成PE32+的文件结构,就能兼容到Win64了。

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2016-2-20 01:54:26 | 显示全部楼层
兼容性那个CHEAT好像对VB6程序完全无效。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表