找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 5799|回复: 4

恢复Inline Hook的代码怎么翻译?

[复制链接]

280

主题

203

回帖

0

精华

版主

积分
1808
发表于 2010-6-28 00:47:51 | 显示全部楼层 |阅读模式
本帖最后由 乔丹二世 于 2010-6-28 00:54 编辑

原贴:http://www.m5home.com/bbs/redirect.php?goto=findpost&ptid=3752&pid=18588&fromuid=4282
关于重定位的翻译不正确,高手看看怎么回事?memcpy就是RtlMoveMemory。

  1. Public Function Reloc(ByVal lpBase As Long, ByVal VirtualAddress As Long) As Boolean
  2. 'ULONG Reloc(ULONG lpBase, ULONG VirtualAddress )
  3. '{
  4. '    PIMAGE_DOS_HEADER       pDosHeader;
  5. '    PIMAGE_NT_HEADERS       pNtHeader;
  6. '    PIMAGE_BASE_RELOCATION  pRelocTable;
  7. '    ULONG i,dwOldProtect;
  8.     Dim DosHeader As IMAGE_DOS_HEADER
  9.     Dim NtHeader As IMAGE_NT_HEADERS
  10.     Dim RelocTable As IMAGE_BASE_RELOCATION
  11.     Dim pDosHeader, pNtHeader, pRelocTable, I, dwOldProtect As Long
  12. '    pDosHeader = (PIMAGE_DOS_HEADER)lpBase;
  13.     pDosHeader = lpBase
  14. '    if ( pDosHeader->e_magic != IMAGE_DOS_SIGNATURE )
  15. '        return 0;
  16.     memcpy VarPtr(DosHeader), pDosHeader, LenB(DosHeader)
  17.     If DosHeader.Magic <> IMAGE_DOS_SIGNATURE Then
  18.         Reloc = False
  19.         Exit Function
  20.     End If
  21. '    pNtHeader =(PIMAGE_NT_HEADERS)( (ULONG)lpBase + pDosHeader->e_lfanew );
  22.     pNtHeader = UAdd(lpBase, DosHeader.lfanew)
  23.     memcpy VarPtr(NtHeader), pNtHeader, LenB(NtHeader)
  24. '    if (pNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size)
  25. '    {
  26.     If (NtHeader.OptionalHeader.DataEntries(IMAGE_DIRECTORY_ENTRY_BASERELOC).DataSize) Then
  27. '        pRelocTable=(PIMAGE_BASE_RELOCATION)((ULONG)lpBase + pNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress);
  28.         pRelocTable = UAdd(lpBase, NtHeader.OptionalHeader.DataEntries(IMAGE_DIRECTORY_ENTRY_BASERELOC).DataRVA)
  29.         memcpy VarPtr(RelocTable), pRelocTable, LenB(RelocTable)
  30. '        Do
  31.         Do
  32. '        {
  33. '            ULONG   numofReloc=(pRelocTable->SizeOfBlock-sizeof(IMAGE_BASE_RELOCATION))/2;
  34.             Dim numofReloc As Long: numofReloc = (USub(RelocTable.SizeOfBlock, 8)) / 2
  35. '            SHORT   minioffset=0;
  36.             Dim minioffset As Integer: minioffset = 0
  37. '            PUSHORT pRelocData=(PUSHORT)((ULONG)pRelocTable+sizeof(IMAGE_BASE_RELOCATION));
  38.             Dim pRelocData As Long: pRelocData = UAdd(pRelocTable, 8)
  39. '            for (i=0;i<numofReloc;i++)
  40.             For I = 0 To numofReloc - 1 Step 1
  41. '            {
  42. '                PULONG RelocAddress;
  43.                 Dim RelocAddress As Long
  44. '                if (((*pRelocData)>>12)==IMAGE_REL_BASED_HIGHLOW)
  45.                 If (IntFromPtr(pRelocData) \ (2 ^ 12) = IMAGE_REL_BASED_HIGHLOW) Then
  46. '                {
  47. '                    minioffset=(*pRelocData)&0xFFF;
  48.                     minioffset = IntFromPtr(pRelocData) And &HFFF
  49. '                    RelocAddress=(PULONG)(lpBase+pRelocTable->VirtualAddress+minioffset);
  50.                     RelocAddress = UAdd(UAdd(lpBase, RelocTable.VirtualAddress), minioffset)
  51. '                    VirtualProtect((PVOID)RelocAddress, 4, PAGE_EXECUTE_READWRITE, &dwOldProtect);
  52.                     Call VirtualProtect(RelocAddress, 4, PAGE_EXECUTE_READWRITE, VarPtr(dwOldProtect))
  53. '                    *RelocAddress=*RelocAddress+VirtualAddress-pNtHeader->OptionalHeader.ImageBase;
  54.                     memcpy RelocAddress, USub(UAdd(LngFromPtr(RelocAddress), VirtualAddress), NtHeader.OptionalHeader.ImageBase), 4
  55. '                    VirtualProtect((PVOID)RelocAddress, 4, dwOldProtect, NULL);
  56.                     Call VirtualProtect(RelocAddress, 4, dwOldProtect, 0)
  57. '                }
  58.                 End If
  59. '                pRelocData++;
  60.                 pRelocData = UAdd(pRelocData, 1)
  61. '            }
  62.             Next
  63. '            pRelocTable=(PIMAGE_BASE_RELOCATION)((ULONG)pRelocTable+pRelocTable->SizeOfBlock);
  64.             pRelocTable = UAdd(pRelocTable, RelocTable.SizeOfBlock)
  65. '        }while (pRelocTable->VirtualAddress);
  66.         Loop While (RelocTable.VirtualAddress)
  67. '        return TRUE;
  68.         Reloc = True
  69.         Exit Function
  70. '    }
  71.     End If
  72. '    return FALSE;
  73.     Reloc = False
  74.     Exit Function
  75. '}
  76. End Function
