首页
社区
课程
招聘
VB快速逆向法
发表于: 2005-3-17 13:20 79909

VB快速逆向法

nbw 活跃值
24
2005-3-17 13:20
79909

VB快速逆向法

作者:nbw
原作:B. Kathras

一般来说VB程序很难入手分析,除了利用一些已经被分析出来的VB库导出函数,在很少有入口去进行分析了。我看了B. Kathras写的文章,觉得很不错,好东西不敢独享,这里就整理一下,给大家一起看看。
首先是如何处理nag窗口,然后是处理各种控件的属性。这些方法很实用,我也享受了一下5分钟ko的乐趣。

原作来自http://www.CodeBreakers-Journal.com ,这里不是翻译,我也没有把他里面说的所有东西都试验,因此有了什么问题你可以去找作者。
阅读以前最好能够理解VB里面一些基本术语,比如Form就是窗口,Label就是标签等。不过也无大所谓。

在VB程序中,有很多方法可以初始化nag窗口。最常用的一种类似于:

Form.show

这句话被编译后,在程序中变成以下形式:

:0040203D FF92B0020000 call dword ptr [edx+000002B0]

所以,反汇编源程序,搜索字符串  +000002B0]  就可以找到这个地方。其中的寄存器一般为 edx, ecx 或者 eax ...
如果要去掉这种nag,可以去掉这个call,但是有时候移除这个call的时候需要平衡堆栈,因为nop掉该函数会导致esp高24h,可以采用以下方法移除:

:0040203D 83C424 add esp, 00000024
:00402040 EB01 jmp 00402043
:00402042 90 nop

一般也可以通过对函数 __vbanew2 下断点断到这个地方。这个函数是窗口创建时候采用的函数,但是并不是类似于 DialogBoxParamA 的函数,而只是一个声明函数,比如:

Dim NagScreen as New NagForm
NagScreen.Show

另外一种显示nag窗口的方法是加载的时候利用窗口的 visible 属性。属性设定为 false 就不显示,否则就显示。属性的设置一般利用下面语句:

NagForm.Visible = True

编译后变成如下形式:

:00401FF9 6AFF push FFFFFFFF
<-这是VB中的TRUE变量

:00401FFB 50 push eax
:00401FFC 898568FFFFFF mov dword ptr [ebp+FFFFFF68], eax
:00402002 8B10 mov edx, dword ptr [eax]
:00402004 FF92BC010000 call dword ptr [edx+000001BC]
<-初始化属性的函数

可以通过搜索特征码 +000001BC] 来定位到这个地方。

对付这种nag,只需要修改一下属性变量就行了。VB中 00 代表 False ,所以把上面的变量改成 00 就可以,例如:

:00401FF9 6A00 push 00
:00401FFB 50 push eax
:00401FFC 898568FFFFFF mov dword ptr [ebp+FFFFFF68], eax
:00402002 8B10 mov edx, dword ptr [eax]
:00402004 FF92BC010000 call dword ptr [edx+000001BC]

这样就可以移除该nag。

改变对象属性

有很多对象属性我们都想要了解,我在这里列出来最常用的一些属性查找方法。
最常用的断点拦截函数是 __vbaSetObj ,但是现在的软件都非常大,以至于通过拦截这个函数来确定属性很不现实。不过可以通过别的一些特征来判定属性。
对于按钮的 Enable 属性,一般程序实现如下:

Command1.Enabled = False

编译后如下:

:00402018 57 push edi <--- value of edi = 00
which in VB = False
:00402019 56 push esi
:0040201A 8B06 mov eax, dword ptr [esi]
:0040201C FF908C000000 call dword ptr [eax+0000008C] <--- Initialization call

可以通过搜索特征: +0000008C] 来定位这个地方

有很多方法来处理这里的属性,比如可以把 402018 地方入栈的代表 TRUE的参数 -1 改成 00,表示False。或者把这里的call给去掉,如下:

