我正在查看应用程序的一个问题,该应用程序丢失了源代码,并且应用程序在调用似乎是[代表表单对象的全局变量] 的代码后不久崩溃。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 结构,但还没有找到解决方案