复制代码

280

主题

203

回帖

0

精华

版主

积分
1808
 楼主| 发表于 2010-6-28 00:48:57 | 显示全部楼层
本帖最后由 乔丹二世 于 2010-6-28 00:53 编辑

把LenB改成Len也不正确。
另:网上找到的UADD、USUB函数:

  1. Private Const MaxInt32 As Long = &H7FFFFFFF
  2. Private Const MinInt32 As Long = &H80000000
  3. Public Function UAdd(ByVal a As Long, ByVal b As Long) As Long
  4.     UAdd = ((a And MaxInt32) + ((b And MaxInt32) Or MinInt32)) Xor (a And MinInt32) Xor (b And MinInt32) Xor MinInt32
  5. End Function
  6. Public Function USub(ByVal a As Long, ByVal b As Long) As Long
  7.     USub = ((a And MaxInt32) - (b And MaxInt32)) Xor (a And MinInt32) Xor (b And MinInt32)
  8. End Function
复制代码

280

主题

203

回帖

0

精华

版主

积分
1808
 楼主| 发表于 2010-6-28 00:49:53 | 显示全部楼层
我在网上找到的结构体:

  1. Private Const FILE_MAP_READ = 4
  2. Private Const PAGE_READONLY = &H2
  3. Private Const IMAGE_REL_BASED_HIGHLOW = 3
  4. Private Const IMAGE_DIRECTORY_ENTRY_BASERELOC = 5
  5. Private Const PAGE_EXECUTE_READWRITE As Long = &H40
  6. Private Const DONT_RESOLVE_DLL_REFERENCES As Long = &H1

  7. Private Enum ImageSignatureTypes
  8.    IMAGE_DOS_SIGNATURE = &H5A4D     ''\\ MZ
  9.    IMAGE_OS2_SIGNATURE = &H454E     ''\\ NE
  10.    IMAGE_OS2_SIGNATURE_LE = &H454C  ''\\ LE
  11.    IMAGE_VXD_SIGNATURE = &H454C     ''\\ LE
  12.    IMAGE_NT_SIGNATURE = &H4550      ''\\ PE00
  13. End Enum

  14. Private Type IMAGE_DOS_HEADER
  15.     Magic    As Integer
  16.     cblp     As Integer
  17.     cp       As Integer
  18.     crlc     As Integer
  19.     cparhdr  As Integer
  20.     minalloc As Integer
  21.     maxalloc As Integer
  22.     ss       As Integer
  23.     sp       As Integer
  24.     csum     As Integer
  25.     ip       As Integer
  26.     cs       As Integer
  27.     lfarlc   As Integer
  28.     ovno     As Integer
  29.     res(3)   As Integer
  30.     oemid    As Integer
  31.     oeminfo  As Integer
  32.     res2(9)  As Integer
  33.     lfanew   As Long
  34. End Type

  35. Private Type IMAGE_FILE_HEADER
  36.     Machine              As Integer
  37.     NumberOfSections     As Integer
  38.     TimeDateStamp        As Long
  39.     PointerToSymbolTable As Long
  40.     NumberOfSymbols      As Long
  41.     SizeOfOtionalHeader  As Integer
  42.     Characteristics      As Integer  '±ê&Ouml;&frac34;Dll
  43. End Type

  44. Private Type IMAGE_DATA_DIRECTORY
  45.     DataRVA     As Long
  46.     DataSize    As Long
  47. End Type

  48. Private Type IMAGE_OPTIONAL_HEADER
  49.     Magic             As Integer
  50.     MajorLinkVer      As Byte
  51.     MinorLinkVer      As Byte
  52.     CodeSize          As Long
  53.     InitDataSize      As Long
  54.     unInitDataSize    As Long
  55.     EntryPoint        As Long
  56.     CodeBase          As Long
  57.     DataBase          As Long
  58.     ImageBase         As Long
  59.     SectionAlignment  As Long
  60.     FileAlignment     As Long
  61.     MajorOSVer        As Integer
  62.     MinorOSVer        As Integer
  63.     MajorImageVer     As Integer
  64.     MinorImageVer     As Integer
  65.     MajorSSVer        As Integer
  66.     MinorSSVer        As Integer
  67.     Win32Ver          As Long
  68.     ImageSize         As Long
  69.     HeaderSize        As Long
  70.     Checksum          As Long
  71.     Subsystem         As Integer
  72.     DLLChars          As Integer
  73.     StackRes          As Long
  74.     StackCommit       As Long
  75.     HeapReserve       As Long
  76.     HeapCommit        As Long
  77.     LoaderFlags       As Long
  78.     RVAsAndSizes      As Long
  79.     DataEntries(15)   As IMAGE_DATA_DIRECTORY
  80. End Type

  81. Private Type IMAGE_NT_HEADERS
  82.     Signature As Long
  83.     FileHeader As IMAGE_FILE_HEADER
  84.     OptionalHeader As IMAGE_OPTIONAL_HEADER
  85. End Type

  86. Private Type IMAGE_BASE_RELOCATION
  87.     VirtualAddress As Long
  88.     SizeOfBlock As Long
  89. End Type
复制代码

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2010-6-28 00:55:32 | 显示全部楼层
帮你顶顶.

现在可能都差不多睡了,再不然就是在准备看球...........
我就是嗷嗷叫的老马了......

280

主题

203

回帖

0

精华

版主

积分
1808
 楼主| 发表于 2010-6-28 16:53:10 | 显示全部楼层
我只是想知道,到底哪里错了。。。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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