在 Memory Dump 中找到 VB5/6 Form Object 的标题

逆向工程 风袋 VB6
2021-07-01 05:01:33

我正在查看应用程序的一个问题,该应用程序丢失了源代码,并且应用程序在调用似乎是[代表表单对象的全局变量] 的代码后不久崩溃ZOrder 0(即试图使表单可见) 有多个表单,所以我试图具体确定正在访问哪个表单。为了解决这个问题,我制作了一些示例代码,如下所示:

Public gFormToActivate As Form

Private Sub cmddoDo_Click()
    gsCurrentLine = "START: Set gFormToActivate = FormDoDo"
    Set gFormToActivate = FormDoDo
    gsCurrentLine = "END: Set gFormToActivate = FormDoDo"
    gsCurrentLine = "START: Me.Hide"
    Me.Hide
    gsCurrentLine = "END: Me.Hide"
End Sub

ZOrder 稍后使用如下代码设置:

Private Sub Command1_Click()
    FormDoDo.Show
    FormDada.Show
    Form2.Show vbModal
    gsCurrentLine = "START: gFormToActivate.ZOrder 0"
    gFormToActivate.ZOrder 0
    gsCurrentLine = "END: gFormToActivate.ZOrder 0"
End Sub

我使用 IDA Pro 查看反汇编:

    .text:00403674 C7 45 D4 18 2B 40 00                                            mov     dword ptr [ebp-2Ch], offset aStartSetGformt ; "START: Set gFormToActivate = FormDoDo"
    .text:0040367B C7 45 CC 08 00 00 00                                            mov     dword ptr [ebp-34h], 8
    .text:00403682 FF D7                                                           call    edi ; __vbaVarCopy
    .text:00403684 A1 24 40 40 00                                                  mov     eax, dword_404024
    .text:00403689 85 C0                                                           test    eax, eax
    .text:0040368B 75 10                                                           jnz     short loc_40369D
    .text:0040368D 68 24 40 40 00                                                  push    offset dword_404024
    .text:00403692 68 60 15 40 00                                                  push    offset dword_401560
    .text:00403697 FF 15 4C 71 40 00                                               call    ds:__vbaNew2
    .text:0040369D
    .text:0040369D                                                 loc_40369D:                             ; CODE XREF: .text:0040368B↑j
    .text:0040369D 8B 0D 24 40 40 00                                               mov     ecx, dword_404024
    .text:004036A3 68 E4 26 40 00                                                  push    offset dword_4026E4
    .text:004036A8 51                                                              push    ecx
    .text:004036A9 FF 15 70 71 40 00                                               call    ds:__vbaCastObj
    .text:004036AF 50                                                              push    eax
    .text:004036B0 68 60 40 40 00                                                  push    offset dword_404060
    .text:004036B5 FF 15 08 71 40 00                                               call    ds:__vbaObjSet
    .text:004036BB 8D 55 CC                                                        lea     edx, [ebp-34h]
    .text:004036BE 8D 4D DC                                                        lea     ecx, [ebp-24h]
    .text:004036C1 C7 45 D4 68 2B 40 00                                            mov     dword ptr [ebp-2Ch], offset aEndSetGformtoa ; "END: Set gFormToActivate = FormDoDo"

基于此,我怀疑表单变量可能存储在“offset dword_404060”处。关于下一步如何更详细地解决如何获取此对象的属性的任何建议?在 WinDbg 中查找此地址显示以下内容。我一直在查看http://sandsprite.com/vb-reversing/files/Alex_Ionescu_vb_structures.pdf以更好地理解 VB 结构,但还没有找到解决方案

0个回答
没有发现任何回复~