你如何计算像 .rdata / .data 这样的 PE 部分的地址开始/大小

逆向工程 ollydbg 聚乙烯 VB6
2021-07-03 17:17:24

我想在 vb6 中克隆 ollydbg 的功能,这样我就可以更轻松地编写自己的工具,然后使用它的脚本引擎。

我首先尝试以与 ollydbg 完全相同的方式映射内存映射的地址。

奥利维尤

PE 标头位于 0x00400000 处,大小为 0x1000

我假设 0x00400000 是这样检索的。

Dim AddressOfPE As Long = NTHEADER.OptionalHeader.ImageBase

现在我想映射所有其他最重要的东西的地址,.text .rdata但我不介意拥有它们。

我试过的是这个

For u = 0 To UBound(SECTIONSHEADER)
    AddressStart = AddressOfPE + SECTIONSHEADER(u).VirtualAddress
    Debug.Print "(" & u & ") " & SECTIONSHEADER(u).nameSec & _
    " AddressStart = " & Hex(AddressStart) & _
    " VirtualAddress = " & Hex(SECTIONSHEADER(u).VirtualAddress) & _
    " VirtualSize = " & Hex(SECTIONSHEADER(u).VirtualSize) & _
    " SizeOfRawData = " & Hex(SECTIONSHEADER(u).SizeOfRawData)
    'Hunt for strings
    If SECTIONSHEADER(u).nameSec = ".rdata" Or SECTIONSHEADER(u).nameSec = ".data" Then
        MsgBox "a"
    End If
    AddressEnd = AddressStart + SECTIONSHEADER(u).SizeOfRawData
    Debug.Print "(" & u & ") " & SECTIONSHEADER(u).nameSec & _
    " AddressEnd(?) = " & Hex(AddressEnd) & _
    " OllyAddressEnd(?) = " & Hex(SECTIONSHEADER(u).SizeOfRawData)
Next u

调试日志看起来像这样

(0) .text  AddressStart = 401000 VirtualAddress = 1000 VirtualSize = 1FAB3AD SizeOfRawData = 1FAB400
(0) .text  AddressEnd(?) = 23AC400 OllyAddressEnd(?) = 1FAB400
(1) .rdata AddressStart = 23AD000 VirtualAddress = 1FAD000 VirtualSize = 855586 SizeOfRawData = 855600
(1) .rdata AddressEnd(?) = 2C02600 OllyAddressEnd(?) = 855600
(2) .data  AddressStart = 2C03000 VirtualAddress = 2803000 VirtualSize = 2D045C4 SizeOfRawData = 1DF000
(2) .data  AddressEnd(?) = 2DE2000 OllyAddressEnd(?) = 1DF000
(3) .rsrc  AddressStart = 5908000 VirtualAddress = 5508000 VirtualSize = 105CC SizeOfRawData = 10600
(3) .rsrc  AddressEnd(?) = 5918600 OllyAddressEnd(?) = 10600

看着这张图片,我好像没问题?但大小地址已关闭。

pe101 图片

1个回答

当当我解决了它,我以为你必须添加上一个节大小来创建新的节地址,但它不能那样工作。

仍然有一个小错误,该错误比VirtualSize该部分的 OllyDbg 的内存映射大小小,但SizeOfRawData有时似乎更准确?

但我想我可以通过获取每个部分的前一个 StartAddress 并从中减去一个来获得 End Size 来解决这个问题。

我想我可以将其标记为已解决。

Dim AddressOfPE As Long
Dim RawFileOffsetToCheck As Long
Dim StartAddress as Long
Dim EndAddresss as Long   

AddressOfPE = NTHEADER.OptionalHeader.ImageBase

For u = 0 To UBound(SECTIONSHEADER)
    StartAddress = AddressOfPE + SECTIONSHEADER(u).VirtualAddress
    EndAddresss = AddressOfPE + RoundUp((SECTIONSHEADER(u).VirtualAddress + SECTIONSHEADER(u).VirtualSize), NtHeader.OptionalHeader.SectionAlignment) - 1

    If offset >= StartAddress And offset <= EndAddresss Then
        RawFileOffsetToCheck = offset - StartAddress  + SECTIONSHEADER(u).PointerToRawData
    End If
    'Hunt for strings
    'TODO: Use the STUFF here.. pretty easy since we get the file offset here [RawFileOffsetToCheck]
Next u


Public Function RoundUp(V, M) As Long
    If (V Mod M) = 0 Then
        RoundUp = V
    Else
        RoundUp = ((V \ M) + 1) * M
    End If
End Function

调试输出与 ollydbg 视图完全一样

.text  401000 23ACFFF
.rdata 23AD000 2C02FFF
.data  2C03000 5907FFF
.rsrc  5908000 5918FFF