首页
社区
课程
招聘
私人图片安全浏览器三层简单壳脱壳+伪破解
发表于: 2004-5-7 10:46 16414

私人图片安全浏览器三层简单壳脱壳+伪破解

David 活跃值
20
2004-5-7 10:46
16414

【脱文标题】 对这个软件作者大家怎么看.

【脱文作者】 weiyi75[Dfcg]

【作者邮箱】 [email]weiyi75@sohu.com[/email]

【作者主页】 Dfcg官方大本营

【使用工具】 Ollydbg1.10c(UnkillOd),RegSnap,W32dasm,Getvbres

【脱壳平台】 Win2000/XP

【软件名称】 私人图片安全浏览器 V4.1

【下载地址】 http://tanghuanliang.go.nease.net

【软件简介】 这是一款让你放心浏览私人图片的软件。它能快捷有效地为各种类型的图片文件加密并且能够浏览加密过的图片,有了它的帮助,再也不必担心某些重要的私人图片曝光了。而且他的浏览的功能酷似ACDSEE。(注意快捷键的使用,Esc键能及时隐藏图片,F9能恢复显示,让你浏览时更安全)

【软件大小】 298k

【加壳方式】 UPX+Aspack+Acprotect

【脱壳声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)

--------------------------------------------------------------------------------

【脱壳内容】

首先Peid查壳,ASPack 2.12 -> Alexey Solodovnikov,EP区段赫然写明.perplex,如果你动用Unaspack,AspackDie脱壳,机器非短路不可。

知道加壳程序有Acprotect,先内存异常设置不忽略,其余全部忽略。

当我们学完进阶篇后,一般的复合加壳很难逃过我们的眼睛。

首先Alt+M 打开内存镜像。

内存镜像

地址       大小       Owner      区段       包含          类型   访问      初始访问  映射为
     
00400000   00001000   私人图片                  PE header     Imag   R         RWE
00401000   0008B000   私人图片       UPX0                     Imag   R         RWE
0048C000   00022000   私人图片       UPX1       code          Imag   R         RWE
004AE000   00004000   私人图片       .rsrc      data,resourc  Imag   R         RWE
004B2000   00005000   私人图片       .aspack    relocations   Imag   R         RWE
004B7000   00001000   私人图片       .adata                   Imag   R         RWE
004B8000   0001F000   私人图片       .perplex   SFX,imports   Imag   R         RWE

我们看到外壳从Acprotect开始,由下向上的顺序内存解压。

第一关, Acprotect (典型区段perplex)  

第二关,  Aspack (典型区段 adata,aspack)

第三关,  UPX(典型区段  UPX0,UPX1)

作者加壳顺序,UPX-Aspack-Acprotect

思路,UPX再其它壳加壳后就不能再加,故放在里层,Aspack兼容性好,第二层,Acprotect具有杀普通OD和检测调试器,故将铁门给它锁。

我们开始一层一层的脱衣服。

004B8000 >  60              PUSHAD  //第一关,Acprotect
004B8001    66:D3C0         ROL AX,CL
004B8004    75 01           JNZ SHORT 私人图片.004B8007
004B8006    48              DEC EAX
004B8007    72 03           JB SHORT 私人图片.004B800C
004B8009    73 01           JNB SHORT 私人图片.004B800C
004B800B  - 73 BF           JNB SHORT 私人图片.004B7FCC
004B800D    26:99           CDQ                                      ; 多余的前缀
004B800F    B7 6B           MOV BH,6B
004B8011    50              PUSH EAX
004B8012    E8 01000000     CALL 私人图片.004B8018
004B8017    78 58           JS SHORT 私人图片.004B8071
004B8019    58              POP EAX
004B801A    85F9            TEST ECX,EDI
004B801C    E8 01000000     CALL 私人图片.004B8022
.......................................................

F9运行

004BE08E    CD 01           INT 1  //典型Asprotect最后一次内存异常。
004BE090    40              INC EAX
004BE091    40              INC EAX
004BE092    0BC0            OR EAX,EAX
004BE094    0F85 B6000000   JNZ 私人图片.004BE150
004BE09A    60              PUSHAD
004BE09B    8DBD 36B74100   LEA EDI,DWORD PTR SS:[EBP+41B736]
004BE0A1    4F              DEC EDI
004BE0A2    8D8D 70BE4100   LEA ECX,DWORD PTR SS:[EBP+41BE70]
004BE0A8    83C1 02         ADD ECX,2
004BE0AB    2BCF            SUB ECX,EDI
004BE0AD    C1E9 02         SHR ECX,2
004BE0B0    E8 49D8FFFF     CALL 私人图片.004BB8FE
004BE0B5    AB              STOS DWORD PTR ES:[EDI]
004BE0B6  ^ E2 F8           LOOPD SHORT 私人图片.004BE0B0
..............................................................

现在我们要去第二层Aspack,F8,F7慢慢跟踪去?完全没有必要。

有内存镜像可以用,当然要利用。

内存镜像

地址       大小       Owner      区段       包含          类型   访问      初始访问  映射为
     
00400000   00001000   私人图片                  PE header     Imag   R         RWE
00401000   0008B000   私人图片       UPX0                     Imag   R         RWE
0048C000   00022000   私人图片       UPX1       code          Imag   R         RWE
004AE000   00004000   私人图片       .rsrc      data,resourc  Imag   R         RWE
004B2000   00005000   私人图片       .aspack    relocations   Imag   R         RWE  //对Aspask起点必经处下内存访问断点,Shift+F9运行。
004B7000   00001000   私人图片       .adata                   Imag   R         RWE
004B8000   0001F000   私人图片       .perplex   SFX,imports   Imag   R         RWE