:0040201C E901000000 jmp 00402022
:00402021 90 nop

请注意这种方法不仅仅适用于按钮,也适合处理text Box文本框的可用或者不可用。

下面是按钮的 visible/invisible 属性。程序运行时改变按钮改属性的代码如下:

Command1.Visible = False

编译后,如下:

:00402018 57 push edi <--- value of edi = 00 which in VB = False
:00402019 56 push esi
:0040201A 8B06 mov eax, dword ptr [esi]
:0040201C FF9094000000 call dword ptr [eax+00000094] <--- Initialization call

如果修改属性,可以通过修改 push edi 的值或者去掉这个函数。
请注意这个方法也适合处理 Label标签的 enableing/disabling 属性。

如果去掉未注册信息,有时候需要处理 Label标签的 visible/invisible 属性。程序中一般为:

Label1.Visible = False

编译后如下:

:00402018 57 push edi <--- value of edi = 00 which in VB = False
:00402019 56 push esi
:0040201A 8B06 mov eax, dword ptr [esi]
:0040201C FF909C000000 call dword ptr [eax+0000009C] <--- Initialization call

可以搜索特征:        +0000009C]
处理方法和上面一样。不说了。

对于菜单限制,一般处理 enabling/disabling 属性,程序中如下:

mnuRegister.Enabled = False

编译后:

:004020A8 57 push edi <--- value of edi = 00 which in VB = False
:004020A9 56 push esi
:004020AA 8B06 mov eax, dword ptr [esi]
:004020AC FF5074 call [eax+74] <--- Initialization call

可以搜索特征: +74]

对于text文本框的数据,也可以有相应处理,程序中如下:

Text1.Text = "Insert blah blah here"

编译后如下:

:00401C35 6890174000 push 00401790 <--- Push the address of the
above string to the stack
:00401C3A 56 push esi
:00401C3B 8B06 mov eax, dword ptr [esi]
:00401C3D FF90A4000000 call dword ptr [eax+000000A4] <--- Initialization call

其中 push 00401790 是文本框中数据的地址,如果想修改文本框中的数据,可以修改这个地址的数据,或者直接修改这个地址以指向你的字符串。如果不乐意,当然也可以把这个函数给nop掉。

对于很多控件中的caption属性,我们都可以进行修改。比如窗口标题栏上的数据,或者label标签里面的内容,都可以进行处理。程序中一般实现方法是:

mainForm.Caption = "Blah Blah v1.0 - Unregistered"

编译后:
* Possible StringData Ref from Code Obj ->"Blah Blah v1.0 - Unregistered"
|
:004020CC 68FC194000 push 004019FC <--- Location of the above string
:004020D1 50 push eax
:004020D2 898564FFFFFF mov dword ptr [ebp+FFFFFF64], eax
:004020D8 8B10 mov edx, dword ptr [eax]
:004020DA FF5254 call [edx+54] <--- Initialization Call

可以搜索特征: +54]

这里请注意,你可以通过搜索字符串 "Blah Blah v1.0 - Unregistered" 来确定这个地方,但是很多时候这些字符串动态导入,无法被搜索到,因此比较保险的就是搜索所有的 call [someregister+54] ,这样可以处理所有的caption。定位以后,你可以通过上面介绍的方法进行处理。

上面介绍了很多属性的特征。最后我们来讨论一下一个对象的所有属性,其实别的对象的属性也可以通过下面方法来确定。
看一下下面的内存内容,我们可以计算出其代表的对象。

