【我的算法分析初次文章】
初次写算法分析文章,请大家不要见笑,如有不当之处,还望大家教我!
【文章名称】:三极管查询系统算法分析
【文章作者】:USB-HDD
【作者主页】:*
【作者通讯】:*
【作者邮件】:nxlx-admin@163.com
【组织名称】:*
【软件名称】:世界三极管查询系统V1.5
【下载地址】:
【破解工具】:Peid Ollydbg
【保护方式】:Key + keyfile
【软件限制】:未注册用户只能用60秒
【破解难度】:易
============================================================
【软件介绍】
世界三极管查询系统一款功能强大的三极管查询软件,此软件最大限
度的搜集了世界各国晶体管生产厂家的产品,其中囊括了200多个生
产厂家近6万个三极管的详细信息
============================================================
【破解分析过程】
1.用PEID扫描,无壳,是VB6.0程序...
2.用Ollydbg 载入程序,按F9运行,首先出现注册对话框,输入用户名usb-hdd,注册码:9958520,按确定,出现"注册码不正确"错误消息.
3.先看看有没有字符串可参考吧!用OD插件查找UNICODE,竟然没有!算了,另想办法吧!
4.下断MSVBVM60.__vbaStrCmp,按确定后断在 005EBFC1 处,在堆栈0012F370处发现 UNICODE "9958520",是我输入的试炼码,看来断的正确喽,呵,按F8往下走到第一个跳转处005EBFEB 记事本记下,接着往下按,没有遇到跳转,到005EC5A2处跳出"注册码错误"消息,看来005EBFEB处是关键跳转,试着将 JE改为JNE后,出现了注册正确提示!看来此处是一个爆破点 (正确的注册码反而不正确了,后来觉得应该改成JMP,其余用NOP填充)
5.保存文件后,运行,随便输入用户名与密码,成功,进去后,没有了倒计时.退出后重新打开,又出来注册对话框,看是很可能是Keyfile或者是注册表保护方式!
6.打开程序所在的文件夹,按照时间进行了一下排序,发现最后修改的是set.qwj文件,用Ultra-Edit32打开,发现文件头是典型的ACCESS数据库文件.用ACCESS2000打开,要密码,用工具算出密码后,发现刚才输入的用户名与试炼码都在表中.
7.看来爆破比较麻烦,试着去追一下算法吧!(听说VB很是麻烦!)
算法分析思路:
1.即然是MSVBVM60.__vbaStrCmp比较,而且,堆栈0012F370处是试炼码,那么它的上两行中有一行应该是真的注册码入栈命令.经过查看,发现 005EBFBE 处是真的注册码,看来是明文比较,但是真的注册码好像是不可见字符.如下:
001A7844 2A 00 2A 00 D9 E7 51 02 D6 E7 31 00 25 00 *.*.夔Q昼1.%.戌
005EBFBB > FF75 B>PUSH DWORD PTR SS:[EBP-48] ; 此处送入的是试练码
005EBFBE . FF75 D>PUSH DWORD PTR SS:[EBP-24] ; 些处是真注册码
005EBFC1 . E8 107>CALL <JMP.&MSVBVM60.__vbaStrCmp> ; 断在此处
2.往上看,005EBF79处是一个大的跳转入口,点右键--前往---JG 来自 005EBC01 在此处下断,断在此处后按F8慢慢往下走,到005EBEA6处,发现了取用户名的第一个字母的函数__vbaStrVarVal,再往下,又发现了取机器码的运算.两次取值结果进行 Xor 运算,得出第1位注册码的ASCII码.
3.一直走到005EBF74处,跳回到了005EBBF7处,接着又开始了,看来这是一个循环.出口在005EBC01处.跳出条件是
005EBBFA处.
005EBBEF . E8 707>CALL <JMP.&MSVBVM60.__vbaFreeVarList>
005EBBF4 . 83C4 0>ADD ESP,0C
005EBBF7 > 8B45 E>MOV EAX,SS:[EBP-18]
005EBBFA . 66:3B8>CMP AX,SS:[EBP-160] ; SS:[EBP-160]处是长度,AX为计数器
005EBC01 . 0F8F 7>JG TranSear.005EBF79 ; 如果超过机器码的长度,则不计算,结束运算
005EBC07 . 8945 E>MOV SS:[EBP-1C],EAX
005EBC0A . 66:898>MOV SS:[EBP-F0],AX
005EBC11 . 8B06 MOV EAX,DS:[ESI]
005EBC13 . 56 PUSH ESI
005EBC14 . C785 0>MOV DWORD PTR SS:[EBP-F8],8002
005EBC1E . FF90 0>CALL DS:[EAX+30C]
005EBC24 . 50 PUSH EAX
005EBC25 . 8D45 A>LEA EAX,SS:[EBP-58]
005EBC28 . 50 PUSH EAX
005EBC29 . E8 0E8>CALL <JMP.&MSVBVM60.__vbaObjSet>
005EBC2E . 8B08 MOV ECX,DS:[EAX]
005EBC30 . 8D55 B>LEA EDX,SS:[EBP-48]
005EBC33 . 52 PUSH EDX
005EBC34 . 50 PUSH EAX
005EBC35 . 8985 C>MOV SS:[EBP-13C],EAX
005EBC3B . FF91 A>CALL DS:[ECX+A0]
005EBC41 . DBE2 FCLEX
005EBC43 . 3BC7 CMP EAX,EDI
005EBC45 . 7D 16 JGE SHORT TranSear.005EBC5D
005EBC47 . 68 A00>PUSH 0A0
005EBC4C . 68 485>PUSH TranSear.00415348
005EBC51 . FFB5 C>PUSH DWORD PTR SS:[EBP-13C]
005EBC57 . 50 PUSH EAX
005EBC58 . E8 E97>CALL <JMP.&MSVBVM60.__vbaHresultCheckObj>
005EBC5D > 8B45 B>MOV EAX,SS:[EBP-48] ;此处出现了用户名
005EBC60 . 8945 9>MOV SS:[EBP-70],EAX
005EBC63 . 8D45 8>LEA EAX,SS:[EBP-78]
005EBC66 . 50 PUSH EAX
005EBC67 . 8D85 7>LEA EAX,SS:[EBP-88]
005EBC6D . 50 PUSH EAX
005EBC6E . 897D B>MOV SS:[EBP-48],EDI
005EBC71 . 895D 8>MOV SS:[EBP-78],EBX
005EBC74 . E8 538>CALL <JMP.&MSVBVM60.#520>
005EBC79 . 8D85 0>LEA EAX,SS:[EBP-F8]
005EBC7F . 50 PUSH EAX
005EBC80 . 8D85 7>LEA EAX,SS:[EBP-88]
005EBC86 . 50 PUSH EAX
005EBC87 . 8D85 6>LEA EAX,SS:[EBP-98]
005EBC8D . 50 PUSH EAX
005EBC8E . E8 C38>CALL <JMP.&MSVBVM60.__vbaLenVar> ;获得用户名的长度
005EBC93 . 50 PUSH EAX
005EBC94 . E8 B78>CALL <JMP.&MSVBVM60.__vbaVarTstGt>
005EBC99 . 8D4D A>LEA ECX,SS:[EBP-58]
005EBC9C . 66:898>MOV SS:[EBP-144],AX
005EBCA3 . E8 8E7>CALL <JMP.&MSVBVM60.__vbaFreeObj>
005EBCA8 . 8D85 7>LEA EAX,SS:[EBP-88]
005EBCAE . 50 PUSH EAX
005EBCAF . 8D45 8>LEA EAX,SS:[EBP-78]
005EBCB2 . 50 PUSH EAX
005EBCB3 . 6A 02 PUSH 2
005EBCB5 . E8 AA7>CALL <JMP.&MSVBVM60.__vbaFreeVarList>
005EBCBA . 83C4 0>ADD ESP,0C
005EBCBD . 66:39B>CMP SS:[EBP-144],DI
005EBCC4 . 0F84 C>JE TranSear.005EBD8A
005EBCCA . 66:8B4>MOV AX,SS:[EBP-18]
005EBCCE . 66:898>MOV SS:[EBP-F0],AX
005EBCD5 . 8B06 MOV EAX,DS:[ESI]
005EBCD7 . 56 PUSH ESI
005EBCD8 . C785 0>MOV DWORD PTR SS:[EBP-F8],2
005EBCE2 . FF90 0>CALL DS:[EAX+30C]
005EBCE8 . 50 PUSH EAX
005EBCE9 . 8D45 A>LEA EAX,SS:[EBP-58]
005EBCEC . 50 PUSH EAX
005EBCED . E8 4A7>CALL <JMP.&MSVBVM60.__vbaObjSet>
005EBCF2 . 8B08 MOV ECX,DS:[EAX]
005EBCF4 . 8D55 B>LEA EDX,SS:[EBP-48]
005EBCF7 . 52 PUSH EDX
005EBCF8 . 50 PUSH EAX
005EBCF9 . 8985 C>MOV SS:[EBP-13C],EAX
005EBCFF . FF91 A>CALL DS:[ECX+A0]
005EBD05 . DBE2 FCLEX
005EBD07 . 3BC7 CMP EAX,EDI
005EBD09 . 7D 16 JGE SHORT TranSear.005EBD21
005EBD0B . 68 A00>PUSH 0A0
005EBD10 . 68 485>PUSH TranSear.00415348
005EBD15 . FFB5 C>PUSH DWORD PTR SS:[EBP-13C]
005EBD1B . 50 PUSH EAX
005EBD1C . E8 257>CALL <JMP.&MSVBVM60.__vbaHresultCheckObj>
005EBD21 > 8B45 B>MOV EAX,SS:[EBP-48]
005EBD24 . 8945 9>MOV SS:[EBP-70],EAX
005EBD27 . 8D45 8>LEA EAX,SS:[EBP-78]
005EBD2A . 50 PUSH EAX
005EBD2B . 8D85 7>LEA EAX,SS:[EBP-88]
005EBD31 . 50 PUSH EAX
005EBD32 . 897D B>MOV SS:[EBP-48],EDI
005EBD35 . 895D 8>MOV SS:[EBP-78],EBX
005EBD38 . E8 8F7>CALL <JMP.&MSVBVM60.#520>
005EBD3D . 8D85 0>LEA EAX,SS:[EBP-F8]
005EBD43 . 50 PUSH EAX
005EBD44 . 8D85 7>LEA EAX,SS:[EBP-88]
005EBD4A . 50 PUSH EAX
005EBD4B . 8D85 6>LEA EAX,SS:[EBP-98]
005EBD51 . 50 PUSH EAX
005EBD52 . E8 FF7>CALL <JMP.&MSVBVM60.__vbaLenVar> ;获得一个字符串的长度
005EBD57 . 50 PUSH EAX
005EBD58 . 8D85 5>LEA EAX,SS:[EBP-A8]
005EBD5E . 50 PUSH EAX
005EBD5F . E8 E67>CALL <JMP.&MSVBVM60.__vbaVarMod>
005EBD64 . 50 PUSH EAX
005EBD65 . E8 FC7>CALL <JMP.&MSVBVM60.__vbaI2Var>
005EBD6A . 8D4D A>LEA ECX,SS:[EBP-58]
005EBD6D . 8945 E>MOV SS:[EBP-1C],EAX
005EBD70 . E8 C17>CALL <JMP.&MSVBVM60.__vbaFreeObj>
005EBD75 . 8D85 7>LEA EAX,SS:[EBP-88]
005EBD7B . 50 PUSH EAX
005EBD7C . 8D45 8>LEA EAX,SS:[EBP-78]
005EBD7F . 50 PUSH EAX
005EBD80 . 6A 02 PUSH 2
005EBD82 . E8 DD7>CALL <JMP.&MSVBVM60.__vbaFreeVarList>
005EBD87 . 83C4 0>ADD ESP,0C
005EBD8A > 8B06 MOV EAX,DS:[ESI]
005EBD8C . 56 PUSH ESI
005EBD8D . FF90 1>CALL DS:[EAX+310]
005EBD93 . 50 PUSH EAX
005EBD94 . 8D45 A>LEA EAX,SS:[EBP-58]
005EBD97 . 50 PUSH EAX
005EBD98 . E8 9F7>CALL <JMP.&MSVBVM60.__vbaObjSet>
005EBD9D . 8B08 MOV ECX,DS:[EAX]
005EBD9F . 8D55 B>LEA EDX,SS:[EBP-48]
005EBDA2 . 52 PUSH EDX
005EBDA3 . 50 PUSH EAX
005EBDA4 . 8985 C>MOV SS:[EBP-13C],EAX
005EBDAA . FF91 A>CALL DS:[ECX+A0]
005EBDB0 . DBE2 FCLEX
005EBDB2 . 3BC7 CMP EAX,EDI
005EBDB4 . 7D 16 JGE SHORT TranSear.005EBDCC
005EBDB6 . 68 A00>PUSH 0A0
005EBDBB . 68 485>PUSH TranSear.00415348
005EBDC0 . FFB5 C>PUSH DWORD PTR SS:[EBP-13C]
005EBDC6 . 50 PUSH EAX
005EBDC7 . E8 7A7>CALL <JMP.&MSVBVM60.__vbaHresultCheckObj>
005EBDCC > 8B06 MOV EAX,DS:[ESI]
005EBDCE . 56 PUSH ESI
005EBDCF . FF90 0>CALL DS:[EAX+30C]
005EBDD5 . 50 PUSH EAX
005EBDD6 . 8D45 A>LEA EAX,SS:[EBP-5C]
005EBDD9 . 50 PUSH EAX
005EBDDA . E8 5D7>CALL <JMP.&MSVBVM60.__vbaObjSet>
005EBDDF . 8B08 MOV ECX,DS:[EAX]
005EBDE1 . 8D55 B>LEA EDX,SS:[EBP-50]
005EBDE4 . 52 PUSH EDX
005EBDE5 . 50 PUSH EAX
005EBDE6 . 8985 B>MOV SS:[EBP-144],EAX
005EBDEC . FF91 A>CALL DS:[ECX+A0]
005EBDF2 . DBE2 FCLEX
005EBDF4 . 3BC7 CMP EAX,EDI
005EBDF6 . 7D 16 JGE SHORT TranSear.005EBE0E
005EBDF8 . 68 A00>PUSH 0A0
005EBDFD . 68 485>PUSH TranSear.00415348
005EBE02 . FFB5 B>PUSH DWORD PTR SS:[EBP-144]
005EBE08 . 50 PUSH EAX
005EBE09 . E8 387>CALL <JMP.&MSVBVM60.__vbaHresultCheckObj>
005EBE0E > 8B45 D>MOV EAX,SS:[EBP-24]
005EBE11 . 8985 F>MOV SS:[EBP-110],EAX
005EBE17 . 8B45 B>MOV EAX,SS:[EBP-48]
005EBE1A . 8945 9>MOV SS:[EBP-70],EAX
005EBE1D . 8D85 7>LEA EAX,SS:[EBP-88]
005EBE23 . 50 PUSH EAX
005EBE24 . 0FBF45>MOVSX EAX,WORD PTR SS:[EBP-18]
005EBE28 . 50 PUSH EAX
005EBE29 . 8D45 8>LEA EAX,SS:[EBP-78]
005EBE2C . 50 PUSH EAX
005EBE2D . 8D85 6>LEA EAX,SS:[EBP-98]
005EBE33 . 50 PUSH EAX
005EBE34 . 899D E>MOV SS:[EBP-118],EBX
005EBE3A . C745 8>MOV DWORD PTR SS:[EBP-80],1
005EBE41 . C785 7>MOV DWORD PTR SS:[EBP-88],2
005EBE4B . 897D B>MOV SS:[EBP-48],EDI
005EBE4E . 895D 8>MOV SS:[EBP-78],EBX
005EBE51 . E8 3E7>CALL <JMP.&MSVBVM60.#632>
005EBE56 . 8B45 B>MOV EAX,SS:[EBP-50]
005EBE59 . 8985 6>MOV SS:[EBP-A0],EAX
005EBE5F . 8D85 4>LEA EAX,SS:[EBP-B8]
005EBE65 . 50 PUSH EAX
005EBE66 . 0FBF45>MOVSX EAX,WORD PTR SS:[EBP-1C]
005EBE6A . 50 PUSH EAX
005EBE6B . 8D85 5>LEA EAX,SS:[EBP-A8]
005EBE71 . 50 PUSH EAX
005EBE72 . 8D85 3>LEA EAX,SS:[EBP-C8]
005EBE78 . 50 PUSH EAX
005EBE79 . C785 5>MOV DWORD PTR SS:[EBP-B0],1
005EBE83 . C785 4>MOV DWORD PTR SS:[EBP-B8],2
005EBE8D . 897D B>MOV SS:[EBP-50],EDI
005EBE90 . 899D 5>MOV SS:[EBP-A8],EBX
005EBE96 . E8 F97>CALL <JMP.&MSVBVM60.#632>
005EBE9B . 8D85 3>LEA EAX,SS:[EBP-C8]
005EBEA1 . 50 PUSH EAX
005EBEA2 . 8D45 A>LEA EAX,SS:[EBP-54]
005EBEA5 . 50 PUSH EAX
005EBEA6 . E8 AF7>CALL <JMP.&MSVBVM60.__vbaStrVarVal> ; 取用户名的第n位字母
005EBEAB . 50 PUSH EAX ;
005EBEAC . E8 4B7>CALL <JMP.&MSVBVM60.#516> ; 取ASCII码值
005EBEB1 . 0FBFF8 MOVSX EDI,AX ; EDI为用户名的ASCII码值
005EBEB4 . 8D85 6>LEA EAX,SS:[EBP-98]
005EBEBA . 50 PUSH EAX
005EBEBB . 8D45 B>LEA EAX,SS:[EBP-4C]
005EBEBE . 50 PUSH EAX
005EBEBF . E8 967>CALL <JMP.&MSVBVM60.__vbaStrVarVal> ; 取机器码的第n位字母
005EBEC4 . 50 PUSH EAX
005EBEC5 . E8 327>CALL <JMP.&MSVBVM60.#516> ; 取ASCII码值
005EBECA . 0FBFC0 MOVSX EAX,AX ; EAX为机器码的ASCII码值
005EBECD . 33F8 XOR EDI,EAX ; 进行Xor运算后,得出第n位注册码ASCII码值
005EBECF . 57 PUSH EDI
005EBED0 . 8D85 2>LEA EAX,SS:[EBP-D8]
005EBED6 . 50 PUSH EAX
005EBED7 . E8 687>CALL <JMP.&MSVBVM60.#608>
005EBEDC . 8D85 E>LEA EAX,SS:[EBP-118]
005EBEE2 . 50 PUSH EAX
005EBEE3 . 8D85 2>LEA EAX,SS:[EBP-D8]
005EBEE9 . 50 PUSH EAX
005EBEEA . 8D85 1>LEA EAX,SS:[EBP-E8]
005EBEF0 . 50 PUSH EAX
005EBEF1 . E8 A07>CALL <JMP.&MSVBVM60.__vbaVarAdd> ; 存放注册码
005EBEF6 . 50 PUSH EAX ; 存入注册码的地方
005EBEF7 . E8 047>CALL <JMP.&MSVBVM60.__vbaStrVarMove> ; 换个位置存放
005EBEFC . 8BD0 MOV EDX,EAX
005EBEFE . 8D4D D>LEA ECX,SS:[EBP-24]
005EBF01 . E8 007>CALL <JMP.&MSVBVM60.__vbaStrMove>
005EBF06 . 8D45 A>LEA EAX,SS:[EBP-54]
005EBF09 . 50 PUSH EAX
005EBF0A . 8D45 B>LEA EAX,SS:[EBP-4C]
005EBF0D . 50 PUSH EAX
005EBF0E . 6A 02 PUSH 2
005EBF10 . E8 CD7>CALL <JMP.&MSVBVM60.__vbaFreeStrList>
005EBF15 . 8D45 A>LEA EAX,SS:[EBP-5C]
005EBF18 . 50 PUSH EAX
005EBF19 . 8D45 A>LEA EAX,SS:[EBP-58]
005EBF1C . 50 PUSH EAX
005EBF1D . 6A 02 PUSH 2
005EBF1F . E8 0C7>CALL <JMP.&MSVBVM60.__vbaFreeObjList>
005EBF24 . 8D85 1>LEA EAX,SS:[EBP-E8]
005EBF2A . 50 PUSH EAX
005EBF2B . 8D85 2>LEA EAX,SS:[EBP-D8]
005EBF31 . 50 PUSH EAX
005EBF32 . 8D85 3>LEA EAX,SS:[EBP-C8]
005EBF38 . 50 PUSH EAX
005EBF39 . 8D85 4>LEA EAX,SS:[EBP-B8]
005EBF3F . 50 PUSH EAX
005EBF40 . 8D85 5>LEA EAX,SS:[EBP-A8]
005EBF46 . 50 PUSH EAX
005EBF47 . 8D85 6>LEA EAX,SS:[EBP-98]
005EBF4D . 50 PUSH EAX
005EBF4E . 8D85 7>LEA EAX,SS:[EBP-88]
005EBF54 . 50 PUSH EAX
005EBF55 . 8D45 8>LEA EAX,SS:[EBP-78]
005EBF58 . 50 PUSH EAX
005EBF59 . 53 PUSH EBX
005EBF5A . E8 057>CALL <JMP.&MSVBVM60.__vbaFreeVarList>
005EBF5F . 83C4 3>ADD ESP,3C
005EBF62 . 6A 01 PUSH 1
005EBF64 . 58 POP EAX
005EBF65 . 66:034>ADD AX,SS:[EBP-18]
005EBF69 . 0F80 8>JO TranSear.005EC6FE
005EBF6F . 33FF XOR EDI,EDI
005EBF71 . 8945 E>MOV SS:[EBP-18],EAX
005EBF74 .^ E9 7EF>JMP TranSear.005EBBF7 ;往回跳
005EBF79 > 8B06 MOV EAX,DS:[ESI] ;如果跳到此处,则表示运算完了
005EBF7B . 56 PUSH ESI
005EBF7C . FF90 0>CALL DS:[EAX+308]
005EBF82 . 50 PUSH EAX
005EBF83 . 8D45 A>LEA EAX,SS:[EBP-58]
005EBF86 . 50 PUSH EAX
005EBF87 . E8 B07>CALL <JMP.&MSVBVM60.__vbaObjSet>
005EBF8C . 8B08 MOV ECX,DS:[EAX]
005EBF8E . 8D55 B>LEA EDX,SS:[EBP-48]
005EBF91 . 52 PUSH EDX
005EBF92 . 50 PUSH EAX
005EBF93 . 8985 C>MOV SS:[EBP-13C],EAX
005EBF99 . FF91 A>CALL DS:[ECX+A0]
005EBF9F . DBE2 FCLEX
005EBFA1 . 3BC7 CMP EAX,EDI
005EBFA3 . 7D 16 JGE SHORT TranSear.005EBFBB
005EBFA5 . 68 A00>PUSH 0A0
005EBFAA . 68 485>PUSH TranSear.00415348
005EBFAF . FFB5 C>PUSH DWORD PTR SS:[EBP-13C]
005EBFB5 . 50 PUSH EAX
005EBFB6 . E8 8B7>CALL <JMP.&MSVBVM60.__vbaHresultCheckObj>
005EBFBB > FF75 B>PUSH DWORD PTR SS:[EBP-48] ; 此处送入的是假注册码
005EBFBE . FF75 D>PUSH DWORD PTR SS:[EBP-24] ; 些处是真注册码
005EBFC1 . E8 107>CALL <JMP.&MSVBVM60.__vbaStrCmp> ; 断在此处了
005EBFC6 . F7D8 NEG EAX
005EBFC8 . 1BC0 SBB EAX,EAX
005EBFCA . 40 INC EAX
005EBFCB . F7D8 NEG EAX
005EBFCD . 8D4D B>LEA ECX,SS:[EBP-48]
005EBFD0 . 66:898>MOV SS:[EBP-144],AX
005EBFD7 . E8 187>CALL <JMP.&MSVBVM60.__vbaFreeStr>
005EBFDC . 8D4D A>LEA ECX,SS:[EBP-58]
005EBFDF . E8 527>CALL <JMP.&MSVBVM60.__vbaFreeObj>
005EBFE4 . 66:39B>CMP SS:[EBP-144],DI
005EBFEB 0F84 2>JE TranSear.005EC519 ; 关键跳转
005EBFF1 . B9 040>MOV ECX,80020004
============================================================
【算法总结】
依次取机器码与注册名的ASCII码进行Xor运算得出注册码.(条件:注册名长度不能少于7位,如果注册名少于机器码,则重新依次取注册名)
最后写了个小注册机,呵呵~~
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)