在 IDA 中,db 和 dd offset 在数据部分中是什么意思?

逆向工程 艾达
2021-06-15 18:25:20

所以,在.datasection中有一些变量,在它之后有dbor ddoffset)。这到底是什么意思?“对齐”是什么意思?是否有任何 Wiki 或类似的东西可以详细说明所有这些?

    .data:0048A374                 db    0
    .data:0048A375                 db    0
    .data:0048A376                 db    0
    .data:0048A377                 db    0
    .data:0048A378 off_48A378      dd offset unk_48A000    ; DATA XREF: start+41↑o
    .data:0048A37C                 dd offset unk_48A1CE
    .data:0048A380                 dd offset unk_48A1CE
    .data:0048A384                 dd offset unk_48A33C
    .data:0048A388 byte_48A388     db 1                    ; DATA XREF: __InitVCL+3↑r
    .data:0048A389                 align 10h
    .data:0048A390                 dd offset WinMain
    .data:0048A394                 dd offset __matherr
    .data:0048A398                 dd offset __matherrl
    .data:0048A39C                 align 10h
    .data:0048A3A0                 dd offset unk_48F66C
    .data:0048A3A4                 dd offset off_490784
    .data:0048A3A8                 dd offset off_490788
    .data:0048A3AC                 dd offset __handle_setargv
    .data:0048A3B0                 dd offset __handle_exitargv
    .data:0048A3B4                 dd offset __handle_wsetargv
    .data:0048A3B8                 dd offset __handle_wexitargv
    .data:0048A3BC                 dd offset dword_48F0EC
    .data:0048A3C0 byte_48A3C0     db 0                    ; DATA XREF: ___CRTL_VCL_Init_2+2↑r
    .data:0048A3C0                                         ; __InitVCL+17↑r
    .data:0048A3C1 byte_48A3C1     db 0                    ; DATA XREF: .text:00401060↑r
    .data:0048A3C1                                         ; ___CRTL_VCL_Init_2+B↑r ...
    .data:0048A3C2                 dd offset unk_4906E4
    .data:0048A3C6                 dd offset unk_4907AC
    .data:0048A3CA                 dd offset unk_4904F0
    .data:0048A3CE                 db    0
    .data:0048A3CF ; DWORD dwTlsIndex
    .data:0048A3CF dwTlsIndex      dd 0                    ; DATA XREF: start:loc_401012↑r
    .data:0048A3CF                                         ; .text:00401082↑r ...
    .data:0048A3D3 dword_48A3D3    dd 0                    ; DATA XREF: start+1A↑w
    .data:0048A3D7 dword_48A3D7    dd 0                    ; DATA XREF: start+4D↑w
    .data:0048A3D7                                         ; .text:__getHInstance↑r ...
    .data:0048A3DB                 db  90h ; ђ
    .data:0048A3DC ; Exported entry 156. ___CPPdebugHook
    .data:0048A3DC                 public ___CPPdebugHook
    .data:0048A3DC ___CPPdebugHook db    0                 ; DATA XREF: start+E↑o
    .data:0048A3DC                                         ; sub_46AF30+20↑o ...
    .data:0048A3DD                 db    0
    .data:0048A3DE                 db    0
    .data:0048A3DF                 db    0
1个回答
  • db手段“ d efine b YTE”,即保留1个的存储器字节,
  • dw手段“ d efine瓦特ORD”(2个字节的存储器),
  • dd手段“ d efine d ouble字”(4个字节的存储器)。

offset前缀的装置来填充保留字节(一个或多个)不与所提到的数据本身(即,不与所述内容),而是仅与偏移到它(即,与位置在存储器中的数据的,表示为字节数从段的开头)。

align指令的意思是“如果此地址不是给定数字的倍数,则跳过必要的字节数以满足下一个数据的此地址要求”。


您可能会在您的列表中看到它:

  • db 1 是在地址0048a388,它仅占用1字节(db- d efine b YTE,即,1个字节)和与给定值进行填充(1)。所以下一个地址是0048a389

  • 在此下一个地址 ( 0048a389) 是align 10h指令,因此该地址处的字节和地址处的后续 6 个字节

    • 0048a38a, 0048a388b, 0048a38c, 0048a38d, 0048a38e, 和0048a38f

    跳过,因为它们不满足“10h 的倍数”的请求(即,它们以十六进制表示的最后一位数字不是 0)。

  • 在下一个地址0048a390(最终满足align 10h要求)是指令

    • dd offset WinMain,

    该储备4个字节的存储器(dd- d efine d ouble字),和填充它们与偏移的(开始的)的WinMain函数(offset WinMain)。