软件破解教程 第12课 第22课 第23课 合集.doc_第1页
软件破解教程 第12课 第22课 第23课 合集.doc_第2页
软件破解教程 第12课 第22课 第23课 合集.doc_第3页
软件破解教程 第12课 第22课 第23课 合集.doc_第4页
软件破解教程 第12课 第22课 第23课 合集.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第12课 zhuce算法入门掌握算法最基本的是用户名取abcde,其相应的各位的ascii码是61、62、63、64、65 (16进制),这些一定要牢记于心。你在各个调试软件中所看到的寄存器值都是16进制的。切记不要见到 call就进入。若经过某个call,发现用户名变成ABCDE,其ascii码是41、42、43、44、45 (16进制),那么此call的作用就是小写转大写,再追入此call就显得多此一举了。找到算法关键的一段循环或进入关键call,这时开始警觉,慢慢跟踪,单步追踪时,时刻留意和观察各个寄存器的变化,主要是eax,ebx,ecx,edx。由于OllyDbg的布局设计,使用它观察注册算法比其他调试软件(如TRW)更为清晰、流畅。下面一段是典型的计算注册码的循环。在某个寄存器中已存放着用户名字符的个数111111 movsx XXXX,XXXXX 依次取用户名. inc ecx ecx是计数器. cmp ecx,xxxx 或cmp xxxx,ecx 比较用户名是否取完 jl或jg 111111 没有取完就跳回去 取完就向下走例1 分析出ex1201的注册算法 为便于分析,用户名取abcd,用ollydbg进行追踪分析。注册码计算的关键部分见下:计算开始 :004011E0 33DB xor ebx, ebx-EBX清0 :004011E2 8A5C05E4 mov bl, byte ptr ebp+eax-1C-依次取注册名字符的16进制值送入EBX的低位。 :004011E6 03D3 add edx, ebx-EDXEBXEDX 其中,EDX的初始值为0。EDX用来保存每次循环后的结果。 :004011E8 40 inc eax -EAX加1,作为计数器 :004011E9 3BC8 cmp ecx, eax -取完了吗? :004011EB 7FF3 jg 004011E0-没取完就跳回循环。 计算结束追踪过程中各寄存器值的列表清单:光条位置第一次第二次EAXEBXECXEDXEAXEBXECXEDX4011E20040104614011E6061401624614011E80614611624C34011E91614612624C34011EB光条位置第三次第四次EAXEBXECXEDXEAXEBXECXEDX4011E2204C33041264011E62634C336441264011E82634126364418A4011E93634126464418A4011EB说明:C3=61+62; 126=C3+63; 18A=126+6418A=61+62+63+64 18A的十进制为394总结:用户名abcd注册码394它的注册算法就是将姓名的所有字母ascii码之和相加,就是注册码。(1)VB注册机源码如下(界面为两个文本框):Dim myname As String Dim zcm As Integer Private Sub Text1_Change() zcm = 0 myname = Text1.Text For i = 1 To Len(myname) zcm = zcm + Asc(Mid$(myname, i) Next i Text2.Text = zcm End Sub(2)用keymake制作算法注册机(以下为keygen.rek):.const.dataszHomePage db ,0szEmail db mailto:,0szErrMess db 请输入姓名!,0szBuffer db 50 dup (0)szFMT db %d,0.codemov esi,eaxinvoke lstrlen,esimov ecx,eaxxor edx,edxxor ebx,ebxxor eax,eaxn1:mov bl, byte ptr esi+eaxadd edx,ebxinc eaxcmp ecx,eaxjg n1invoke wsprintf,addr szBuffer,addr szFMT,edxlea eax,szBuffer 其中,红色的部分基本上来自程序反汇编代码。例2 分析出ex1202的注册算法 注册码计算的关键部分见下:4012F6: push 403048 ; 将输入的用户名压栈 call kernel32!lstrlen ; 计算用户名的长度,存入eax xor esi,esi ; esi赋值为,进行初始化 mov ecx,eax ; 姓名长度存入ecx mov eax,1 ; eax赋值为1,进行初始化401309: mov edx,403038 ; 403038存用户名 mov dl,eax+403037 ; 依次取姓名字符,eax为记数器 and edx,FF ; 存入edx的高位 mov ebx,edx ; edx的值存入ebx中 imul ebx,edx ; ebxebxedxedx的平方 add esi,ebx ; 将ebx累加到esi mov ebx,edx ; edx的值存入ebx中 sar ebx,1 ; ebxebx除2edx除2 add esi,ebx ; 将ebx累加到esi,esi储存最终的累加和 sub esi,edx ; esiesiedx,最后esi装注册码 inc eax ; eax记数器加1 dec ecx ; ecx减1 jnz 401309 ; 循环直到把姓名取完注册算法公式为esi(edxedx+edx1/2-edx)的累加和,edx依次取姓名字符。下面,用keymake制作算法注册机(以下为keygen.rek):.const.dataszHomePage db ,0szEmail db mailto:,0szErrMess db 请输入姓名!,0TempBuffer db 100 dup (0) szFMT db %ld,0.codemov edi,eaxinvoke lstrlen,eaxXOR ESI,ESIMOV ECX,EAXMOV EAX,1n1: MOV EDX,DWORD PTR ediMOV DL,BYTE PTR EAX+edi-1AND EDX,000000FFhMOV EBX,EDXIMUL EBX,EDXADD ESI,EBXMOV EBX,EDXSAR EBX,1ADD ESI,EBXSUB ESI,EDXINC EAXDEC ECXJNZ n1invoke wsprintf,addr TempBuffer,addr szFMT,esilea eax,TempBuffer注意:其中,红色的部分基本上来自程序反汇编代码。例3 分析出k4n的注册算法 关键部分的代码如下:004010FA 33C9 xor ecx,ecx004010FC 33D2 xor edx,edx004010FE 33DB xor ebx,ebx00401100 33C0 xor eax,eax00401102 837D D8 32 cmp dword ptr ss:ebp-28,32 ;姓名必须小于32位00401106 7D 69 jge short k4n.00401171;大于则跳走,出错00401108 90 nop00401109 90 nop0040110A 90 nop0040110B 90 nop0040110C 0FBE840D 48FFFFFF movsx eax,byte ptr ss:ebp+ecx-B8 ;顺序取姓名的ascii码循环开始00401114 41 inc ecx ecx递增00401115 33C1 xor eax,ecx ;eax=eax xor ecx 异或操作00401117 03D8 add ebx,eax ; ebx=ebx+eax 结果累加到ebx00401119 3B4D D8 cmp ecx,dword ptr ss:ebp-28 ;比较姓名是否取完0040111C 75 EE jnz short k4n.0040110C循环结束,没取完则跳上去0040111E 6BC0 06 imul eax,eax,6 ;eax=eax600401121 C1E3 07 shl ebx,7 ;ebx=ebx(2的7次方)00401124 03C3 add eax,ebx ;eax=eax+ebx 最后的结果(正确的注册码)存入eax00401126 8945 C8 mov dword ptr ss:ebp-38,eax00401129 FF75 C8 push dword ptr ss:ebp-380040112C 68 38B44000 push k4n.0040B438 ; ASCII %lX 数字的格式为长整数,大写16进制00401131 8D8D 80FEFFFF lea ecx,dword ptr ss:ebp51 push ecx00401138 E8 873D0000 call k4n.00404EC4下面,用keymake制作算法注册机(以下为keygen.rek):.const.dataszHomePage db ,0szEmail db mailto:,0szErrMess db 请输入姓名!,0szBuffer db 50 dup (0)szFMT db %lX,0len dd 0.codemov esi,eaxinvoke lstrlen,esimov len,eaxxor edx,edxxor ecx,ecxxor ebx,ebxxor eax,eaxn1:movsx eax,byte ptr esi+ecxinc ecxxor eax,ecxadd ebx,eaxcmp ecx,lenjnz n1imul eax,eax,6shl ebx,7add eax,ebxinvoke wsprintf,addr szBuffer,addr szFMT,eaxlea eax,szBuffer注意:其中,红色的部分基本上来自程序反汇编代码。第23课 用各种不同编程语言写zhuce机启动ollydbg和CRACKME。关键代码如下::0040132B E80C020000 call 0040153C :00401330 89C6 mov esi, eax ; esi装姓名长度:00401332 83FE05 cmp esi, 00000005 ;比较姓名长度是不是小于5 。 :00401335 7D04 jge 0040133B ;不小于就跳,小于就错 :00401337 31C0 xor eax, eax :00401339 EB44 jmp 0040137F :0040133B 6A14 push 00000014 :0040133D 8D45D6 lea eax, dword ptr ebp-2A :00401340 50 push eax :00401341 6A66 push 00000066 :00401343 53 push ebx :00401344 E8F3010000 call 0040153C ;取zhuce码的长度。 :00401349 09C0 or eax, eax ;看看EAX是不是0,也就是zhuce码有没有输入。 :0040134B 7432 je 0040137F ;是0即没有输入就挂 :0040134D 31FF xor edi, edi ;初始化,EDI清零,用来做计数器。 :0040134F EB15 jmp 00401366 ;跳到算法开始。 :00401351 0FBE443DD6 movsx eax, byte ptr ebp+edi-2A ;zhuce码第一个字符入EAX。:00401356 0FBE543DEB movsx edx, byte ptr ebp+edi-15 ;姓名第一个字符入EDX。 :0040135B 29FA sub edx, edi ;用姓名第一个字符的ASCII码减去EDI(计数器,首次为0)。 :0040135D 39D0 cmp eax, edx ;比较EAX和EDX是否相等。:0040135F 7404 je 00401365 ;相等就继续。跳(这里改变z标志位的值强行跳过。) :00401361 31C0 xor eax, eax :00401363 EB1A jmp 0040137F ;不等就挂。 :00401365 47 inc edi ;计数器EDI加1。 :00401366 39F7 cmp edi, esi ;比较EDI是否等于ESI(姓名长度),也就是zhuce码是否计算完毕。 :00401368 7CE7 jl 00401351 ;相等就结束,不相等则继续。到这里第一次循环结束。第一位zhuce码验证完毕。在0040135D这里是关键的比较。以后的几次循环算法是一样的,只是数值不同。算法弄的差不多了。:0040136A 6A00 push 00000000 :0040136C 6848204000 push 00402048 :00401371 6850204000 push 00402050 :00401376 53 push ebx :00401377 E8E4010000 call 00401560 zhuce成功! 下面总结一下:算法总结:程序的流程是这样子的 1,比较输入姓名的长度是不是小于5。 2,比较zhuce码是不是没有输入。 3,算法开始,第1位zhuce码要等于第1位姓名的ASCII码-0(EDI的值)。 第2位zhuce码要等于第2位姓名的ASCII码-1。 第3位zhuce码要等于第3位姓名的ASCII码-2。依次类推。 NAME:abcde SERIAL:aaaaa 到这里算法分析完毕。zhuce码也出来了。程序计算的流程也弄明白了。用你熟悉的编程语言来模拟一下程序作个zhuce机。 VB版的zhuce机先介绍一下里面用到的一般书上没有的函数。我用的是VB6。0企业版。 LEN() 返回字符串的长度。 ASC()返回字符的ASCII码,VB返回的是10进制的。 MID()返回参数指定的字符。用法:MID(目标字符串,开始的位数,取字符的个数) STRING()把数字转换为字符。如:A=STRING(76)此时A=“L”。 启动VB6,新建一个工程。在FORM上加两个LABLE控件。然后加两个TEXTBOX控件。一个COMMANDBUTTON控件。 TEXT1。TEXT用来获取NAME,TEXT2。TEXT用来输出SERIAL。 在COMMAND1控件的CLICK事件里如下代码: Private Sub Command1_Click() Dim a, b, c, d, e 变量声明。VB不用特别声明变量的类型。多简单。:) text2.text=姓名不能小于5位!大哥! a = Text1.Text a=输入的姓名 b = Len(a) b=姓名的长度 c = 0 设一个计数器,类似于程序中的EDI。 If b 5 Then GoTo a: 判断姓名长度。小于5就什么也不做。 Do 循环语句,用来计算zhuce码。 d = Mid(a, c, 1) d = Asc(d) d = d - c d = String(1, d) e = e & d c = c + 1 Loop While c = b-1Text2.Text = e 输出zhuce码。 a: End Sub 然后用P-CODE编译。才12KB。Visual C的zhuce机 先用APPWIZARD做一个默认的DIALOG BASED。然后删掉上面的东西。加入两个EDITBOX,一个BUTTON。 EDITBOX1用来获得NAME,EDITBOX2用来输出SERIAL。 用CLASSWIZARD加入EDITBOX1的MEMBER m_name.EDITBOX2的MEMBER m_key. 用CLASSWIZARD在BUTTON1的BN_CLICKED事件加个函数OnButton1() 加入如下代码: void CLLDlg:OnButton1() / TODO: Add your control notification handler code here UpdateData(TRUE); m_key = ; char * pName= m_name.GetBuffer(0); if(m_name.GetLength() 5)MessageBox(姓名必须大于5个字母, error, MB_OK); else for(int n=0;n=m_name.GetLength();n+) m_key += *(pName+n)-n; UpdateData(FALSE); ; m_name.ReleaseBuffer(); 用RELEASE编译。 Turbo C版的zhuce机#include stdio.h main() unsigned char a80; int d,i; unsigned long s; start:printf(*-= figugegl =- Crackme #1*nThis keygen is made by fpxnPlease input your name : ); gets(a); d=strlen(a); if(d5) printf(Your user name must longer than 4 letters!please re-inputn);goto start; printf(Your Register code is : ); for(i=0;id;i+) printf(%c,ai-i); DELPHI版的zhuce机procedure TForm1.BitBtn1Click(Sender: TObject); var a,c,e:string; /定义a、c、e为字符型, b,d:integer; /定义b、d为数值型。 begin a:=edit1.Text; /让a的值等于EDIT1的值。 if length(a)25 |:0040D237 6858664100 push 00416658:0040D23C 50 push eax:0040D23D FFD6 call esi以上表明,zhuce码前两位必须是25,否则“zhuce失败”。下面只讨论第3位开始直到末位的zhuce码。:0040D2E3 8B00 mov eax, dword ptr eax* Possible StringData Ref from Data Obj -00 |:0040D2E5 BB78624100 mov ebx, 00416278:0040D2EA 53 push ebx:0040D2EB 50 push eax:0040D2EC C645FC04 mov ebp-04, 04:0040D2F0 FFD6 call esi:0040D2F2 59 pop ecx以上,对接下来的zhuce码首位和末位进行判断,不能为0,否则“zhuce失败”。* Referenced by a (U)nconditional or (C)onditional Jump at Address:|:0040D38A(C)|:0040D380 0FBE3401 movsx esi, byte ptr ecx+eax:0040D384 0175DC add dword ptr ebp-24, esi:0040D387 41 inc ecx:0040D388 3BCA cmp ecx, edx:0040D38A 7CF4 jl 0040D380以上是算法的关键流程,将新姓名字符串的ASCII码求和,存入ebp24。:0040D3DC 337DD8 xor edi, dword ptr ebp-28:0040D3DF 397DDC cmp dword ptr ebp-24, edi:0040D3E2 0F8591010000 jne 0040D579以上即为关键比较和关键跳转。edi为zhuce码末尾2位与前面的异或运算的值。末尾两位除不能为零外任意,我们暂且取73。由于非明码比较,用刘健英大侠的keymake制作内存zhuce机失败,但可以用keymake制作算法zhuce机,语言为32位汇编语言。它的rek文件如下:.const.dataszHomePage db ,0szEmail db mailto:,0szErrMess db 请输入姓名!,0szBuffer db 50 dup (0)szHex db 25%lu73,0 ;设定输出格式szM db whm_w,0.codeinvoke lstrcat,eax,addr szM ;姓名和预置字符串连接,调用lstrcat函数mov esi,eax ;新串存入esixor eax,eax ;eax清零xor ebx,ebx ;ebx清零n1:lodsb ;逐个取字节,直到取完,构成一个循环add ebx,eax ;加到ebx上cmp al,0 ;比较是否

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论