欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

谈谈VB程序的破解(5千字)

程序员文章站 2022-09-02 22:27:13
有很多人说破解VB程序的利器是SmartCheck,我不敢苟同,因为我一直以为,只要有一个调试器就能完成所有的破解才是我向往的境界.当然这不一定最简便,但无疑是最有效的.  这次就说...

有很多人说破解VB程序的利器是SmartCheck,我不敢苟同,因为我一直以为,只要有一个调试器就能完成所有的破解才是我向往的境界.当然这不一定最简便,但无疑是最有效的. 
这次就说说VB程序的破解,当然,我不知道是否有其它可行的途径,我只知道,通过调试器就能完成一个破解. 

示例程序:随便写段VB代码,然后编译为本机代码(P-Code不在本文的讨论范围之内,我也发现了一些相关的规律,还在研究中) 
Private Sub Form_Load() 
    If ax = 0 Then 
        MsgBox ("hi!") 
        End 
    Else 
        MsgBox ("ok!") 
        End 
    End If 
End Sub 

用TR载入 
0187:00401166 FF2570104000    JMP      NEAR [00401070]            //从00401171到了这里. 
0187:0040116C 68A0124000      PUSH    DWORD 004012A0            //载入后停在这里 
0187:00401171 E8F0FFFFFF      CALL    `MSVBVM60!ThunRTMain`        //这个Call一定要进入 
0187:00401176 0000            ADD      [EAX],AL 
0187:00401178 0000            ADD      [EAX],AL 
0187:0040117A 0000            ADD      [EAX],AL 
...... 
MSVBVM60!ThunRTMain 
0187:6600DE22 55              PUSH    EBP 
0187:6600DE23 8BEC            MOV      EBP,ESP 
0187:6600DE25 6AFF            PUSH    BYTE -01 
0187:6600DE27 6898980166      PUSH    DWORD 66019898 
0187:6600DE2C 6871EF0E66      PUSH    DWORD 660EEF71 
0187:6600DE31 64A100000000    MOV      EAX,[FS:00] 
0187:6600DE37 50              PUSH    EAX 
0187:6600DE38 64892500000000  MOV      [FS:00],ESP 
0187:6600DE3F 51              PUSH    ECX 
0187:6600DE40 51              PUSH    ECX 
0187:6600DE41 83EC4C          SUB      ESP,BYTE +4C 
0187:6600DE44 53              PUSH    EBX 
0187:6600DE45 56              PUSH    ESI 
0187:6600DE46 57              PUSH    EDI 
0187:6600DE47 8965E8          MOV      [EBP-18],ESP 
0187:6600DE4A 8B7508          MOV      ESI,[EBP+08] 
0187:6600DE4D 8935DCF71066    MOV      [6610F7DC],ESI 
0187:6600DE53 8365FC00        AND      DWORD [EBP-04],BYTE +00 
0187:6600DE57 8D45A0          LEA      EAX,[EBP-60] 
0187:6600DE5A 50              PUSH    EAX 
0187:6600DE5B FF1518110066    CALL    `KERNEL32!GetStartupInfoA` 
0187:6600DE61 0FB745D0        MOVZX    EAX,WORD [EBP-30] 
0187:6600DE65 A3D8F71066      MOV      [6610F7D8],EAX 
0187:6600DE6A FF35CCF61066    PUSH    DWORD [6610F6CC] 
0187:6600DE70 56              PUSH    ESI 
0187:6600DE71 BE70F41066      MOV      ESI,6610F470 
0187:6600DE76 8BCE            MOV      ECX,ESI 
0187:6600DE78 E860000000      CALL    6600DEDD            //这个Call一定要进去哦. 
......(其实不要看在DLL中转,其实并不难,很快就可以返回到程序的领空,我的目的就是要在程序运行前进入程序领空) 
0187:******** FFD0            CALL    EAX                //最后到了这里,ok,返回程序领空了哦! 
...... 
0187:0040146C 816C240433000000 SUB      DWORD [ESP+04],33        //停在这里,这里已经是程序领空了哦! 
0187:00401474 E9B7040000      JMP      00401930            //跳到什么地方,你看下面吧! 
0187:00401479 0000            ADD      [EAX],AL 
...... 
0187:00401930 55              PUSH    EBP                //看看象什么?是不是和汇编,delphi程序开始的地方一样啊?我们终于来到VB程序真正开始的地方了. 
0187:00401931 8BEC            MOV      EBP,ESP 
0187:00401933 83EC0C          SUB      ESP,BYTE +0C 
0187:00401936 68A6104000      PUSH    DWORD 004010A6 
0187:0040193B 64A100000000    MOV      EAX,[FS:00] 
...... 
0187:00401991 C7458C02800000  MOV      DWORD [EBP-74],8002 
0187:00401998 FF1538104000    CALL    `MSVBVM60!__vbaVarTstEq` 
0187:0040199E 6685C0          TEST    AX,AX 
0187:004019A1 B904000280      MOV      ECX,80020004 
0187:004019A6 B80A000000      MOV      EAX,0A 
0187:004019AB 894DA4          MOV      [EBP-5C],ECX 
0187:004019AE 89459C          MOV      [EBP-64],EAX 
0187:004019B1 894DB4          MOV      [EBP-4C],ECX 
0187:004019B4 8945AC  &n