了解VB6反汇编代码

时间:2015-02-04 09:54:23

标签: vb6 disassembly

我有一个旧的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部分。

有没有人有其他想法?

0 个答案:

没有答案
相关问题