信息来源: 看雪学院
【破文作者】血草[DFCG]
【文章题目】光驱伴侣算法
【软件名称】光驱伴侣V1.2
【下载地址】http://www.skycn.com/soft/13453.html
----------------------------------------------------------------------------------------------
【破解工具】PEID,OD
【破解平台】Win9x/NT/2000/XP/XPSP2
----------------------------------------------------------------------------------------------
【软件简介】
一个小巧的绿色软件,只有一个可执行文件(68kb),将它拷贝到任何一个目录即可执行。其功能是控制光驱的弹出、关闭,支持多个光驱,可随系统自动启动,在关闭系统时如果有光盘被遗忘在光驱内,该软件可以给出提示。使用本软件,您可以方便地用鼠标打开、关闭光驱。如果您经常将光盘忘记在光驱中,本软件可以为您解决这个问题,在关机时提醒您取出光驱中的光盘。1.1版新增功能:热键打开、关闭光驱。
【文章简介】
一个小小的软件,算法也简单,很适合入门。
----------------------------------------------------------------------------------------------
【破解过程】
1首先运行软件,弹出注册框,任意输入用户名和密码后按注册,没有任何提示,
想想需要的API:GetDlgItemTextA,GetWindowsTextA,LstrLenA.EndDialog.
2启动PIED,测壳。显示MicrosoftVisualC++6.0^_^可以偷懒了,最怕脱壳;
3OD载入软件,插件查看字符串,无有用字符串;
4OD右键->查找->当前模块中的名称发现有LstrLenA右键->在每个参考上设置断点
F9运行。。
00403B80/$83EC18SUBESP,18
00403B83|.8D442400LEAEAX,DWORDPTRSS:[ESP]
00403B87|.53PUSHEBX
00403B88|.55PUSHEBP
00403B89|.56PUSHESI
00403B8A|.57PUSHEDI
00403B8B|.50PUSHEAX
00403B8C|.E82FFFFFFFCALLcdpartne.00403AC0
00403B91|.8B7C242CMOVEDI,DWORDPTRSS:[ESP+2C]
00403B95|.57PUSHEDI;/String
00403B96|.FF1564604000CALLDWORDPTRDS:[<&KERNEL32.lstrlenA>];\lstrlenA拦截到这里
00403B9C|.83F814CMPEAX,14;比较注册码是否为20位
00403B9F|.0F85AB000000JNZcdpartne.00403C50;不相等那就去试用吧^_^
00403BA5|.8A07MOVAL,BYTEPTRDS:[EDI];取注册码第一位去EAX的低位字节AL
00403BA7|.3C44CMPAL,44
00403BA9|.7504JNZSHORTcdpartne.00403BAF;比较第一位是否是D,不是就跳
00403BAB|.33EDXOREBP,EBP;是D则EBP为0这个后面有用
00403BAD|.EB23JMPSHORTcdpartne.00403BD2
00403BAF|>3C39CMPAL,39;是9吗?不是下去
00403BB1|.7507JNZSHORTcdpartne.00403BBA
00403BB3|.BD01000000MOVEBP,1;ebp为1
00403BB8|.EB18JMPSHORTcdpartne.00403BD2
00403BBA|>3C41CMPAL,41;A同理就不解释了^_^
00403BBC|.7507JNZSHORTcdpartne.00403BC5
00403BBE|.BD02000000MOVEBP,2;ebp为2
00403BC3|.EB0DJMPSHORTcdpartne.00403BD2
00403BC5|>3C35CMPAL,35;5
00403BC7|.0F8583000000JNZcdpartne.00403C50;还不清醒啊咳。
00403BCD|.BD03000000MOVEBP,3;ebp为3
00403BD2|>33DBXOREBX,EBX
00403BD4|.BE01000000MOVESI,1;计数器=1
00403BD9|>8A143E/MOVDL,BYTEPTRDS:[ESI+EDI];每次取1位到DL
00403BDC|.33C9|XORECX,ECX;清0开始工作
00403BDE|>3891EC914000|/CMPBYTEPTRDS:[ECX+4091EC],DL;从16H内查询有没有跟你输入一样的
00403BE4|.7406||JESHORTcdpartne.00403BEC;第一不是那就移动呗
00403BE6|.41||INCECX;就16位注意速度哦^_^
00403BE7|.83F910||CMPECX,10
00403BEA|.^7CF2|\JLSHORTcdpartne.00403BDE;循环找16次
00403BEC|>83F910|CMPECX,10
00403BEF|.745F|JESHORTcdpartne.00403C50;刚只想到小于再看看等于16位不
00403BF1|.8D04EB|LEAEAX,DWORDPTRDS:[EBX+EBP*8];刚起头不一样时候的EBP有用了
00403BF4|.3B34856C9140>|CMPESI,DWORDPTRDS:[EAX*4+40916C];根据(EBX+EBP*8)*4+40916C来决定比较那位
00403BFB|.7529|JNZSHORTcdpartne.00403C26;不相等就下去
00403BFD|.8A543EFF|MOVDL,BYTEPTRDS:[ESI+EDI-1];后退一位的值交给DL
00403C01|.33C0|XOREAX,EAX
00403C03|>3890EC914000|/CMPBYTEPTRDS:[EAX+4091EC],DL
00403C09|.7406||JESHORTcdpartne.00403C11
00403C0B|.40||INCEAX
00403C0C|.83F810||CMPEAX,10
00403C0F|.^7CF2|\JLSHORTcdpartne.00403C03
00403C11|>03C6|ADDEAX,ESI;EAX=此次数+总循环的次数
00403C13|.250F000080|ANDEAX,8000000F;做与运算
00403C18|.7905|JNSSHORTcdpartne.00403C1F
00403C1A|.48|DECEAX
00403C1B|.83C8F0|OREAX,FFFFFFF0
00403C1E|.40|INCEAX
00403C1F|>3BC8|CMPECX,EAX;比较
00403C21|.752D|JNZSHORTcdpartne.00403C50
00403C23|.43|INCEBX
00403C24|.EB15|JMPSHORTcdpartne.00403C3B
00403C26|>33C0|XOREAX,EAX;清空
00403C28|>3890EC914000|/CMPBYTEPTRDS:[EAX+4091EC],DL
00403C2E|.7406||JESHORTcdpartne.00403C36
00403C30|.40||INCEAX
00403C31|.83F810||CMPEAX,10
00403C34|.^7CF2|\JLSHORTcdpartne.00403C28;
00403C36|>83F810|CMPEAX,10
00403C39|.7415|JESHORTcdpartne.00403C50
00403C3B|>46|INCESI;加1次
00403C3C|.83FE14|CMPESI,14;到20了没。没有继续
00403C3F|.^7C98\JLSHORTcdpartne.00403BD9
00403C41|.5FPOPEDI
00403C42|.5EPOPESI
00403C43|.5DPOPEBP
00403C44|.B801000000MOVEAX,1标志位为1
00403C49|.5BPOPEBX
00403C4A|.83C418ADDESP,18
00403C4D|.C20400RETN4
00403C50|>5FPOPEDI
00403C51|.5EPOPESI
00403C52|.5DPOPEBP
00403C53|.33C0XOREAX,EAX
00403C55|.5BPOPEBX
00403C56|.83C418ADDESP,18
00403C59\.C20400RETN4
00402A40/$56PUSHESI
00402A41|.8BF1MOVESI,ECX
00402A43|.57PUSHEDI
00402A44|.8D8668010000LEAEAX,DWORDPTRDS:[ESI+168]
00402A4A|.8DBE78020000LEAEDI,DWORDPTRDS:[ESI+278]
00402A50|.50PUSHEAX;/IniFileName
00402A51|.6A15PUSH15;|BufSize=15(21.)
00402A53|.57PUSHEDI;|ReturnBuffer
00402A54|.6810944000PUSHcdpartne.00409410;|Default=""
00402A59|.6828914000PUSHcdpartne.00409128;|licensecode
00402A5E|.6820914000PUSHcdpartne.00409120;|license
00402A63|.FF1554604000CALLDWORDPTRDS:[<&KERNEL32.GetPrivate>;\GetPrivateProfileStringA
00402A69|.57PUSHEDI;/Arg1=0012F88C
00402A6A|.8D8E6C020000LEAECX,DWORDPTRDS:[ESI+26C];|
00402A70|.E80B110000CALLcdpartne.00403B80;\cdpartne.00403B80返回到这里
00402A75|.85C0TESTEAX,EAX标志为测试
00402A77|.7509JNZSHORTcdpartne.00402A82不为零则后面写入INI文件,提示注册成功。
00402A79|.898674020000MOVDWORDPTRDS:[ESI+274],EAX
00402A7F|.5FPOPEDI
00402A80|.5EPOPESI
00402A81|.C3RETN
-----------------------------------------------------------------------------------------
【破解心得】
软件根据第一位来选定需要比较的注册码位置需要比较的注册码=前一位+此位-1
比如:我第一位输入的是5,则判断第6,7,10,13,16,17,19,20位。
第6位=第5位的数字+6-1。
-----------------------------------------------------------------------------------------
【破解声明】算法千变万化,但汇编代码只有那些。
【版权声明】本文纯属技术交流,转载请注明作者并保持文章的完整,谢谢!
-----------------------------------------------------------------------------------------