我有一个旧的VB可执行文件,在我的项目中已经使用了很长时间。 应用程序的当前实现包含一个调试窗口 不再需要了。
当然,源代码丢失了,无法修改。 我的想法是修改打开烦人的调试窗口的实例的HEX代码。
为此,我使用DotFix软件的VB Decompiler,我想我找到了负责该实例的代码。不幸的是,我无法理解它是如何工作的。
让我们看一下反汇编代码:
loc_8F420C: var_8A = 0
loc_8F4219: If (Len(var_88) = &H30) Then
loc_8F4225: Call {3014B1BF-8A2C-23D7-B50400C24F280C20}.Method_arg_12 (var_88)
loc_8F4233: Call {3014B1BF-8A2C-23D7-B50400C24F280C20}.Method_arg_16 (var_108)
loc_8F423D: If CBool(var_108) Then
loc_8F424D: Me.Global.Unload Me
loc_8F4258: Else
loc_8F425A: var_8A = &HFF
...
loc_8F43B0: End If
loc_8F43B3: Else
乍一看 var_108
似乎是设置调试窗口的bool变量。我是否可以隐式添加 loc_8F423D: If CBool(false/true) Then
来阻止此窗口启动?
有人可以向我解释一下上面的 Call {#######-####-####-################}.Method_arg_##
是什么?
PEiD detect compiler:
Microsoft Visual Basic 5.0 / 6.0 [Overlay]
第2部分: 我花了很长时间才得到新的想法 - 可能是正确的想法。我们来看看汇编代码:
004F420C: 70 FStI2 var_8A <- loc_8F420C: var_8A = 0
看起来像loc_8F4219: If (Len(var_88) = &H30) Then
004F420F: 6C ILdRf var_88
004F4212: 4A FnLenStr Len()
004F4213: F5 LitI4: 48 (0x30)
让我们找到下一个代码片段:
004F4218: C7 EqI4 =
004F4219: 1C BranchF 004F43B3
我们的调用方法如下:
004F421C: 6C ILdRf var_88 < - (var_88) from Call
004F421F: 22 ImpAdLdPr
004F4222: 58 MemLdPr
004F4225: 0D VCallHresult var_88.vtable[12] <- Method_arg_12
004F422A: 04 FLdRfVar var_108 <- (var_108) possible CALL/BACK
004F422D: 22 ImpAdLdPr
004F4230: 58 MemLdPr
004F4233: 0D VCallHresult var_108.vtable[16] <- Method_arg_16
004F4238: 6C ILdRf var_108 <- (var_108) 70% sure is RESPONSE(true/false)
现在,烦人的P-Code&amp; Assembly中最有趣的部分,我们发现if实例验证是否需要Debug Windows。如果我们查看P-Code,我们可以看到,如果有以下形式:
loc_8F423D: If CBool(var_108) Then
loc_8F424D: Me.Global.Unload Me
loc_8F4258: Else
loc_8F425A: var_8A = &HFF
现在查看地址 - 如果是真实执行地址 00F424D / 8F424D 否则跳到 004F4258
004F423B: FC52 CBoolI4
004F423D: 1C BranchF 004F4258
004F4240: 6C ILdRf param_8
004F4243: FD9C FStAdNoPop
004F4247: 05 ImpAdLdRf
004F424A: 24 NewIfNullPr GLOBAL
004F424D: 0D VCallHresult Global._Unload(object As IDispatch)
004F4252: 1A FFree1Ad var_90
004F4255: 1E Branch 004F43B0
004F4258: loc_004F423D
004F4258: F4 LitI2_Byte: 255 (True)
可能,如果我更改004F423D: 1C BranchF 004F4258
以便它指向另一个地址004F424D
,从逻辑上讲,这可能会解决问题。
004F423D: 1C BranchF 004F424D
现在我正在尝试使用 OllyDbg 找到该地址 - 以测试是否有帮助。如果我成功,我会写第3部分。
有没有人有其他想法?