004B2001    60              PUSHAD  //一切尽在掌握,第二关Aspack到了,典型入口特征码。压缩壳更加不会慢慢跟踪浪费时间,Esp定律。
004B2002    E8 03000000     CALL 私人图片.004B200A //运行到这里ESP=12FF9C,于是命令行
DD 12FF9C , 下硬件访问Dword断点,F9运行。
004B2007  - E9 EB045D45     JMP 45A824F7
004B200C    55              PUSH EBP
004B200D    C3              RETN
004B200E    E8 01000000     CALL 私人图片.004B2014
004B2013    EB 5D           JMP SHORT 私人图片.004B2072
004B2015    BB EDFFFFFF     MOV EBX,-13
004B201A    03DD            ADD EBX,EBP
004B201C    81EB 00200B00   SUB EBX,0B2000
004B2022    83BD 22040000 0>CMP DWORD PTR SS:[EBP+422],0
004B2029    899D 22040000   MOV DWORD PTR SS:[EBP+422],EBX
004B202F    0F85 65030000   JNZ 私人图片.004B239A
004B2035    8D85 2E040000   LEA EAX,DWORD PTR SS:[EBP+42E]
004B203B    50              PUSH EAX
004B203C    FF95 4D0F0000   CALL DWORD PTR SS:[EBP+F4D]
..............................................................

004B23AF    61              POPAD
004B23B0    75 08           JNZ SHORT 私人图片.004B23BA  //直接到出口。
004B23B2    B8 01000000     MOV EAX,1
004B23B7    C2 0C00         RETN 0C
004B23BA    68 10DC4A00     PUSH 私人图片.004ADC10  //第三层UPX入口
004B23BF    C3              RETN  //进入。

004ADC10    60              PUSHAD  //第三关,UPX,可以向下找Popad,不过我们的ESP定律还没关,硬件断点仍然有效,F9运行。
004ADC11    BE 00C04800     MOV ESI,私人图片.0048C000
004ADC16    8DBE 0050F7FF   LEA EDI,DWORD PTR DS:[ESI+FFF75000]
004ADC1C    57              PUSH EDI
004ADC1D    83CD FF         OR EBP,FFFFFFFF
004ADC20    EB 10           JMP SHORT 私人图片.004ADC32
004ADC22    90              NOP
004ADC23    90              NOP
004ADC24    90              NOP
004ADC25    90              NOP
004ADC26    90              NOP
004ADC27    90              NOP
004ADC28    8A06            MOV AL,BYTE PTR DS:[ESI]
004ADC2A    46              INC ESI
004ADC2B    8807            MOV BYTE PTR DS:[EDI],AL
004ADC2D    47              INC EDI
..............................................................

004ADD7B    61              POPAD
004ADD7C  - E9 AB43F5FF     JMP 私人图片.0040212C //第三层壳也过了。
004ADD81    0000            ADD BYTE PTR DS:[EAX],AL

00402126  - FF25 00124000   JMP DWORD PTR DS:[401200]                ; msvbvm60.ThunRTMain
0040212C    68 D0164100     PUSH 私人图片.004116D0  //到这里,原来是VB程序,我们在这里用Loadpe脱壳吧。
00402131    E8 F0FFFFFF     CALL 私人图片.00402126                       ; JMP to msvbvm60.ThunRTMain
00402136    0000            ADD BYTE PTR DS:[EAX],AL
00402138    0000            ADD BYTE PTR DS:[EAX],AL
0040213A    0000            ADD BYTE PTR DS:[EAX],AL
0040213C    3000            XOR BYTE PTR DS:[EAX],AL
0040213E    0000            ADD BYTE PTR DS:[EAX],AL
00402140    3800            CMP BYTE PTR DS:[EAX],AL
00402142    0000            ADD BYTE PTR DS:[EAX],AL
00402144    0000            ADD BYTE PTR DS:[EAX],AL
00402146    0000            ADD BYTE PTR DS:[EAX],AL
..............................................................

运行ImportREC,选择这个进程。把OEP改为212C,点IT AutoSearch,点“Get Import”,函数全部有效,修复一下就正常运行了。

继续来搞定它的所有限制。

这是我的破解文章最难写的一篇,在我解密知识缺乏的时候,遇到了这个难搞的VB软件,历时2天,几乎放弃,最后还是成功了。

首先我们运行软件,观察软件限制,发现是15次使用次数限制。

既然限制使用次数,软件功能当然要大方的对用户开放,不然谁都会安装后立即删除。

作者肯定要在我们的硬盘或注册表写一些东西识别你用了多少次,我们必须给它照张相看它做了一些什么。

RegSnap 分析结果如下。

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections]
"SavedLegacySettings"=hex:3C,00,00,00,BE,02,00,00,01,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,04,00,00,00,00,00,00,00,\
F0,DB,CF,96,01,11,C3,01,01,00,00,00,7F,00,00,01,\
00,00,00,00,00,00,00,00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\RNG]
"Seed"=hex:B7,BE,79,08,FB,8B,82,7B,BA,EE,50,B6,E3,65,4C,A3,\
EA,0A,9B,02,34,4B,8F,D7,69,83,38,71,99,7B,66,E2,\
37,3A,5B,32,2B,B8,D6,23,4A,2C,4F,35,73,31,EB,79,\
8E,B4,1E,7B,0D,0C,9B,6E,72,4C,F9,95,28,13,67,D7,\
8B,12,D4,AC,40,3E,A6,07,E4,CC,25,EF,81,46,2E,77

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Telent2]  //这个键值后来发现非常关键。
"L"="MTAx"

