【文章标题】: VisualToolbar1.5带壳算法浅析
【文章作者】: wyqzm
【作者邮箱】: 保密
【作者QQ号】: 一般不用
【软件名称】: Visual Toolbar V1.50 For VC and Delphi
【软件大小】: 463 KB[主程序]
【下载地址】: http://www.skycn.com/soft/16024.html
【加壳方式】: UPX-Scrambler RC1.x -> ┫nT?L
【保护方式】: 取位计算,明码比较
【编写语言】: VC++
【使用工具】: OD+计算器
【操作平台】: WinXP sp2中文版
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【软件介绍】
Visual Toolbar 1.0可以自动读入小位图文件(支持16×16,24×24,32×32,48×48),自动合并所有小的位图,然后
输出您整合以后的位图资源文件。此外,Visual Toolbar 允许用户动态调整按钮图标的顺序,支持鼠标托放!合并以
后的位图,再次读入的时候,可以自动重新分割成各个合并前的小...
【详细过程】
第一步,查壳,为UPX-Scrambler RC1.x -> ┫nT?L,呵呵,加密的压缩壳,今天就不脱壳了,载入到OD提示压缩,F9直接运行
试试,提示注册了,输入试练码,用户名:wyqzm,注册码:151515,点注册按钮,提示: Incorreect registration code!,有提示就
更好说了.
第二步,Ctrl+F2重来,F9运行,到注册窗口,输入试练码,先不点注册,在命令行下断BP MessageBoxA,很容易来到下面.
看看注释的内容,很明显的是MFC程序.
00407790 6A FF PUSH -1 //首部,在此处下断
00407792 68 60A64900 PUSH VisualTo.0049A660
00407797 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
0040779D 50 PUSH EAX
0040779E 64:8925 0000000>MOV DWORD PTR FS:[0],ESP
004077A5 83EC 10 SUB ESP,10
004077A8 53 PUSH EBX
004077A9 55 PUSH EBP
004077AA 56 PUSH ESI
004077AB 57 PUSH EDI
004077AC 8BF1 MOV ESI,ECX
004077AE 6A 01 PUSH 1
004077B0 E8 6D1B0900 CALL VisualTo.00499322 ; JMP 到 MFC42.#6334_?UpdateData@CWnd@@QAEHH@Z
004077B5 8D4C24 14 LEA ECX,DWORD PTR SS:[ESP+14] ; 取用户名
004077B9 E8 40180900 CALL VisualTo.00498FFE ; JMP 到 MFC42.#540_??0CString@@QAE@XZ
004077BE 8D4424 14 LEA EAX,DWORD PTR SS:[ESP+14]
004077C2 33DB XOR EBX,EBX
004077C4 50 PUSH EAX
004077C5 8D8E 4C0E0000 LEA ECX,DWORD PTR DS:[ESI+E4C]
004077CB 895C24 2C MOV DWORD PTR SS:[ESP+2C],EBX
004077CF E8 AA190900 CALL VisualTo.0049917E ; 通过GetWindowTextA取机器码
004077D4 51 PUSH ECX
004077D5 8DBE 900E0000 LEA EDI,DWORD PTR DS:[ESI+E90]
004077DB 8BCC MOV ECX,ESP
004077DD 896424 20 MOV DWORD PTR SS:[ESP+20],ESP
004077E1 57 PUSH EDI
004077E2 E8 05180900 CALL VisualTo.00498FEC ; JMP 到 MFC42.#535_??0CString@@QAE@ABV0@@Z
004077E7 51 PUSH ECX
004077E8 8D5424 1C LEA EDX,DWORD PTR SS:[ESP+1C]
004077EC 8BCC MOV ECX,ESP
004077EE 896424 20 MOV DWORD PTR SS:[ESP+20],ESP
004077F2 52 PUSH EDX
004077F3 C64424 34 01 MOV BYTE PTR SS:[ESP+34],1
004077F8 E8 EF170900 CALL VisualTo.00498FEC ; JMP 到 MFC42.#535_??0CString@@QAE@ABV0@@Z
004077FD 8D4424 18 LEA EAX,DWORD PTR SS:[ESP+18]
00407801 885C24 30 MOV BYTE PTR SS:[ESP+30],BL
00407805 50 PUSH EAX
00407806 E8 65A3FFFF CALL VisualTo.00401B70 ; 算法CALL,F7跟进
0040780B 83C4 0C ADD ESP,0C
0040780E 8B0F MOV ECX,DWORD PTR DS:[EDI]
00407810 C64424 28 02 MOV BYTE PTR SS:[ESP+28],2
00407815 8B41 F8 MOV EAX,DWORD PTR DS:[ECX-8]
00407818 83F8 04 CMP EAX,4 ; 比较用户名的位数是否大于4
0040781B 7F 35 JG SHORT VisualTo.00407852 //用户名位数大于4则有效,否则出现出错提示
0040781D 8D4C24 18 LEA ECX,DWORD PTR SS:[ESP+18]
00407821 E8 D8170900 CALL VisualTo.00498FFE ; JMP 到 MFC42.#540_??0CString@@QAE@XZ
00407826 6A 68 PUSH 68
00407828 8D4C24 1C LEA ECX,DWORD PTR SS:[ESP+1C]
0040782C C64424 2C 03 MOV BYTE PTR SS:[ESP+2C],3
00407831 E8 84190900 CALL VisualTo.004991BA ; JMP 到 MFC42.#4160_?LoadStringA@CString@@QAEHI@Z
00407836 8B5424 18 MOV EDX,DWORD PTR SS:[ESP+18]
0040783A 53 PUSH EBX
0040783B 53 PUSH EBX
0040783C 52 PUSH EDX
0040783D 8BCE MOV ECX,ESI
0040783F E8 D81A0900 CALL VisualTo.0049931C ; JMP 到 MFC42.#4224_?MessageBoxA@CWnd@@QAEHPBD0I@Z
00407844 C64424 28 02 MOV BYTE PTR SS:[ESP+28],2
00407849 8D4C24 18 LEA ECX,DWORD PTR SS:[ESP+18]
0040784D E9 CB000000 JMP VisualTo.0040791D
00407852 8B4C24 10 MOV ECX,DWORD PTR SS:[ESP+10] ; 取出已算完的注册码
00407856 8B86 940E0000 MOV EAX,DWORD PTR DS:[ESI+E94] ; 将假码放入eax
0040785C 51 PUSH ECX ; 真注册码进栈,此处也可以制作内存注册机
0040785D 50 PUSH EAX ; 假注册码进栈
0040785E FF15 70D84900 CALL DWORD PTR DS:[49D870] ; 通过函数_mbscmp比较,这里可以制作内存注册机
00407864 83C4 08 ADD ESP,8
00407867 85C0 TEST EAX,EAX ; 比较
00407869 75 78 JNZ SHORT VisualTo.004078E3 ; 爆破点
0040786B 891D F0164D00 MOV DWORD PTR DS:[4D16F0],EBX
00407871 E8 A01A0900 CALL VisualTo.00499316 ; JMP 到 MFC42.#1168_?AfxGetModuleState@@YGPAVAFX_MODULE_STATE@@XZ
00407876 8B3F MOV EDI,DWORD PTR DS:[EDI]
00407878 8B68 04 MOV EBP,DWORD PTR DS:[EAX+4]
0040787B 57 PUSH EDI
0040787C 68 D4534C00 PUSH VisualTo.004C53D4 ; ASCII "USER"
00407881 68 C4534C00 PUSH VisualTo.004C53C4 ; ASCII "VisualToolbar10"
00407886 8BCD MOV ECX,EBP
00407888 E8 831A0900 CALL VisualTo.00499310 ; 将注册用户名写入文件
0040788D 8B5424 10 MOV EDX,DWORD PTR SS:[ESP+10]
00407891 8BCD MOV ECX,EBP
00407893 52 PUSH EDX
00407894 68 C0534C00 PUSH VisualTo.004C53C0 ; ASCII "SN"
00407899 68 C4534C00 PUSH VisualTo.004C53C4 ; ASCII "VisualToolbar10" //
0040789E E8 6D1A0900 CALL VisualTo.00499310 ; JMP 到 MFC42.#6403_?WriteProfileStringA@CWinApp@@QAEHPBD00@Z
004078A3 8D4C24 18 LEA ECX,DWORD PTR SS:[ESP+18]
004078A7 E8 52170900 CALL VisualTo.00498FFE ; JMP 到 MFC42.#540_??0CString@@QAE@XZ
004078AC 6A 67 PUSH 67
004078AE 8D4C24 1C LEA ECX,DWORD PTR SS:[ESP+1C]
004078B2 C64424 2C 04 MOV BYTE PTR SS:[ESP+2C],4
004078B7 E8 FE180900 CALL VisualTo.004991BA ; JMP 到 MFC42.#4160_?LoadStringA@CString@@QAEHI@Z
004078BC 8B4424 18 MOV EAX,DWORD PTR SS:[ESP+18]
004078C0 53 PUSH EBX
004078C1 53 PUSH EBX
004078C2 50 PUSH EAX
004078C3 8BCE MOV ECX,ESI
004078C5 E8 521A0900 CALL VisualTo.0049931C ; JMP 到 MFC42.#4224_?MessageBoxA@CWnd@@QAEHPBD0I@Z
004078CA 53 PUSH EBX
004078CB FF15 14DA4900 CALL DWORD PTR DS:[49DA14] ; USER32.PostQuitMessage
004078D1 8BCE MOV ECX,ESI
004078D3 E8 201A0900 CALL VisualTo.004992F8 ; JMP 到 MFC42.#4853_?OnOK@CDialog@@MAEXXZ
004078D8 C64424 28 02 MOV BYTE PTR SS:[ESP+28],2
004078DD 8D4C24 18 LEA ECX,DWORD PTR SS:[ESP+18]
004078E1 EB 3A JMP SHORT VisualTo.0040791D
004078E3 8D4C24 1C LEA ECX,DWORD PTR SS:[ESP+1C]
004078E7 C705 F0164D00 0>MOV DWORD PTR DS:[4D16F0],1
004078F1 E8 08170900 CALL VisualTo.00498FFE ; JMP 到 MFC42.#540_??0CString@@QAE@XZ
004078F6 6A 66 PUSH 66
004078F8 8D4C24 20 LEA ECX,DWORD PTR SS:[ESP+20]
004078FC C64424 2C 05 MOV BYTE PTR SS:[ESP+2C],5
00407901 E8 B4180900 CALL VisualTo.004991BA ; JMP 到 MFC42.#4160_?LoadStringA@CString@@QAEHI@Z
00407906 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
0040790A 53 PUSH EBX
0040790B 53 PUSH EBX
0040790C 51 PUSH ECX
0040790D 8BCE MOV ECX,ESI
0040790F E8 081A0900 CALL VisualTo.0049931C ; JMP 到 MFC42.#4224_?MessageBoxA@CWnd@@QAEHPBD0I@Z
00407914 C64424 28 02 MOV BYTE PTR SS:[ESP+28],2 //返回到这里,往上看
00407919 8D4C24 1C LEA ECX,DWORD PTR SS:[ESP+1C]
0040791D E8 C4160900 CALL VisualTo.00498FE6 ; JMP 到 MFC42.#800_??1CString@@QAE@XZ
00407922 8D4C24 10 LEA ECX,DWORD PTR SS:[ESP+10]
00407926 885C24 28 MOV BYTE PTR SS:[ESP+28],BL
0040792A E8 B7160900 CALL VisualTo.00498FE6 ; JMP 到 MFC42.#800_??1CString@@QAE@XZ
0040792F 8D4C24 14 LEA ECX,DWORD PTR SS:[ESP+14]
00407933 C74424 28 FFFFF>MOV DWORD PTR SS:[ESP+28],-1
0040793B E8 A6160900 CALL VisualTo.00498FE6 ; JMP 到 MFC42.#800_??1CString@@QAE@XZ
00407940 8B4C24 20 MOV ECX,DWORD PTR SS:[ESP+20]
00407944 5F POP EDI
00407945 5E POP ESI
00407946 5D POP EBP
00407947 64:890D 0000000>MOV DWORD PTR FS:[0],ECX
0040794E 5B POP EBX
0040794F 83C4 1C ADD ESP,1C
00407952 C3 RETN
00407953 90 NOP
00407954 90 NOP
00407955 90 NOP
00407956 90 NOP
00407957 90 NOP
00407958 90 NOP
00407959 90 NOP
0040795A 90 NOP
0040795B 90 NOP
0040795C 90 NOP
0040795D 90 NOP
0040795E 90 NOP
0040795F 90 NOP
00407960 56 PUSH ESI
00407961 8BF1 MOV ESI,ECX
00407963 E8 84190900 CALL VisualTo.004992EC ; JMP 到 MFC42.#4710_?OnInitDialog@CDialog@@UAEHXZ
00407968 E8 C3A0FFFF CALL VisualTo.00401A30
0040796D 6A 00 PUSH 0
0040796F 8BCE MOV ECX,ESI
00407971 8986 8C0E0000 MOV DWORD PTR DS:[ESI+E8C],EAX
00407977 E8 A6190900 CALL VisualTo.00499322 ; JMP 到 MFC42.#6334_?UpdateData@CWnd@@QAEHH@Z
0040797C 6A 20 PUSH 20
0040797E 6A 20 PUSH 20
00407980 68 9A000000 PUSH 9A
00407985 6A 20 PUSH 20
00407987 6A 20 PUSH 20
00407989 68 9A000000 PUSH 9A
0040798E 8D4E 60 LEA ECX,DWORD PTR DS:[ESI+60]
00407991 E8 7ABEFFFF CALL VisualTo.00403810
00407996 6A 20 PUSH 20
00407998 6A 20 PUSH 20
0040799A 68 9C000000 PUSH 9C
0040799F 6A 20 PUSH 20
004079A1 6A 20 PUSH 20
004079A3 68 9C000000 PUSH 9C
004079A8 8D8E A8090000 LEA ECX,DWORD PTR DS:[ESI+9A8]
004079AE E8 5DBEFFFF CALL VisualTo.00403810
004079B3 6A 20 PUSH 20
004079B5 6A 20 PUSH 20
004079B7 68 9B000000 PUSH 9B
004079BC 6A 20 PUSH 20
004079BE 6A 20 PUSH 20
004079C0 68 9B000000 PUSH 9B
004079C5 8D8E 04050000 LEA ECX,DWORD PTR DS:[ESI+504]
004079CB E8 40BEFFFF CALL VisualTo.00403810
004079D0 B8 01000000 MOV EAX,1
004079D5 5E POP ESI
004079D6 C3 RETN
//算法CALL部分
00401B70 6A FF PUSH -1 //首部
00401B72 68 3F9F4900 PUSH VisualTo.00499F3F
00401B77 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
00401B7D 50 PUSH EAX
00401B7E 64:8925 0000000>MOV DWORD PTR FS:[0],ESP
00401B85 83EC 20 SUB ESP,20
00401B88 53 PUSH EBX
00401B89 55 PUSH EBP
00401B8A 56 PUSH ESI
00401B8B 33F6 XOR ESI,ESI
00401B8D 57 PUSH EDI
00401B8E 897424 1C MOV DWORD PTR SS:[ESP+1C],ESI
00401B92 8D4C24 20 LEA ECX,DWORD PTR SS:[ESP+20]
00401B96 C74424 38 02000>MOV DWORD PTR SS:[ESP+38],2
00401B9E E8 5B740900 CALL VisualTo.00498FFE ; JMP 到 MFC42.#540_??0CString@@QAE@XZ
00401BA3 8B4424 48 MOV EAX,DWORD PTR SS:[ESP+48] ; 取用户名
00401BA7 C64424 38 03 MOV BYTE PTR SS:[ESP+38],3
00401BAC C64424 24 56 MOV BYTE PTR SS:[ESP+24],56
00401BB1 C64424 25 69 MOV BYTE PTR SS:[ESP+25],69
00401BB6 8B68 F8 MOV EBP,DWORD PTR DS:[EAX-8]
00401BB9 C64424 26 73 MOV BYTE PTR SS:[ESP+26],73
00401BBE 83FD 0A CMP EBP,0A
00401BC1 C64424 27 75 MOV BYTE PTR SS:[ESP+27],75
00401BC6 C64424 28 61 MOV BYTE PTR SS:[ESP+28],61
00401BCB C64424 29 6C MOV BYTE PTR SS:[ESP+29],6C
00401BD0 C64424 2A 54 MOV BYTE PTR SS:[ESP+2A],54
00401BD5 C64424 2B 42 MOV BYTE PTR SS:[ESP+2B],42
00401BDA C64424 2C 31 MOV BYTE PTR SS:[ESP+2C],31
00401BDF C64424 2D 30 MOV BYTE PTR SS:[ESP+2D],30
00401BE4 7C 05 JL SHORT VisualTo.00401BEB
00401BE6 BD 0A000000 MOV EBP,0A
00401BEB 55 PUSH EBP
00401BEC E8 1F740900 CALL VisualTo.00499010 ; JMP 到 MFC42.#823_??2@YAPAXI@Z
00401BF1 83C4 04 ADD ESP,4
00401BF4 8D4C24 14 LEA ECX,DWORD PTR SS:[ESP+14]
00401BF8 8BF8 MOV EDI,EAX
00401BFA E8 FF730900 CALL VisualTo.00498FFE ; JMP 到 MFC42.#540_??0CString@@QAE@XZ
00401BFF 68 30164D00 PUSH VisualTo.004D1630
00401C04 8D4C24 14 LEA ECX,DWORD PTR SS:[ESP+14]
00401C08 C64424 3C 04 MOV BYTE PTR SS:[ESP+3C],4
00401C0D E8 F8730900 CALL VisualTo.0049900A ; JMP 到 MFC42.#537_??0CString@@QAE@PBD@Z
00401C12 3BEE CMP EBP,ESI
00401C14 C64424 38 05 MOV BYTE PTR SS:[ESP+38],5
00401C19 7E 53 JLE SHORT VisualTo.00401C6E
00401C1B 8D4424 24 LEA EAX,DWORD PTR SS:[ESP+24]
00401C1F 2BC7 SUB EAX,EDI
00401C21 894424 18 MOV DWORD PTR SS:[ESP+18],EAX
00401C25 EB 04 JMP SHORT VisualTo.00401C2B
00401C27 8B4424 18 MOV EAX,DWORD PTR SS:[ESP+18] ; 算法开始
00401C2B 8B4C24 48 MOV ECX,DWORD PTR SS:[ESP+48]
00401C2F 8A140E MOV DL,BYTE PTR DS:[ESI+ECX] ; 取注册名的一位,第1次取第1位,依此类推
00401C32 8B4C24 44 MOV ECX,DWORD PTR SS:[ESP+44] ; 将机器码放入ecx
00401C36 8A1C0E MOV BL,BYTE PTR DS:[ESI+ECX] ; 将机器码相应位的16进制值放入BL
00401C39 8D0C3E LEA ECX,DWORD PTR DS:[ESI+EDI] ;
00401C3C 8A0408 MOV AL,BYTE PTR DS:[EAX+ECX] ; 将常数VisualTB10相应位放入AL
00401C3F 32C3 XOR AL,BL ; 机器码的相应位与常量VisualTB10的相应位异或
00401C41 32C2 XOR AL,DL ; 将用户名相应每1位与前一步结果异或,放入AL
00401C43 0FBED0 MOVSX EDX,AL ; 把计算的结果放入到edx,前位不足处符号扩展
00401C46 8801 MOV BYTE PTR DS:[ECX],AL ; 将计算的结果保存在[ecx]
00401C48 52 PUSH EDX ; 计算结果进栈
00401C49 8D4424 18 LEA EAX,DWORD PTR SS:[ESP+18]
00401C4D 68 34504C00 PUSH VisualTo.004C5034 ; 取格式化操作符
00401C52 50 PUSH EAX ; 压入函数地址
00401C53 E8 A0730900 CALL VisualTo.00498FF8 ; 调用CString的format()方法将结果格式化为十进制
00401C58 83C4 0C ADD ESP,0C
00401C5B 8D4C24 14 LEA ECX,DWORD PTR SS:[ESP+14] ; 将地址赋给ecx
00401C5F 51 PUSH ECX
00401C60 8D4C24 14 LEA ECX,DWORD PTR SS:[ESP+14]
00401C64 E8 9B730900 CALL VisualTo.00499004 ; JMP 到 MFC42.#939_??YCString@@QAEABV0@ABV0@@Z
00401C69 46 INC ESI ; ESI加1
00401C6A 3BF5 CMP ESI,EBP ; 与注册名的位数比较
00401C6C ^ 7C B9 JL SHORT VisualTo.00401C27 ; 小于则跳回0401C27处继续计算
00401C6E 57 PUSH EDI
00401C6F E8 6C730900 CALL VisualTo.00498FE0 ; JMP 到 MFC42.#825_??3@YAXPAX@Z
00401C74 8B7424 44 MOV ESI,DWORD PTR SS:[ESP+44]
00401C78 83C4 04 ADD ESP,4
00401C7B 8D5424 10 LEA EDX,DWORD PTR SS:[ESP+10]
00401C7F 8BCE MOV ECX,ESI
00401C81 52 PUSH EDX
00401C82 E8 65730900 CALL VisualTo.00498FEC ; JMP 到 MFC42.#535_??0CString@@QAE@ABV0@@Z
00401C87 BB 01000000 MOV EBX,1
00401C8C 895C24 1C MOV DWORD PTR SS:[ESP+1C],EBX
00401C90 8D4C24 10 LEA ECX,DWORD PTR SS:[ESP+10]
00401C94 C64424 38 04 MOV BYTE PTR SS:[ESP+38],4
00401C99 E8 48730900 CALL VisualTo.00498FE6 ; JMP 到 MFC42.#800_??1CString@@QAE@XZ
00401C9E 8D4C24 14 LEA ECX,DWORD PTR SS:[ESP+14]
00401CA2 C64424 38 03 MOV BYTE PTR SS:[ESP+38],3
00401CA7 E8 3A730900 CALL VisualTo.00498FE6 ; JMP 到 MFC42.#800_??1CString@@QAE@XZ
00401CAC 8D4C24 20 LEA ECX,DWORD PTR SS:[ESP+20]
00401CB0 C64424 38 02 MOV BYTE PTR SS:[ESP+38],2
00401CB5 E8 2C730900 CALL VisualTo.00498FE6 ; JMP 到 MFC42.#800_??1CString@@QAE@XZ
00401CBA 8D4C24 44 LEA ECX,DWORD PTR SS:[ESP+44]
00401CBE 885C24 38 MOV BYTE PTR SS:[ESP+38],BL
00401CC2 E8 1F730900 CALL VisualTo.00498FE6 ; JMP 到 MFC42.#800_??1CString@@QAE@XZ
00401CC7 8D4C24 48 LEA ECX,DWORD PTR SS:[ESP+48]
00401CCB C64424 38 00 MOV BYTE PTR SS:[ESP+38],0
00401CD0 E8 11730900 CALL VisualTo.00498FE6 ; JMP 到 MFC42.#800_??1CString@@QAE@XZ
00401CD5 8B4C24 30 MOV ECX,DWORD PTR SS:[ESP+30]
00401CD9 8BC6 MOV EAX,ESI
00401CDB 5F POP EDI
00401CDC 5E POP ESI
00401CDD 5D POP EBP
00401CDE 5B POP EBX
00401CDF 64:890D 0000000>MOV DWORD PTR FS:[0],ECX
00401CE6 83C4 2C ADD ESP,2C
00401CE9 C3 RETN ; CALL结束,返回
没时间写算法注册机了,偷懒留下内存注册机吧!
中断地址:40785E
中断次数:1
第一字节:FF
指令长度:6
选择内存方式[寄存器]: ECX
我是一只小菜鸟,路过的大侠不要笑话我啊!
--------------------------------------------------------------------------------
【经验总结】
1,UPX的壳主要是作为压缩之用,在内存中完全解码之后,其实跟没加壳的程序是一样的
2,关键点比较容易找到,但注册码的生成要注意,在比较的时候,注册码是直接显示的,所以注册码的计算肯定在前面已经完成
了,于是向上找很容易找到那个算法CALL,让我们再次熟悉了算法流程
3,此程序与注册名,机器码及常量字符"VisualTB10"相关.
4,注册算法还是比较典型的,可惜作者最后还是用了明码比较.
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2007年02月05日 16:30:11
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课