找回密码
 注册
搜索
热搜: 回贴

浅谈VB6逆向工程(5),VB6逆向工程,逆向工程技术

2010-1-30 18:38| 发布者: admin| 查看: 236| 评论: 0|原作者: 琴姬


浅谈VB6逆向工程(5),VB6逆向工程,逆向工程技术
2008年06月24日 星期二 下午 03:46
5. VB中的异常处理



这里我只从跟踪的角度来谈异常处理。很多人说在VB中发生异常是会跟进虚拟机里,

在里面打转。其实VB的异常处理没有那么复杂,可以很容易的出来的。

这里先介绍一个VB的万能断点:MSVBVM60.__vbaExceptHandler,VB在每个过程

的开始都要安装一个线程异常处理过程,在OD中对这个函数下断点百分百有效。需要注意

的事当你找到自己需要的地方时要及时清除这个断点,否则会在你不期望的时候中断:)



下面依旧以一段代码为例说明:

Dim a, b, c, d

On Error Resume Next

a = 5

b = 6

c = 0

d = b / c

Print a



到现在为止你应该能看懂下面的代码了。所以我只对源代码注释:



00401A20 PUSH EBP

00401A21 MOV EBP,ESP

00401A23 SUB ESP,18

00401A26 PUSH

00401A2B MOV EAX,DWORD PTR FS:[0]

00401A31 PUSH EAX

00401A32 MOV DWORD PTR FS:[0],ESP

00401A39 MOV EAX,74

00401A3E CALL

00401A43 PUSH EBX

00401A44 PUSH ESI

00401A45 PUSH EDI

00401A46 MOV DWORD PTR SS:[EBP-18],ESP

00401A49 MOV DWORD PTR SS:[EBP-14],工程2.00401088

00401A50 MOV EAX,DWORD PTR SS:[EBP 8]

00401A53 AND EAX,1

00401A56 MOV DWORD PTR SS:[EBP-10],EAX

00401A59 MOV ECX,DWORD PTR SS:[EBP 8]

00401A5C AND ECX,FFFFFFFE

00401A5F MOV DWORD PTR SS:[EBP 8],ECX

00401A62 MOV DWORD PTR SS:[EBP-C],0

00401A69 MOV EDX,DWORD PTR SS:[EBP 8]

00401A6C MOV EAX,DWORD PTR DS:[EDX]

00401A6E MOV ECX,DWORD PTR SS:[EBP 8]

00401A71 PUSH ECX

00401A72 CALL DWORD PTR DS:[EAX 4]



00401A75 MOV DWORD PTR SS:[EBP-4],1

00401A7C MOV DWORD PTR SS:[EBP-4],2

00401A83 PUSH -1

00401A85 CALL DWORD PTR DS:[<&MSVBVM60.__vbaOnError>]



//On Error Resume Next



00401A8B MOV DWORD PTR SS:[EBP-4],3

00401A92 MOV DWORD PTR SS:[EBP-78],5

00401A99 MOV DWORD PTR SS:[EBP-80],2

00401AA0 LEA EDX,DWORD PTR SS:[EBP-80]

00401AA3 LEA ECX,DWORD PTR SS:[EBP-30]

00401AA6 CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarMove>]



// a = 5



00401AAC MOV DWORD PTR SS:[EBP-4],4

00401AB3 MOV DWORD PTR SS:[EBP-78],6

00401ABA MOV DWORD PTR SS:[EBP-80],2

00401AC1 LEA EDX,DWORD PTR SS:[EBP-80]

00401AC4 LEA ECX,DWORD PTR SS:[EBP-40]

00401AC7 CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarMove>]



// b = 6



00401ACD MOV DWORD PTR SS:[EBP-4],5

00401AD4 MOV DWORD PTR SS:[EBP-78],0

00401ADB MOV DWORD PTR SS:[EBP-80],2

00401AE2 LEA EDX,DWORD PTR SS:[EBP-80]

00401AE5 LEA ECX,DWORD PTR SS:[EBP-50]

00401AE8 CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarMove>]



// c = 0



00401AEE MOV DWORD PTR SS:[EBP-4],6