然后不断的运行,每次看关于软件都提示你用了多少次,于是用照相下来的恢复注册表文件还原,发现又是13次剩余时间。现在可以确定软件每次修改注册表某处,同步跟踪你的使用次数,破解思路,让这个注册键值永远不变。

首先当然尝试爆破。

因为是VB程序,首先要对程序做手术,Getvbres上场,修改一些双字节字符为普通字符。

它们是

你已注册,谢谢使用   修改为  Already

注册成功             修改为  OKOK

任意输入注册号码 9999999999

然后针对错误提示下断点

bp rtcMsgBox

用Alt+F5 灵活处理注册框总在最前的限制。

:0049920E FF1500114000            Call dword ptr [00401100]
:00499214 85C0                    test eax, eax
:00499216 E9DA010000              je 004993F5  //爆破点1, jmp 004993F5,跟踪它的跳转方向
:0049921B 00B804000280            add byte ptr [eax+80020004], bh
:00499221 898570FFFFFF            mov dword ptr [ebp+FFFFFF70], eax
:00499227 B90A000000              mov ecx, 0000000A
:0049922C 898D68FFFFFF            mov dword ptr [ebp+FFFFFF68], ecx
:00499232 894580                  mov dword ptr [ebp-80], eax
:00499235 898D78FFFFFF            mov dword ptr [ebp+FFFFFF78], ecx

* Possible StringData Ref from Data Obj ->"桁?饔Ncknx"
                                  |
:0049923B C78550FFFFFF40AD4100    mov dword ptr [ebp+FFFFFF50], 0041AD40
:00499245 C78548FFFFFF08000000    mov dword ptr [ebp+FFFFFF48], 00000008
:0049924F 8D9548FFFFFF            lea edx, dword ptr [ebp+FFFFFF48]
:00499255 8D4D88                  lea ecx, dword ptr [ebp-78]

* Reference To: msvbvm60.__vbaVarDup, Ord:0090h
                                  |
:00499258 8B3D24124000            mov edi, dword ptr [00401224]
:0049925E FFD7                    call edi

* Possible StringData Ref from Data Obj ->"`O?桁?饔Ncknx??h彗逦 T(W?eQ"
                                  |
:00499260 C78560FFFFFF18AD4100    mov dword ptr [ebp+FFFFFF60], 0041AD18
:0049926A C78558FFFFFF08000000    mov dword ptr [ebp+FFFFFF58], 00000008
:00499274 8D9558FFFFFF            lea edx, dword ptr [ebp+FFFFFF58]
:0049927A 8D4D98                  lea ecx, dword ptr [ebp-68]
:0049927D FFD7                    call edi
:0049927F 8D8568FFFFFF            lea eax, dword ptr [ebp+FFFFFF68]
:00499285 50                      push eax
:00499286 8D8D78FFFFFF            lea ecx, dword ptr [ebp+FFFFFF78]
:0049928C 51                      push ecx
:0049928D 8D5588                  lea edx, dword ptr [ebp-78]
:00499290 52                      push edx
:00499291 6A30                    push 00000030
:00499293 8D4598                  lea eax, dword ptr [ebp-68]
:00499296 50                      push eax

* Reference To: msvbvm60.rtcMsgBox, Ord:0253h
                                  |
:00499297 FF15AC104000            Call dword ptr [004010AC]  //注册码错误。
:0049929D 8D8D68FFFFFF            lea ecx, dword ptr [ebp+FFFFFF68]
:004992A3 51                      push ecx
:004992A4 8D9578FFFFFF            lea edx, dword ptr [ebp+FFFFFF78]
....................................................................................

:004993F5 8B3D24124000            mov edi, dword ptr [00401224]

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00499315(C), :004993F3(U)
|
:004993FB 8B4DC0                  mov ecx, dword ptr [ebp-40]
:004993FE 51                      push ecx
:004993FF 8B1528304A00            mov edx, dword ptr [004A3028]
:00499405 52                      push edx

* Reference To: msvbvm60.__vbaStrCmp, Ord:0196h
                                  |
:00499406 FF1500114000            Call dword ptr [00401100]
:0049940C 85C0                    test eax, eax
:0049940E 0F85EE040000            jne 00499902  //爆破点2,必须NOP掉,不然程序无声的回到注册画面。
:00499414 8D45C4                  lea eax, dword ptr [ebp-3C]
:00499417 898560FFFFFF            mov dword ptr [ebp+FFFFFF60], eax
:0049941D C78558FFFFFF08400000    mov dword ptr [ebp+FFFFFF58], 00004008
:00499427 8D8D58FFFFFF            lea ecx, dword ptr [ebp+FFFFFF58]
:0049942D 51                      push ecx
:0049942E 6A01                    push 00000001
:00499430 8B15EC304A00            mov edx, dword ptr [004A30EC]
:00499436 52                      push edx
:00499437 A1E8304A00              mov eax, dword ptr [004A30E8]
:0049943C 50                      push eax
:0049943D 6802000080              push 80000002
:00499442 E8091B0000              call 0049AF50
:00499447 8B0E                    mov ecx, dword ptr [esi]
:00499449 56                      push esi
:0049944A FF91B4020000            call dword ptr [ecx+000002B4]
:00499450 DBE2                    fclex
:00499452 85C0                    test eax, eax
:00499454 7D12                    jge 00499468
:00499456 68B4020000              push 000002B4

