首页
社区
课程
招聘
问个初级问题,关于MSVBVM60.__vbaStrCmp
发表于: 2007-2-2 08:55 4542

问个初级问题,关于MSVBVM60.__vbaStrCmp

2007-2-2 08:55
4542
有这样的代码:

/*401BF8*/  push    eax
/*401BF9*/  push    00401794
/*401BFE*/  call    dword ptr [<&MSVBVM60.__vbaStrCmp>]
/*401C04*/  mov     esi, eax
/*401C06*/  lea     ecx, dword ptr [ebp-18]
/*401C09*/  neg     esi
/*401C0B*/  sbb     esi, esi
/*401C0D*/  inc     esi
/*401C0E*/  neg     esi
/*401C10*/  call    dword ptr [<&MSVBVM60.__vbaFreeStr>]
/*401C16*/  lea     ecx, dword ptr [ebp-1C]
/*401C19*/  call    dword ptr [<&MSVBVM60.__vbaFreeObj>]
/*401C1F*/  mov     ecx, 80020004
/*401C24*/  mov     eax, 0A
/*401C29*/  cmp     si, di
/*401C2C*/  mov     dword ptr [ebp-54], ecx
/*401C2F*/  mov     dword ptr [ebp-5C], eax
/*401C32*/  mov     dword ptr [ebp-44], ecx
/*401C35*/  mov     dword ptr [ebp-4C], eax
/*401C38*/  mov     dword ptr [ebp-34], ecx
/*401C3B*/  mov     dword ptr [ebp-3C], eax
/*401C3E*/  je      short 00401C83



问题:
    执行/*401BFE*/  call    dword ptr [<&MSVBVM60.__vbaStrCmp>]后结果
都返回到哪里了?比如eax 或者 ?
    还有确定字符串是否相等的是不是
      /*401C29*/  cmp     si, di
   这一段代码?我跟踪了一下,如果相等的话si==di==0,
  如果谁能帮把这段代码详细解释一下就更好了,谢谢先

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
low
2
自己找资料看了看,再对比跟踪结果,确定
MSVBVM60.__vbaStrCmp
返回值在eax中,

可是不明白的是
/*401BFE*/  call    dword ptr [<&MSVBVM60.__vbaStrCmp>]
后面几句

/*401C04*/  mov     esi, eax
/*401C06*/  lea     ecx, dword ptr [ebp-18]
/*401C09*/  neg     esi
/*401C0B*/  sbb     esi, esi
/*401C0D*/  inc     esi
/*401C0E*/  neg     esi
/*401C10*/  call    dword ptr [<&MSVBVM60.__vbaFreeStr>]
/*401C16*/  lea     ecx, dword ptr [ebp-1C]
/*401C19*/  call    dword ptr [<&MSVBVM60.__vbaFreeObj>]
/*401C1F*/  mov     ecx, 80020004
/*401C24*/  mov     eax, 0A
/*401C29*/  cmp     si, di

用意何在?

反正MSVBVM60.__vbaStrCmp返回值就那么几种-1,1,0,null
直接判断eax的值不就可以了么?

望大家指教,谢谢
2007-2-2 09:23
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
3
STRCMP从字意上可以推断是字符串比较吧?那么后面一定得有一个比较指令,来控制程序的流程。所以后面那个CMP,实际就是比较STRCMP的返回结果,然后转向不同的流程。

另外你没有给出跟DI相关的代码,DI怎么来的,没给,别人怎么分析呢?

当然自己分析最好,一个程序这么多代码,就给其中一小部分,很难说清楚的。

最好自己用VB写一个字符比较的程序,然后反汇编看看
2007-2-2 11:32
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
low
4
谢谢斑竹回复,DI始终为0
我是不明白
MSVBVM60.__vbaStrCmp
把返回结果存入eax
为什么程序还要把eax 复值给esi
然后用
/*401C06*/ lea ecx, dword ptr [ebp-18]
/*401C09*/ neg esi
/*401C0B*/ sbb esi, esi
/*401C0D*/ inc esi
/*401C0E*/ neg esi
/*401C10*/ call dword ptr [<&MSVBVM60.__vbaFreeStr>]
/*401C16*/ lea ecx, dword ptr [ebp-1C]
/*401C19*/ call dword ptr [<&MSVBVM60.__vbaFreeObj>]
/*401C1F*/ mov ecx, 80020004
/*401C24*/ mov eax, 0A

来把esi处理一番,
最后比较si 与di (di始终==0)
为什么不直接比较eax是否==0来判断字符串是否相等呢?

程序就是我用VB写的一个简单的,

Private Sub Command1_Click()
    If Text1.Text = "xixihaha" Then
        MsgBox "ok"
    Else
        MsgBox "not ok"
    End If
End Sub
2007-2-2 11:49
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
5
你应该去问写编译器的作者。
你可以试试按你的想法去改。
如果正常运行了。那就是你说的也是对的
就象去一个地方,可以步行,可以用自行车,也能坐公车或者出租车。你问我为什么要用步行的,我还真的不知道该怎么答你
2007-2-2 13:50
0
雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
6
*401C06*/ lea ecx, dword ptr [ebp-18]
/*401C09*/ neg esi
/*401C0B*/ sbb esi, esi
/*401C0D*/ inc esi
/*401C0E*/ neg esi
/*401C10*/ call dword ptr [<&MSVBVM60.__vbaFreeStr>]
/*401C16*/ lea ecx, dword ptr [ebp-1C]
/*401C19*/ call dword ptr [<&MSVBVM60.__vbaFreeObj>]
/*401C1F*/ mov ecx, 80020004
/*401C24*/ mov eax, 0A

vb的东东。 因为你的字符串是在stack的变量。
   If Text1.Text = "xixihaha" Then
        MsgBox "ok"
    Else
        MsgBox "not ok"
    End If
首先, vb会给你生成一个临时的variant对象,
然后把text1.text的值放到这个变量中去。
你退出了Command1_Click(), 你说这个临时变量需要释放内存吗?
当然就有。
/*401C10*/ call dword ptr [<&MSVBVM60.__vbaFreeStr>]
/*401C16*/ lea ecx, dword ptr [ebp-1C]
/*401C19*/ call dword ptr [<&MSVBVM60.__vbaFreeObj>]

这种代码你可以不考虑的。

至于为什么要
  cmp     si, di这样, 不是直接test eax,eax呢。
你属于钻牛角尖。
比如我做编译器, 我生成代码的时候, 要比较字符串。
我一定会生成cmp esi,edi的值。
这个值怎么来, 我就希望在上面能得到。
比如mov esi, eax.

这叫约定。 懂吗。 不要觉得罗嗦。。。
2007-2-3 15:19
0
游客
登录 | 注册 方可回帖
返回
//