00401AF5 LEA EDX,DWORD PTR SS:[EBP-40]

00401AF8 PUSH EDX

00401AF9 LEA EAX,DWORD PTR SS:[EBP-50]

00401AFC PUSH EAX

00401AFD LEA ECX,DWORD PTR SS:[EBP-70]

00401B00 PUSH ECX

00401B01 CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarDiv>]

00401B07 MOV EDX,EAX

00401B09 LEA ECX,DWORD PTR SS:[EBP-60]

00401B0C CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarMove>] ; MSVBVM60.__vbaVarMove



// d = b / c



00401B12 MOV DWORD PTR SS:[EBP-4],7

00401B19 LEA EDX,DWORD PTR SS:[EBP-30]

00401B1C PUSH EDX

00401B1D MOV EAX,DWORD PTR SS:[EBP 8]

00401B20 PUSH EAX

00401B21 PUSH 工程2.004016E8

00401B26 CALL DWORD PTR DS:[<&MSVBVM60.__vbaPrintObj>]



//print a



为了不占篇幅,删去了后面的代码.看到onError时你应该小心的处理这个

过程,刚才的断点还没有清除吧?如果清除了在__vbaExceptHandler这个函数

上重新下个断点.运行程序,会在这个断点上停下来,我们跟进这个函数里.

在OD中按f8一路向下走,你应该在这里跟飞:

660E3D3A MOV AX,WORD PTR DS:[ESI]

660E3D3D TEST AL,30

660E3D3F JE SHORT MSVBVM60.660E3D4D

660E3D41 CMP DWORD PTR DS:[EDI 14],0

660E3D45 JE SHORT MSVBVM60.660E3D4D

660E3D47 TEST BYTE PTR DS:[EDI 10],2

660E3D4B JE SHORT MSVBVM60.660E3D55

660E3D4D TEST AL,1

660E3D4F JE MSVBVM60.660E3DDB

660E3D55 PUSH ECX

660E3D56 CALL MSVBVM60.660E415C

660E3D5B PUSH DWORD PTR SS:[EBP 8]

660E3D5E MOV DWORD PTR SS:[EBP C],EAX

660E3D61 CALL MSVBVM60.660E4121

660E3D66 TEST EAX,EAX

660E3D68 JE SHORT MSVBVM60.660E3DDB

660E3D6A CMP DWORD PTR SS:[EBP C],0

660E3D6E JE SHORT MSVBVM60.660E3D75

660E3D70 TEST BYTE PTR DS:[ESI],1

660E3D73 JE SHORT MSVBVM60.660E3DDB

660E3D75 PUSH EDI

660E3D76 CALL MSVBVM60.66103DBF

660E3D7B CALL MSVBVM60.660CDE2E

660E3D80 XOR EAX,EAX

660E3D82 CMP DWORD PTR SS:[EBP C],EAX

660E3D85 JNZ MSVBVM60.660E3E4B

660E3D8B TEST BYTE PTR DS:[ESI],30

660E3D8E JE SHORT MSVBVM60.660E3E04

660E3D90 CMP DWORD PTR DS:[EDI 14],EAX

660E3D93 JE SHORT MSVBVM60.660E3E04

660E3D95 TEST BYTE PTR DS:[EDI 10],2

660E3D99 JNZ SHORT MSVBVM60.660E3E04

660E3D9B PUSH EAX

660E3D9C PUSH 1

660E3D9E PUSH EAX

660E3D9F PUSH ESI

660E3DA0 PUSH EDI

660E3DA1 CALL MSVBVM60.660E3F47

660E3DA6 TEST BYTE PTR DS:[ESI],40

660E3DA9 PUSH DWORD PTR DS:[6610EE7C]

660E3DAF JE SHORT MSVBVM60.660E3DE3

660E3DB1 CALL EBX

660E3DB3 MOV ECX,DWORD PTR DS:[EDI 1C]

660E3DB6 MOV EDX,DWORD PTR DS:[ESI 18]

660E3DB9 MOVZX ECX,WORD PTR DS:[EDX ECX*2 2]

660E3DBE MOV DWORD PTR DS:[EAX 98],ECX