* Possible StringData Ref from Data Obj ->"ps窃dl D俱?g嗦?\c?t善?钩嗵?JD埋fr???Tn"
                                        ->"?8帚饣?K?C>? ?mage3"
                                  |
:0049945B 68ECA04100              push 0041A0EC
:00499460 56                      push esi
:00499461 50                      push eax

* Reference To: msvbvm60.__vbaHresultCheckObj, Ord:0102h
                                  |
:00499462 FF1570104000            Call dword ptr [00401070]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00499454(C)
|
:00499468 B904000280              mov ecx, 80020004
:0049946D 898D70FFFFFF            mov dword ptr [ebp+FFFFFF70], ecx
:00499473 B80A000000              mov eax, 0000000A
:00499478 898568FFFFFF            mov dword ptr [ebp+FFFFFF68], eax
:0049947E 894D80                  mov dword ptr [ebp-80], ecx
:00499481 898578FFFFFF            mov dword ptr [ebp+FFFFFF78], eax

* Possible StringData Ref from Data Obj ->"OKOK"  //你已经注册成功。
                                  |
:00499487 C78550FFFFFF6CAD4100    mov dword ptr [ebp+FFFFFF50], 0041AD6C
:00499491 BE08000000              mov esi, 00000008
:00499496 89B548FFFFFF            mov dword ptr [ebp+FFFFFF48], esi
:0049949C 8D9548FFFFFF            lea edx, dword ptr [ebp+FFFFFF48]
:004994A2 8D4D88                  lea ecx, dword ptr [ebp-78]
:004994A5 FFD7                    call edi

我们看到它将我们的伪注册码输入了注册表。

REGEDIT4

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Telent2]
"L"="MTA1"    //这个键值是记录用户使用次数
"hcz"="9999999999"    //保存用户注册值,第二次启动后被程序删除了这个键值。

这个程序不是明码比较的,没有算法基础的人就不要浪费时间跟算法了。

我们知道C,Dephi,VB语言修改注册表键值常用这个函数。 RegSetValueExA

于是

bp RegSetValueExA

重新载入程序运行。

77DB63B1 >  6A 2C           push 2C
77DB63B3    68 70EFDF77     push ADVAPI32.77DFEF70
77DB63B8    E8 B7B2FEFF     call ADVAPI32.77DA1674
77DB63BD    33F6            xor esi, esi
77DB63BF    8975 E4         mov dword ptr ss:[ebp-1C], esi
77DB63C2    817D 08 0400008>cmp dword ptr ss:[ebp+8], 80000004
77DB63C9    0F84 3D9E0100   je ADVAPI32.77DD020C
77DB63CF    3975 10         cmp dword ptr ss:[ebp+10], esi
77DB63D2    0F85 389E0100   jnz ADVAPI32.77DD0210
77DB63D8    8D45 E4         lea eax, dword ptr ss:[ebp-1C]

堆栈友好提示。

0012F6B8   0049B144  /CALL 到 RegSetValueExA 来自 dumped_.0049B13F
0012F6BC   00000124  |hKey = 124
0012F6C0   001754AC  |ValueName = "L"  //L就是我们刚才分析的使用次数键值。
0012F6C4   00000000  |Reserved = 0
0012F6C8   00000001  |ValueType = REG_SZ
0012F6CC   00175394  |Buffer = 00175394
0012F6D0   00000036  \BufSize = 36 (54.)
0012F6D4   660E60F4  msvbvm60.__vbaStrMove

清除断点,Alt+F9 返回程序领空。