properties.
.004011D0: 00 0D 01 00-00 3E 00 00-00 00 05 00-46 6F 72 6D -- > - Form
.004011E0: 31 00 0D 01-05 00 46 6F-72 6D 31 00-19 01 00 42 1 --- Form1 -- B
.004011F0: 00 23 FF FF-FF FF 24 05-00 46 6F 72-6D 31 00 35 # $- Form1 5
.00401200: 3C 00 00 00-59 01 00 00-48 12 00 00-7B 0C 00 00 < Y- H- {-
.00401210: 46 03 FF 01-28 00 00 00-05 07 00 4F-70 74 69 6F F- -( -- Optio
.00401220: 6E 31 00 06-01 07 00 4F-70 74 69 6F-6E 31 00 05 n1 --- Option1 -
.00401230: D0 02 08 07-57 03 C3 00-12 04 00 FF-03 26 00 00 ----W-- -- -&
.00401240: 00 04 06 00-43 68 65 63-6B 31 00 05-01 06 00 43 -- Check1 --- C
.00401250: 68 65 63 6B-31 00 05 D0-02 28 05 BF-04 FF 00 12 heck1 ---(--- -
.00401260: 03 00 FF 03-24 00 00 00-02 05 00 54-65 78 74 31 - -$ -- Text1
.00401270: 00 02 04 38-04 D0 02 F7-08 77 01 0B-05 00 54 65 --8-----w--- Te
.00401280: 78 74 31 00-12 01 00 FF-03 2C 00 00-00 01 08 00 xt1 -- -, --
.00401290: 43 6F 6D 6D-61 6E 64 31-00 04 01 08-00 43 6F 6D Command1 --- Com
.004012A0: 6D 61 6E 64-31 00 04 E0-01 60 09 BF-04 77 01 08 mand1 ---?--w--
.004012B0: 00 11 00 00-FF 03 26 00-00 00 03 06-00 4C 61 62 - -& -- Lab
.004012C0: 65 6C 31 00-01 01 06 00-4C 61 62 65-6C 31 00 05 el1 --- Label1 -
.004012D0: B0 04 F0 00-27 06 77 01-12 02 00 FF-02 04 00 00 --- ?w--- --
.004012E0: 50 00 00 00-AB 51 84 9E-E1 4E 9C 4A-90 DB 82 61 P Q-NJ-a
.004012F0: 67 D3 DD F9-00 00 00 00-00 00 00 00-00 00 00 00 g---

对象名称 object = Command1
下面是各种属性:
Object.Caption = Command1
Object.Left = 480
Object.Top = 2400
Object.Width = 1215
Object.Height = 375
Object.Enabled = False

下面是VB中各种属性列表:
00 Picturebox
01 Label
02 TextBox
03 Frame
04 Command Button
05 CheckBox
06 Option Button
07 ComboBox
08 ListBox
0B Timer
0D Form

如果你想修改相应的属性,只需要修改一下内存里面的数值就可以了。

最后附上一个VB CrakeMe。理论上根据上面的文章,就可以搞定这个东西。我搞了2个,别的没搞。嘿嘿

附件:VBCrakeMe.rar


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

收藏
免费 8
支持
分享
最新回复 (74)
雪    币: 332
活跃值: (479)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
2
精彩啊,收了
2005-3-17 13:27
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
3
收藏。
2005-3-17 14:08
0
雪    币: 238
活跃值: (250)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
4
不支持简直都对不起我自己
支持!!
2005-3-17 14:19
0
雪    币: 3697
活跃值: (4252)
能力值: (RANK:215 )
在线值:
发帖
回帖
粉丝
5
很好!!!!试验了一遍,GOOD!!!
2005-3-17 15:49
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
6
最初由 china 发布
很好!!!!试验了一遍,GOOD!!!


5分钟KO?
2005-3-17 16:10
0
雪    币: 3697
活跃值: (4252)
能力值: (RANK:215 )
在线值:
发帖
回帖
粉丝
7
最初由 nbw 发布




5分钟KO?


几分钟就比划着弄完了,但是form的标题没能去掉,郁闷ing,在整理材料,下周省里来学校督察,正在造假ing,指点一下,怎么去掉标题?
2005-3-17 16:17
0
雪    币: 235
活跃值: (191)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
8
好文章不顶对不起你
2005-3-17 16:18
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
9
最初由 china 发布


几分钟就比划着弄完了,但是form的标题没能去掉,郁闷ing,在整理材料,下周省里来学校督察,正在造假ing,指点一下,怎么去掉标题?


好快的刀阿。

窗口标题我也没研究,我看文章里面说的窗口标题属性跟label那些差不多,不过具体还真没看。实在不行就SMC,用SetWindowText。 再实在不行PS一下娃哈哈。
2005-3-17 17:17
0
雪    币: 107
活跃值: (54)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
upup
2005-3-17 18:27
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
刚才试了下菜单可用和按钮可用,的确够cool
upup
2005-3-17 18:45
0
雪    币: 244
活跃值: (265)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
12
精彩,收藏!
2005-3-17 19:36
0
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
以前有这么想过,但从没有这样的文章介绍。
今天终于如愿。
收藏中。等以后碰到VB程序再练练刀。
2005-3-17 19:46
0
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
14
最初由 china 发布
怎么去掉标题?[


俺来给 nbw 来划划刀,,,,
10秒就可以,改改标题 caption 就可以
2005-3-17 19:51
0
雪    币: 3697
活跃值: (4252)
能力值: (RANK:215 )
在线值:
发帖
回帖
粉丝
15
我晕,教教偶。
2005-3-17 21:18
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
16
学习学习~
2005-3-17 21:25
0
雪    币: 383
活跃值: (786)
能力值: ( LV12,RANK:730 )
在线值:
发帖
回帖
粉丝
17
分析Call 模式的功能特征,不错

请教一下 nwb 牛博士,下面这种nag窗口的排除方法

举例:
VB程序启动时,有两个Form,一个是Nag,另一个是主窗口,当然是先Nag后主,Nag窗口主要是由3个按钮(help、进入、退出)、一个Timer和一些提示的Label组成;Timer用来计时“进入”可用状态,只有点“进入”才能主窗口,没有任何注册可以避过。

这样的设计不知如何取巧跳过Nag窗体而直接显示主窗口?我想过了直接改跳向事件,但又好像没有了Nag窗口的初始,是会出问题的......
2005-3-17 21:28
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
不支持简直都对不起我自己
顶上,学习了
2005-3-17 21:51
0
雪    币: 221
活跃值: (137)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
19
强烈支持
2005-3-17 22:02
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
20
最初由 askformore 发布
分析Call 模式的功能特征,不错

请教一下 nwb 牛博士,下面这种nag窗口的排除方法

举例:
........


我个人感觉直接跳过去应该不行,也就是你说的初始化问题。但是这种nag一般来说都是可以去掉的,如果注册的话,这个nag就不会显示,说明是可以通过判断来取消的。nag之所以为nag就在于可以去掉。

不过这些东西我也没做过,我写过几天VB,但是几乎没分析过VB程序,兄弟还请见谅!
2005-3-17 22:27
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
21
最初由 china 发布
我晕,教教偶。


据说从IDA里面搜索出来的。我在OD里面也搜索到了,不过标题的内容在OD里面选ASCII模式才可以看到。IDA里面是UNICODE模式。

按照老7的试验,我也找了几个VB程序看了一下,主窗口属性被放在 00401270 地址附近,建议在这个地方观察一下,一般来说应该可以处理窗口属性,当然也包括caption
2005-3-17 22:32
0
雪    币: 212
活跃值: (70)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
实验成功~~
2005-3-17 22:52
0
雪    币: 221
活跃值: (55)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
23
很有启发,go on
D:\nbwMasm\教程翻译\CrakeMe\Project1.vbp :)
2005-3-18 09:17
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
这种帖子要顶
2005-3-18 10:16
0
雪    币: 162
活跃值: (63)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
25
好帖子!顶顶
2005-3-18 10:23
0
游客
登录 | 注册 方可回帖
返回
//