【破文作者】 血草[DFCG]
【文章题目】 光驱伴侣算法
【软件名称】 光驱伴侣V1.2
【下载地址】 http://www.skycn.com/soft/13453.html
----------------------------------------------------------------------------------------------
【破解工具】 PEID,OD
【破解平台】 Win9x/NT/2000/XP/XP SP2
----------------------------------------------------------------------------------------------
【软件简介】
一个小巧的绿色软件,只有一个可执行文件(68kb),将它拷贝到任何一个目录即可执行。其功能是控制光驱的弹出、关闭,支持多个光驱,可随系统自动启动,在关闭系统时如果有光盘被遗忘在光驱内,该软件可以给出提示。使用本软件,您可以方便地用鼠标打开、关闭光驱。如果您经常将光盘忘记在光驱中,本软件可以为您解决这个问题,在关机时提醒您取出光驱中的光盘。1.1版新增功能:热键打开、关闭光驱。
【文章简介】
一个小小的软件,算法也简单,很适合入门。
----------------------------------------------------------------------------------------------
【破解过程】
1 首先运行软件,弹出注册框 ,任意输入用户名和密码后按注册,没有任何提示,
想想需要的API: GetDlgItemTextA, GetWindowsTextA ,LstrLenA.EndDialog.
2 启动PIED,测壳。显示Microsoft Visual C++ 6.0 ^_^可以偷懒了,最怕脱壳;
3 OD载入软件,插件查看字符串 ,无有用字符串;
4 OD右键->查找->当前模块中的名称 发现有 LstrLenA 右键->在每个参考上设置断点
F9运行。。
00403B80 /$ 83EC 18 SUB ESP,18
00403B83 |. 8D4424 00 LEA EAX,DWORD PTR SS:[ESP]
00403B87 |. 53 PUSH EBX
00403B88 |. 55 PUSH EBP
00403B89 |. 56 PUSH ESI
00403B8A |. 57 PUSH EDI
00403B8B |. 50 PUSH EAX
00403B8C |. E8 2FFFFFFF CALL cdpartne.00403AC0
00403B91 |. 8B7C24 2C MOV EDI,DWORD PTR SS:[ESP+2C]
00403B95 |. 57 PUSH EDI ; /String
00403B96 |. FF15 64604000 CALL DWORD PTR DS:[<&KERNEL32.lstrlenA>] ; \lstrlenA 拦截到这里
00403B9C |. 83F8 14 CMP EAX,14 ; 比较注册码是否为20位
00403B9F |. 0F85 AB000000 JNZ cdpartne.00403C50 ; 不相等那就去试用吧^_^
00403BA5 |. 8A07 MOV AL,BYTE PTR DS:[EDI] ; 取注册码第一位去EAX的低位字节AL
00403BA7 |. 3C 44 CMP AL,44
00403BA9 |. 75 04 JNZ SHORT cdpartne.00403BAF ; 比较第一位是否是D,不是就跳
00403BAB |. 33ED XOR EBP,EBP ; 是D则EBP为0 这个后面有用
00403BAD |. EB 23 JMP SHORT cdpartne.00403BD2
00403BAF |> 3C 39 CMP AL,39 ; 是9吗?不是下去
00403BB1 |. 75 07 JNZ SHORT cdpartne.00403BBA
00403BB3 |. BD 01000000 MOV EBP,1 ; ebp为1
00403BB8 |. EB 18 JMP SHORT cdpartne.00403BD2
00403BBA |> 3C 41 CMP AL,41 ; A同理就不解释了^_^
00403BBC |. 75 07 JNZ SHORT cdpartne.00403BC5
00403BBE |. BD 02000000 MOV EBP,2 ; ebp为2
00403BC3 |. EB 0D JMP SHORT cdpartne.00403BD2
00403BC5 |> 3C 35 CMP AL,35 ; 5
00403BC7 |. 0F85 83000000 JNZ cdpartne.00403C50 ; 还不清醒啊 咳。
00403BCD |. BD 03000000 MOV EBP,3 ; ebp为3
00403BD2 |> 33DB XOR EBX,EBX
00403BD4 |. BE 01000000 MOV ESI,1 ; 计数器=1
00403BD9 |> 8A143E /MOV DL,BYTE PTR DS:[ESI+EDI] ; 每次取1位到DL
00403BDC |. 33C9 |XOR ECX,ECX ; 清0开始工作
00403BDE |> 3891 EC914000 |/CMP BYTE PTR DS:[ECX+4091EC],DL ; 从16H内查询有没有跟你输入一样的
00403BE4 |. 74 06 ||JE SHORT cdpartne.00403BEC ; 第一不是那就移动呗
00403BE6 |. 41 ||INC ECX ; 就16位注意速度哦^_^
00403BE7 |. 83F9 10 ||CMP ECX,10
00403BEA |.^ 7C F2 |\JL SHORT cdpartne.00403BDE ; 循环找16次
00403BEC |> 83F9 10 |CMP ECX,10
00403BEF |. 74 5F |JE SHORT cdpartne.00403C50 ; 刚只想到小于再看看等于16位不
00403BF1 |. 8D04EB |LEA EAX,DWORD PTR DS:[EBX+EBP*8] ; 刚起头不一样时候的EBP有用了
00403BF4 |. 3B3485 6C9140>|CMP ESI,DWORD PTR DS:[EAX*4+40916C] ; 根据(EBX+EBP*8)*4+40916C来决定比较那位
00403BFB |. 75 29 |JNZ SHORT cdpartne.00403C26 ; 不相等就下去
00403BFD |. 8A543E FF |MOV DL,BYTE PTR DS:[ESI+EDI-1] ; 后退一位的值交给DL
00403C01 |. 33C0 |XOR EAX,EAX
00403C03 |> 3890 EC914000 |/CMP BYTE PTR DS:[EAX+4091EC],DL
00403C09 |. 74 06 ||JE SHORT cdpartne.00403C11
00403C0B |. 40 ||INC EAX
00403C0C |. 83F8 10 ||CMP EAX,10
00403C0F |.^ 7C F2 |\JL SHORT cdpartne.00403C03
00403C11 |> 03C6 |ADD EAX,ESI ; EAX=此次数+总循环的次数
00403C13 |. 25 0F000080 |AND EAX,8000000F ; 做与运算
00403C18 |. 79 05 |JNS SHORT cdpartne.00403C1F
00403C1A |. 48 |DEC EAX
00403C1B |. 83C8 F0 |OR EAX,FFFFFFF0
00403C1E |. 40 |INC EAX
00403C1F |> 3BC8 |CMP ECX,EAX ; 比较
00403C21 |. 75 2D |JNZ SHORT cdpartne.00403C50
00403C23 |. 43 |INC EBX
00403C24 |. EB 15 |JMP SHORT cdpartne.00403C3B
00403C26 |> 33C0 |XOR EAX,EAX ; 清空
00403C28 |> 3890 EC914000 |/CMP BYTE PTR DS:[EAX+4091EC],DL
00403C2E |. 74 06 ||JE SHORT cdpartne.00403C36
00403C30 |. 40 ||INC EAX
00403C31 |. 83F8 10 ||CMP EAX,10
00403C34 |.^ 7C F2 |\JL SHORT cdpartne.00403C28 ;
00403C36 |> 83F8 10 |CMP EAX,10
00403C39 |. 74 15 |JE SHORT cdpartne.00403C50
00403C3B |> 46 |INC ESI ; 加1次
00403C3C |. 83FE 14 |CMP ESI,14 ; 到20了没。没有继续
00403C3F |.^ 7C 98 \JL SHORT cdpartne.00403BD9
00403C41 |. 5F POP EDI
00403C42 |. 5E POP ESI
00403C43 |. 5D POP EBP
00403C44 |. B8 01000000 MOV EAX,1 标志位为1
00403C49 |. 5B POP EBX
00403C4A |. 83C4 18 ADD ESP,18
00403C4D |. C2 0400 RETN 4
00403C50 |> 5F POP EDI
00403C51 |. 5E POP ESI
00403C52 |. 5D POP EBP
00403C53 |. 33C0 XOR EAX,EAX
00403C55 |. 5B POP EBX
00403C56 |. 83C4 18 ADD ESP,18
00403C59 \. C2 0400 RETN 4
00402A40 /$ 56 PUSH ESI
00402A41 |. 8BF1 MOV ESI,ECX
00402A43 |. 57 PUSH EDI
00402A44 |. 8D86 68010000 LEA EAX,DWORD PTR DS:[ESI+168]
00402A4A |. 8DBE 78020000 LEA EDI,DWORD PTR DS:[ESI+278]
00402A50 |. 50 PUSH EAX ; /IniFileName
00402A51 |. 6A 15 PUSH 15 ; |BufSize = 15 (21.)
00402A53 |. 57 PUSH EDI ; |ReturnBuffer
00402A54 |. 68 10944000 PUSH cdpartne.00409410 ; |Default = ""
00402A59 |. 68 28914000 PUSH cdpartne.00409128 ; |licensecode
00402A5E |. 68 20914000 PUSH cdpartne.00409120 ; |license
00402A63 |. FF15 54604000 CALL DWORD PTR DS:[<&KERNEL32.GetPrivate>; \GetPrivateProfileStringA
00402A69 |. 57 PUSH EDI ; /Arg1 = 0012F88C
00402A6A |. 8D8E 6C020000 LEA ECX,DWORD PTR DS:[ESI+26C] ; |
00402A70 |. E8 0B110000 CALL cdpartne.00403B80 ; \cdpartne.00403B80 返回到这里
00402A75 |. 85C0 TEST EAX,EAX 标志为测试
00402A77 |. 75 09 JNZ SHORT cdpartne.00402A82 不为零则后面写入INI文件,提示注册成功。
00402A79 |. 8986 74020000 MOV DWORD PTR DS:[ESI+274],EAX
00402A7F |. 5F POP EDI
00402A80 |. 5E POP ESI
00402A81 |. C3 RETN
----------------------------------------------------------------------------------------------
【破解心得】
软件根据第一位来选定需要比较的注册码位置 需要比较的注册码=前一位+此位-1
比如:我第一位输入的是 5 ,则判断 第 6,7,10,13,16,17,19,20位。
第6位=第5位的数字+6-1。
----------------------------------------------------------------------------------------------
【破解声明】 算法千变万化,但汇编代码只有那些。
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
----------------------------------------------------------------------------------------------
[注意]APP应用上架合规检测服务,协助应用顺利上架!