0049B112   .  FF15 34104000 call dword ptr ds:[<&msvbvm60.__vbaLenBs>;  msvbvm60.__vbaLenBstr
0049B118   .  83C0 32       add eax, 32
0049B11B   .  8D4D C8       lea ecx, dword ptr ss:[ebp-38]
0049B11E   .  0F80 AC000000 jo dumped_.0049B1D0  //尝试修改这句为Magic Jump,程序可以运行,也不会修改注册表了。但程序警告我是非注册用户,请注册才能正常使用,点以后注册就退出了,岂有此理。看来这里不是好跳转点,而且幻灯片的功能没有了,得另外找断点。

0049B11E     /E9 AD000000   jmp dumped_.0049B1D0
0049B123     |90            nop

0049B124   .  50            push eax
0049B125   .  8B45 D4       mov eax, dword ptr ss:[ebp-2C]
0049B128   .  50            push eax
0049B129   .  51            push ecx
0049B12A   .  FFD7          call edi
0049B12C   .  8B55 E0       mov edx, dword ptr ss:[ebp-20]
0049B12F   .  50            push eax
0049B130   .  6A 01         push 1
0049B132   .  56            push esi
0049B133   .  8D45 CC       lea eax, dword ptr ss:[ebp-34]
0049B136   .  52            push edx
0049B137   .  50            push eax
0049B138   .  FFD7          call edi
0049B13A   .  8B4D E4       mov ecx, dword ptr ss:[ebp-1C]
0049B13D   .  50            push eax
0049B13E   .  51            push ecx
0049B13F   .  E8 B4EDF7FF   call dumped_.00419EF8
0049B144   .  FF15 6C104000 call dword ptr ds:[<&msvbvm60.__vbaSetSy>;  msvbvm60.__vbaSetSystemError  //返回
到这一句。
................................................................................

我们这次下断点

bp RegQueryValueExA

这个API只是访问注册表,并不操作它.

重新载入程序,F9运行.

77DA2410 >  55              push ebp
77DA2411    8BEC            mov ebp, esp
77DA2413    83EC 2C         sub esp, 2C
77DA2416    57              push edi
77DA2417    33FF            xor edi, edi
77DA2419    397D 10         cmp dword ptr ss:[ebp+10], edi
77DA241C    897D F8         mov dword ptr ss:[ebp-8], edi
77DA241F    897D F4         mov dword ptr ss:[ebp-C], edi

堆栈友好提示  //注意堆栈值.

0012E36C   275934B8  /CALL 到 RegQueryValueExA 来自 Mscomctl.275934B2
0012E370   00000100  |hKey = 100
0012E374   2762F24C  |ValueName = "SmoothScroll"
0012E378   00000000  |Reserved = NULL
0012E37C   00000000  |pValueType = NULL
0012E380   2762EF30  |Buffer = Mscomctl.2762EF30
0012E384   0012E4E8  \pBufSize = 0012E4E8
0012E388   00000000
0012E38C   00000001
0012E390   27580000  Mscomctl.27580000

按了8次F9

堆栈提示

0012F640   0049AE10  /CALL 到 RegQueryValueExA 来自 dumped_.0049AE0B
0012F644   00000124  |hKey = 124
0012F648   0017BC8C  |ValueName = "hcz"  //读取用户注册键值,这里返回程序领空肯定有个Magic Jump
0012F64C   00000000  |Reserved = NULL
0012F650   0012F684  |pValueType = 0012F684
0012F654   0017C8BC  |Buffer = 0017C8BC
0012F658   0012F71C  \pBufSize = 0012F71C
0012F65C   660E60F4  msvbvm60.__vbaStrMove
0012F660   0015AD10
0012F664   660E610E  msvbvm60.__vbaStrCopy

0012F640   0049AE10  /CALL 到 RegQueryValueExA 来自 dumped_.0049AE0B
0012F644   00000124  |hKey = 124
0012F648   0017BF7C  |ValueName = "L"  //读取使用次数
0012F64C   00000000  |Reserved = NULL
0012F650   0012F684  |pValueType = 0012F684
0012F654   0017C8BC  |Buffer = 0017C8BC
0012F658   0012F71C  \pBufSize = 0012F71C
0012F65C   660E60F4  msvbvm60.__vbaStrMove
0012F660   0015AD10
0012F664   660E610E  msvbvm60.__vbaStrCopy

0012F640   0049AE10  /CALL 到 RegQueryValueExA 来自 dumped_.0049AE0B
0012F644   00000124  |hKey = 124
0012F648   0017C05C  |ValueName = "L"  //读取使用次数,然后回程序领空某处修改.
0012F64C   00000000  |Reserved = NULL
0012F650   0012F684  |pValueType = 0012F684
0012F654   0017C8BC  |Buffer = 0017C8BC
0012F658   0012F71C  \pBufSize = 0012F71C
0012F65C   660E60F4  msvbvm60.__vbaStrMove
0012F660   0015AD10
0012F664   660E610E  msvbvm60.__vbaStrCopy
0012F668   00000000

继续F9程序就运行了.

好,火力探测完毕,回到第一个断点处吧,因为程序首先读取用户注册键值,注册码不正确时再比较你是否过期.

0012F640   0049AE10  /CALL 到 RegQueryValueExA 来自 dumped_.0049AE0B
0012F644   00000124  |hKey = 124
0012F648   0017BC8C  |ValueName = "hcz"
0012F64C   00000000  |Reserved = NULL
0012F650   0012F684  |pValueType = 0012F684
0012F654   0017C8BC  |Buffer = 0017C8BC
0012F658   0012F71C  \pBufSize = 0012F71C
0012F65C   660E60F4  msvbvm60.__vbaStrMove
0012F660   0015AD10
0012F664   660E610E  msvbvm60.__vbaStrCopy
0012F668   0016CC40

Alt+F9返回.

0049AE0B   .  E8 10F0F7FF   call dumped_.00419E20
0049AE10   .  8985 28FFFFFF mov dword ptr ss:[ebp-D8], eax  返回到这里.
0049AE16   .  FF15 6C104000 call dword ptr ds:[<&msvbvm60.__vbaSetSy>;  msvbvm60.__vbaSetSystemError
0049AE1C   .  8B55 B8       mov edx, dword ptr ss:[ebp-48]
0049AE1F   .  8D45 C8       lea eax, dword ptr ss:[ebp-38]
0049AE22   .  52            push edx
0049AE23   .  50            push eax
0049AE24   .  FFD3          call ebx
0049AE26   .  8B4D B4       mov ecx, dword ptr ss:[ebp-4C]
0049AE29   .  8D55 C0       lea edx, dword ptr ss:[ebp-40]
0049AE2C   .  51            push ecx
0049AE2D   .  52            push edx
0049AE2E   .  FFD3          call ebx
0049AE30   .  8B95 28FFFFFF mov edx, dword ptr ss:[ebp-D8]
0049AE36   .  33C0          xor eax, eax
0049AE38   .  3BD6          cmp edx, esi
0049AE3A   .  8D4D B4       lea ecx, dword ptr ss:[ebp-4C]
0049AE3D   .  0F94C0        sete al
0049AE40   .  8D55 B8       lea edx, dword ptr ss:[ebp-48]
0049AE43   .  51            push ecx
0049AE44   .  F7D8          neg eax
0049AE46   .  52            push edx
0049AE47   .  6A 02         push 2
0049AE49   .  66:8BF8       mov di, ax
0049AE4C   .  FF15 E4114000 call dword ptr ds:[<&msvbvm60.__vbaFreeS>;  msvbvm60.__vbaFreeStrList
0049AE52   .  83C4 0C       add esp, 0C
0049AE55   .  66:3BFE       cmp di, si
0049AE58   .  74 2D         je short beta1.0049AE87  //第一次这里跳走了,我们再这里下断点,先前的bp RegQueryValueExA 不要清除,F9运行看到它读取L 的值两次,每次都在这里中断,而且没有跳转.继续F9就过期了,所以这里就是爆破的 Magic Jump  爆破点 jmp 0049AE87
0049AE5A   .  8B45 C4       mov eax, dword ptr ss:[ebp-3C]  
0049AE5D   .  8B4D C0       mov ecx, dword ptr ss:[ebp-40]
0049AE60   .  83E8 01       sub eax, 1
0049AE63   .  0F80 D9000000 jo beta1.0049AF42
0049AE69   .  50            push eax
0049AE6A   .  51            push ecx

BTW:这个程序还有其它的修改法,因为时间浪费太多,我就不看了。

然后我们来搞定关于按钮的令人不悦的提示。

因为我们已经修改

你已注册,谢谢使用   修改为  Already

所以W32dasm直接查找 "Already"

00492C62   . /0F85 8D000000 jnz dumped_.00492CF5  //爆破点
00492C68   . |3935 58334A00 cmp dword ptr ds:[4A3358], esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00492C62(U)  //顺藤模瓜
|
* Reference To: msvbvm60.__vbaVarDup, Ord:0090h
                                  |
:00492CF5 8B3D24124000            mov edi, dword ptr [00401224]
:00492CFB B90A000000              mov ecx, 0000000A
:00492D00 B804000280              mov eax, 80020004
:00492D05 894DA4                  mov dword ptr [ebp-5C], ecx
:00492D08 894DB4                  mov dword ptr [ebp-4C], ecx
:00492D0B 8D5584                  lea edx, dword ptr [ebp-7C]
:00492D0E 8D4DC4                  lea ecx, dword ptr [ebp-3C]
:00492D11 8945AC                  mov dword ptr [ebp-54], eax
:00492D14 8945BC                  mov dword ptr [ebp-44], eax

* Possible StringData Ref from Data Obj ->""??
                                  |
:00492D17 C7458C689A4100          mov [ebp-74], 00419A68
:00492D1E C7458408000000          mov [ebp-7C], 00000008
:00492D25 FFD7                    call edi
:00492D27 8D5594                  lea edx, dword ptr [ebp-6C]
:00492D2A 8D4DD4                  lea ecx, dword ptr [ebp-2C]

* Possible StringData Ref from Data Obj ->"Already Regis"
                                  |
:00492D2D C7459C54AA4100          mov [ebp-64], 0041AA54
:00492D34 C7459408000000          mov [ebp-6C], 00000008
:00492D3B FFD7                    call edi
:00492D3D 8D4DA4                  lea ecx, dword ptr [ebp-5C]
:00492D40 8D55B4                  lea edx, dword ptr [ebp-4C]
:00492D43 51                      push ecx
:00492D44 8D45C4                  lea eax, dword ptr [ebp-3C]
:00492D47 52                      push edx
:00492D48 50                      push eax
:00492D49 8D4DD4                  lea ecx, dword ptr [ebp-2C]
:00492D4C 6A40                    push 00000040
:00492D4E 51                      push ecx

* Reference To: msvbvm60.rtcMsgBox, Ord:0253h
                                  |
:00492D4F FF15AC104000            Call dword ptr [004010AC]
:00492D55 8D55A4                  lea edx, dword ptr [ebp-5C]
:00492D58 8D45B4                  lea eax, dword ptr [ebp-4C]
:00492D5B 52                      push edx
:00492D5C 8D4DC4                  lea ecx, dword ptr [ebp-3C]
:00492D5F 50                      push eax
:00492D60 8D55D4                  lea edx, dword ptr [ebp-2C]
:00492D63 51                      push ecx
:00492D64 52                      push edx
:00492D65 6A04                    push 00000004
:00492D67 FFD3                    call ebx
:00492D69 83C414                  add esp, 00000014
............................................................................

爆破了两处地方,测试功能,完全正常,因为不写注册表,所以使用次数等于无穷次。(真爽啊!)

【破解总结】

:0049AE58 742D                    je 0049AE87

                   修改为

:0049AE58 EB2D                    jmp 0049AE87

:00492C62 0F858D000000            jne 00492CF5

                   修改为

:00492C62 E98E000000              jmp 00492CF5

最后请看胜利截图



【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 11
支持
分享
最新回复 (28)
雪    币: 227
活跃值: (130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
用UPX作最后一层壳真是败笔
2004-5-7 11:42
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
3
酷!已加入收藏!:)
2004-5-7 12:12
0
雪    币: 238
活跃值: (110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
好,顶~~~~~~~~~~~~~~~!
对我等菜鸟真是帮助甚大!:D
2004-5-7 12:37
0
雪    币: 411
活跃值: (1160)
能力值: ( LV9,RANK:810 )
在线值:
发帖
回帖
粉丝
5
最初由 iceplus 发布
用UPX作最后一层壳真是败笔


错了,upx是第一层壳,最后加壳的Acprotect最先遇到,和堆栈一样,

后入先出,加多层壳只是防脱壳器而已。
2004-5-7 19:20
0
雪    币: 303
活跃值: (466)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
最初由 David 发布


错了,upx是第一层壳,最后加壳的Acprotect最先遇到,和堆栈一样,

后入先出,加多层壳只是防脱壳器而已。


upx是第一层壳也算是个败笔,这样就发挥不了Acprotect的stolen code(当然针对VB稍差)
2004-5-7 19:36
0
雪    币: 411
活跃值: (1160)
能力值: ( LV9,RANK:810 )
在线值:
发帖
回帖
粉丝
7
最初由 liuyilin 发布


upx是第一层壳也算是个败笔,这样就发挥不了Acprotect的stolen code(当然针对VB稍差)


http://bbs.pediy.com/showthread.php?s=&threadid=568

五层bt壳也只这样。
2004-5-7 20:21
0
雪    币: 411
活跃值: (1160)
能力值: ( LV9,RANK:810 )
在线值:
发帖
回帖
粉丝
8
最初由 esako 发布
嘿嘿!我是这个软件的作者,这个破解我的软件的家伙说了这么多,我也说说吧。
这个weiyi75也“讨厌”,五一前在
http://www.chinadfcg.com/forumdisplay.php?fid=20&sid=ctPkKHJb
就发布了一篇破解这个作品的文章,今天有在这里发表。可见每每破解一个软件
破解者的那种炫耀之心溢于论坛呀。我想我是他也会这样。呵呵
我很感激这个破解者,因为我常常想这软件应该防破性比较强,虽然这是我的处女作。虽然我才学vb4个月,虽然我这个学机械的对计算机还处于好奇阶段。但我想在编软件前,我学过一点密码学的。我做出的软件也该让他们忙活一阵子吧,启料我那点密码知识连个这个初学者也挡不住。而且非对称密码知
识用于册压根起不到什么作用。但是经过这次破解,我了解了破解的内幕。这无疑对我以后的共享软件是有好处的。我收藏了这篇破解文章,也试着练习破解自己软件。谢谢!!再次感谢。
这个软件只给我带来一次注册费。那是一个月前的事。以后就没来过了。(我也知道本人编程不久,软件做的很粗糙,没经验),不过这是我加入共享软件作者的第一笔注册费,给了我极大的鼓励。能有这么一次,这个软件也尽到义务了。所以这个软件我就不升级了,我想我不会收到注册费了,就当给大家当练习用吧。
中国的破解者一级棒,真的。我的两个软件被破了,抱怨是少不了的,但心底常夸crackers。
当然,我的共享软件还得做下去,五一期间很幸运的进了“共享软件联盟论坛”,真的收益非浅。原来,共享软件可以做海外去的。我也闻名了一个叫“周易”的人。跟大多数人一样,立马拜为偶像。也跟他们一样,开始把眼光放至海外。国内发表软件,只会带给自己无数的“死细胞”。除非我想到了让cracker
破解一年的防破技术(密码学让我知道没有破不了的软件。只是时间问题罢了)。当然,海外也有cracker,只不过海外用户的正版思想,我佩服的就象我佩服你们一样。我深深体会到“走向海外”的一篇帖子的含义了,名称是“走向海外是被逼的”(可能是这个标题吧,我记不清了)。当然功劳要给crackers了。难道不是吗?
我是指迫使大部分同志做海外市场为国家赚取外汇的功劳。
这个网站我会常来,吸取新的知识。我想应该所有的共享软件作者都该来。我只怪我来的太晚了,不然,不会轻易丢掉两个软件了。


果然是个白痴,什么叫炫耀论坛,你这个 程序早就被龙族软件破解了,让你知道一些破解内幕,居然有这种理论,每个人看不看这篇文章对我一点意义都没有,你懂不懂和我有什么关系

首先要有一个概念,往往自以为是的加密算法在解密者眼里其实是不嵌一击的.

另外,你这个自以为是的软件我从来不用,只是交流一下软件的漏洞,以便更好的保护自己,看学论坛破解者其实只是讨论你的软件,并没有公开发布破解程序.

首先自己调整一下心态,不要因为软件被解密而不快,公然出言不逊

国内的共享软件Acprotect 多次有人在看学发布破解注册机,作者也没有破口大骂,还在论坛发布新版本供大家公开测试,Acprotect个人零售300元以上,相比之下你的软件算什么.

另外你的Aspack2.12,Acprotect购买了正版没有?
2004-5-8 01:49
0
雪    币: 213
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
最初由 David 发布


另外你的Aspack2.12,Acprotect购买了正版没有?


说得好!
2004-5-8 02:23
0
雪    币: 411
活跃值: (1160)
能力值: ( LV9,RANK:810 )
在线值:
发帖
回帖
粉丝
10
最初由 esako 发布
顺便告诉你一下,大半个月前,龙族的那个破解软件是我发布的。

这家伙好象很生气,还出口伤人了。可能是误解了,反到我这个被破解、、、



http://www.chinadforce.com/viewthread.php?tid=15659&highlight=%CB%BD%C8%CB&page=1

首先如果你这个白痴=龙大哥, 这世界就没有白痴了.
2004-5-8 08:06
0
雪    币: 411
活跃值: (1160)
能力值: ( LV9,RANK:810 )
在线值:
发帖
回帖
粉丝
11
最初由 esako 发布
――――――――――――――――――――――
我不知道你是不是误解了,尤其是上面的第三、四、五段,一看就知道根本就没理解我的意思。我想你可能被人骂多了吧,从而,连我发的贴子都没看清,就以为我写贴子目的是损你来了。
首先我的帖子表达了对你的感谢,然后说了我的软件不堪一击。最后聊了“走向海外”和“常来看看”。
就连说你“讨厌”也加了引号,表示说你“可爱”,可能你以为我骂你对吗?这只能说明你真的被人骂多了。而且我也说了我的软件做的不好,只有一个注册的,而且是我只学了几个月编程的处女作。连我自己都没用。
你首先就说我是“白痴”,我可从来都没骂你吧。还有,你破解作品拿出来发表,难道不含“炫耀”成分吗?
你看看你发表的标题:“对这个软件作者大家怎么看.”是什么意思。要看就看你破解软件的文章,干吗看我呀。你这不是明显嘲笑我吗,我看了都忍了,没骂你吧。还感谢你,你知不知道什么叫“以德报怨”拉。
现在看来,我看你素质不咋的。心态更不咋的。咳

我真希望大家能够心态好一点去看待被破解者,不是每个共享软件作者都是骂你们的,因为你们不该骂。反而值得去尊敬。只是个别的、、、


从回复就知道你这个人有心态问题,我想你可能被人骂多了吧,很遗憾,除了你这个白痴,没有任何人骂我,只要好感或平常心.从你的回复来看,根本没有理解逆向工程的意义,只是想着它的极端,明显是老羞成怒,气急败坏发布的回复帖子,这帖子明显话中带刺,等于当着和尚骂秃子,对这个软件作者大家怎么看是让大家都来看清楚你的面目."现在看来,我看你素质不咋的。心态更不咋的。咳"这是我对你的看法,彼此彼此,是我见过的最白痴的软件作者。
2004-5-8 08:14
0
雪    币: 214
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
哈哈哈,好啊,软件作者们请把你的软件做到国外去吧:o
只要带英文语言包的软件无疑都是0day & WareZ的猎物吧~~~~:p

用马甲支持一下二哥;)
2004-5-8 15:06
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
13
国内共享软件的脆弱说是我们的问题!!!???然后就要出国发展???呵呵,我想这种逃避、怨恨思想应该才是国内共享软件脆弱的根本所在!看雪和风飘雪等大侠都说过,软件的加密解密这一矛一盾永远都是相辅相成相互盘旋向前发展的,试想没有解密,何来加密呢?技术如何发展呢?就这样直接把你的漏洞百出的软件拿出来让大家去注册,给你冤枉钱?其实对于这个问题,娃娃大侠早就举例分析过了,还是那句话:自己技术不行,怨天尤人和逃避只是你自己软弱的表现,根本解决不了问题,只能换来CRACKER勇者们的嘲笑!
2004-5-9 16:51
0
雪    币: 109
活跃值: (36)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
14
呵呵
2004-6-29 14:33
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
15
把ACP浪费的淋漓尽致……千层大饼:D
2004-6-29 14:37
0
雪    币: 446
活跃值: (758)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
16
如果只加ACProtect还好些,
至少Stolen Code会让你忙上一阵~!
我现在是怕怕了哦,
恐怖~!
2004-6-29 15:20
0
雪    币: 427
活跃值: (412)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
此人心态有问题,可能这个浏览器都是破解VB+破解控件,自己不过是一个组装机器而已了。
2004-6-29 20:12
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
!!!!!
2004-7-2 08:24
0
雪    币: 239
活跃值: (478)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
19
最初由 鸡蛋壳 发布
此人心态有问题,可能这个浏览器都是破解VB+破解控件,自己不过是一个组装机器而已了。


说的有理!
2004-7-2 09:41
0
雪    币: 239
活跃值: (61)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
一个共享软件做到连破解者都认为是没有破解价值的垃圾,那样也太失败了,正因为有人破解,说明你的软件还是受关注的,对于这点应该感到庆幸~从而想办法提高自己软件对于使用者的价值和加密的强度.而不是来怪破解者如何如何.....
2004-8-5 06:06
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
最初由 lxyy 发布
一个共享软件做到连破解者都认为是没有破解价值的垃圾,那样也太失败了,正因为有人破解,说明你的软件还是受关注的,对于这点应该感到庆幸~从而想办法提高自己软件对于使用者的价值和加密的强度.而不是来怪破解者如何如何.....


就是!只有垃圾软件才不会有人对它感兴趣。作者还是着力提高软件的功用性吧。
2004-8-6 14:45
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
学习,收藏
2005-1-3 18:24
0
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
23
破解的很精彩啊,其他的内容也棒
2005-1-3 19:35
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
24
最初由 pendan2001 发布
破解的很精彩啊,其他的内容也棒


苟同苟同
2005-1-5 13:11
0
雪    币: 367
活跃值: (20)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
25
最初由 李逍遥 发布


说得好!


说得好!
2005-6-2 12:19
0
游客
登录 | 注册 方可回帖
返回
//