660E3DC4 MOV EAX,DWORD PTR DS:[EDI 14]

660E3DC7 CMP EAX,-2

660E3DCA JE SHORT MSVBVM60.660E3DF9

660E3DCC CMP EAX,-1

660E3DCF JE SHORT MSVBVM60.660E3DEE

660E3DD1 TEST EAX,EAX

660E3DD3 JE SHORT MSVBVM60.660E3DDB

660E3DD5 PUSH EDI

660E3DD6 CALL MSVBVM60.660E408D //这里跟飞



我们在这里下个断点,重新运行程序,到这里按F7跟进.会来到下面:



660E408D PUSH EBP

660E408E MOV EBP,ESP

660E4090 PUSH ECX

660E4091 MOV EAX,DWORD PTR SS:[EBP 8]

660E4094 AND DWORD PTR SS:[EBP-4],0

660E4098 AND DWORD PTR SS:[EBP 8],0

660E409C PUSH EBX

660E409D MOV ECX,DWORD PTR DS:[EAX 1C]

660E40A0 MOV EDX,DWORD PTR DS:[EAX C]

660E40A3 MOV DWORD PTR DS:[EAX 18],ECX

660E40A6 PUSH ESI

660E40A7 MOV ECX,DWORD PTR DS:[EDX 10]

660E40AA PUSH EDI

660E40AB MOV ESI,DWORD PTR DS:[ECX]

660E40AD TEST ESI,ESI

660E40AF JLE SHORT MSVBVM60.660E40C6

660E40B1 LEA EDI,DWORD PTR DS:[ECX 4]

660E40B4 MOV EBX,DWORD PTR DS:[EAX 14]

660E40B7 CMP EBX,DWORD PTR DS:[EDI]

660E40B9 JE SHORT MSVBVM60.660E40EA

660E40BB INC DWORD PTR SS:[EBP 8]

660E40BE ADD EDI,8

660E40C1 CMP DWORD PTR SS:[EBP 8],ESI

660E40C4 ^ JL SHORT MSVBVM60.660E40B4

660E40C6 MOVSX ECX,WORD PTR DS:[EDX 2]

660E40CA OR DWORD PTR DS:[EAX 10],2

660E40CE PUSH MSVBVM60.660E3FD3

660E40D3 PUSH DWORD PTR DS:[EAX 8]

660E40D6 LEA EAX,DWORD PTR DS:[ECX EAX C]

660E40DA PUSH EAX

660E40DB PUSH DWORD PTR SS:[EBP-4] //这里就是返回地址了

660E40DE CALL MSVBVM60.66103DAC

660E40E3 POP EDI

660E40E4 POP ESI

660E40E5 POP EBX

660E40E6 LEAVE

660E40E7 RETN 4



为了验证一下,我们继续跟进66103dac:

66103DAC PUSH EBP

66103DAD MOV EBP,ESP

66103DAF MOV ECX,DWORD PTR SS:[EBP 14]

66103DB2 MOV EBX,DWORD PTR SS:[EBP 8] //这里是刚才那个参数

66103DB5 MOV ESP,DWORD PTR SS:[EBP 10]

66103DB8 MOV EBP,DWORD PTR SS:[EBP C]

66103DBB CALL ECX

66103DBD JMP EBX //返回用户程序



注意:这里所提到的是对用户程序对异常做了处理的情况,否则你可能得到一个

出错对话框程序就退出了.:(









6. 没有结束的结束



这一系列的贴子到这里就告一段落了。工作太忙,一直断断续续的在写,感谢你有耐心

看完。上面所提到的都是从语言这个角度说的。也是我分析大量VB程序的一点经验。真正的

VB逆向工程只有这点知识远远不够。这是只是帮助你复习语言特性而已。你或许应该去好好

的看看编译原理,看看C ,看看COM的实现,看看流行的编译器技术等等。

这里要提到的是大家都知道的看学学院出的《软件保护技术内MU》,那里有对VB更深一

层的论述。还有就是在末尾提到的那些资源。你应该学会自己获取需要的知识。^_^


最新评论

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 11:23 , Processed in 0.212259 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部