【脱文标题】 对这个软件作者大家怎么看.
【脱文作者】 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直播授课