📄 windows-crack
字号:
=================================================================
这是一个非常好的例子,注册码的计算也很简单。
3.1.1检查程序
===========================
检查程序以后你知道它是32位的应用程序,要求输入名字和注册码。让我们开始!
3.1.2捕捉代码
===========================
我们象拆解TaskLock那样—设置断点。我们可以在两个可能性最大的两个函数
都设上断点:GetWindowTextA和GetDlgItemTextA.按下Ctrl+D进入SoftICE,然后:
:bpxgetwindowtexta
:bpxgetdlgitemtexta
接下来进入注册对话框,输入一个名字和一些数字(多数情况下是一个整数),
我是这么写的,然后按OK....
Name:ED!SON'96
Code:12345
程序在GetDlgItemTextA处停住了,就象TaskLock一样。我们按F11回到调用它
的地方。用Ctrl+Up卷动窗口直到看到这些:
MOVESI,[ESP+0C]
PUSH1E;最大长度
PUSH0040A680;缓冲地址
PUSH000003ED;控制柄
PUSHESI;对话柄
CALL[User32!GetDlgItemTextA]
数字40A680引起了我们的注意,看看那里有什么:
:d40a680
如果没有我们输入的名字,数据窗口里有些什么呢?好了,我们来研究下面的一段代码:
PUSH00
PUSH00
PUSH000003F6;控制柄
MOVEDI,0040A680;保存缓冲区地址
PUSHESI;对话柄
CALL[User32!GetDlgItemInt]
GetDlgItemInt和GetDlgItemText差不多,但它从文字框中返回一个整数。
它出在EAX中返回来的,所以单步运行通过这些代码,再来看看寄存器窗....
对我而言是:
EAX=00003039
十六进制数3039是多少?输入:
:?3039
我们得到:
000030390000012345"09"
^16进制^十进制^ASCII
正如你看到(和已经猜到)的那样,它是你输入的注册码。OK,下面怎么办?让
我们来看下面的代码:
MOV[0040A548],EAX;返回注册码
MOVEDX,EAX;同时保存在DX中
3.1.3计算注册码
==========================
这样注册码就算出来了
MOVECX,FFFFFFFF;这几行计算字符长度
SUBEAX,EAX;.
REPNZSCASB;.
NOTECX;.
DECECX;ECX<--长度
MOVSXEAX,BYTEPTR[0040A680];读入40A680处的一字节
IMULECX,EAX;ECX=ECX*EAX
SHLECX,0A;左移0A次
ADDECX,0002F8CC;结果加上2F8CC
MOV[0040A664],ECX
验证合法性....
CMPECX,EDX;比较
JZ00402DA6;如果相同就....
当你运行到比较这一步时,就可以得到你真正的注册码:
:?ecx
对我而言它是:
000DC0CC0000901324
也就是说我的正确的注册码是901324.
按F5或者Ctrl+D让它运行,然后用正确的注册码(十进制)再来一次。这一次成功了!
4.为COMMANDLINE95制作注册器
=========================================
我们把上面计算注册码的代码翻译成C语言程序。最明了的计算公式就是:
code=((uppercase_first_char*length_of_string)<<0x0A)+0x2f8cc;
注(1):别忘了一件事就是把所有字符转成大写
(2):"<<0x0A"实际上就是"乘以2^10"
完整的程序就是:
#include<string.h>
#include<stdio.h>
intmain()
{
unsignedlongcode;
unsignedcharbuffer[0x1e];
printf("CommandLine95KeymakerbyED!SON'96\n");
printf("Entername:");
gets(buffer);
strupr(buffer);
code=(((unsignedlong)buffer[0]*
(unsignedlong)strlen(buffer))
<<0x0A)+0x2f8cc;
printf("Yourcodeis:%lu",code);
return0;
}
爽吧?
4.当程序调用一个函数时,PUSH和CALL这些指令是如何工作的
============================================================================
我们重新来看看TaskLock中的这段代码:
PUSH32;字符串最大长度
PUSHEAX;字符缓冲区地址
PUSH000003F4;控制标识
PUSHDWORDPTR[ESI+1C];对话框柄
CALL[USER32!GetDlgItemTextA];获得字符串
如果认为是C语言编译出来的话,这个CALL应该是这样:
GetDlgItemTextA(hwndDlg,0x3F4,buffer,0x32);
^[ESI+1C]^EAX
PUSH把数据保存在叫做堆栈的地方。每个PUSH把新的数据放在堆栈的顶部,被调
用的子程序就挨个地检查躺在堆栈中的数据,按照定义来使用它们。
5.关于VISUALBASIC程序
==============================
VisualBasic的EXE文件并不是真正的编译可执行文件。它们只是包含调用
VBRUNxxx.DLL代码,它从EXE文件中读去数据然后运行程序。这就是为什么为什
么VB程序这么慢。因为这些EXE文件并不是真正的EXE文件,你没法反汇编它们,
你只能得到一些到DLL的调用和大量的垃圾。当你试图调试它们时,也只能在DLL
中打转。解决的办法就是用反编译器。有个叫DoDiD的人写过一个VisualBasic2&
3的反编译器,是个共享软件,在网上可以找到(见附录C)。对Windows95中的Visual
Basicversion432-bit程序,具我所知现在还没有反编译器,虽然我很想有一个。
注:真正的(或者聪明的)程序员是不用VB编程的。
附录
A.让SoftICE载入符号
==============================
你可以用expgetwindowtext命令来检查SoftICE是否已经为GetWindowText装入
了符号,象这样:
:expgetwindowtext
如果你没有得到所有GetWindowText函数的列表,你就得编辑\SIW95\WINICE.DAT,
在"Examplesofexportsymbolsthatcanbeincludedforchicago"这段文字
以后的那些'exp='的行首去掉';',为了节省内存,选择最重要的几个就可以了:
kernel32.dll
user32.dll
gdi32.dll
编辑完后,重新起动计算机使其生效。
B.函数语法
============================
如果你看看下面的函数声明,对我们上面讲到的函数调用就容易明白了:
intGetWindowText(intwindowhandle,char*buffer,intmaxlen);int
GetDlgItemText(intdialoghandle,intcontrolid,char*buffer,
intmaxlen);
intGetDlgItemInt(intdialoghandle,intcontrolid,int*flag,inttype);
这些函数的详细描述,可参考Windows/Win32编程手册
C.如何获得软件
================================
CRACKINGTOOLS
SoftICE/Win2.oo:http://www.geocities.com/SoHo/2680/cracking.html
(译者注:目前最新版本3.23,详见NuMega主页http://www.numega.com/)
VBDecompiler:ftp://ftp.sn.no/user/balchen/vb/decompiler/
SAMPLEPROGRAMS
TaskLock:http://users.aol.com/Sajernigan/sgllck30.zip
CommandLine95:ftp://ftp.winsite.com/pub/pc/win95/miscutil/cline95.zip
注:已经找不到了,谁找到了请upload上来。
D.如何与我联系
================
OnIRC(EFNet):In#Ucf96,#Cracking
Bye-mail:edison@ccnux.utm.myORan461165@anon.penet.fiOnmy
homepage:http://www.geocities.com/SoHo/2680/cracking.html
======================================================================
译后记:
花了一个下午的时间(上班时间啊!),译完这篇拆解教程。不知大家看不看
得懂?ED!SON的文章是很浅显易懂的,我担心会让我毛手毛脚地闹出歧义来,
如果真有什么错误的话,帐应该算在我头上(请大家来信指出)。ED!SON的这
篇文章对初学者来说非常值得一读,我就是看完这篇文章以后,马上连续CRACK
了几个程序(就这么快、这么简单!)下次我就把CRACKWINZIP6.2的过程讲讲
吧(WINZIP6.2的注册器已经泛滥成灾了,就当练习练习吧)。欢迎来信交流,
你CRACK了什么程序,别忘了告诉我你用的方法;如果觉得我翻译得还算看得下
去话,就给些鼓励吧。
CFIDOID:JimTyan
EMAIL:jimtyan@tasteful.com
--
相爱的时候,真诚比才华更重要!
--
Nobrain,nopain.