经典破解教学(基本理论) 破解教学第一课
功欲善其事,必先利其器!学破解当然先得看看有什么工具,这样才能得心应手嘛!!!
破解的工具介绍
修改工具: PCTOOLS, HVIEW, PSE等,这些都是DOS下的修改程式,如今是WINDOWS的天下,当然应该选用 ULTRA-EDIT(推荐)了,它的功能可是非常强大哦。
调试工具: DEBUG, SYMDEB, GAMETOOLS, CM386等,太多了,但是这些都只能调试实模式下的程式,所以如果要破WINDOWS下的 软体,必须备上: SOFT-ICE、TRW2000(中国人编写的哦!)、OD等。(注:如果是98的系统就用TRW2000,是2000、XP等就用OD,以后就会知道为什么了!)
编码相关工具: UPX、ASP、PEtite、UPXshell、UNUPX、UNPEtite等是一些压缩及解压缩的工具,一个程式被压缩的目的是防止有人破解它,它通过一定的运算法编辑,执行的时候用自己的压缩算法 在内存中开辟一块区域,解码后再执行,所以如果你要破解一个被压缩了的软体时,在内存中看到的机械码会与软体本身不一样,从而使你不能修改它. 所以另一类常驻式的修改工具相应而生,如 TSRCRACK.
档案回写工具: EXEWRITE, EXESHAPE等,这些工具的目的也是为了解压缩程式,它通过害内存中追踪到的一毓的寄存器的位址,加上一些运算来重新产生一个新的没有编码的软体.
知道了有什么工具,我就再介绍一下共享软件的注册原理吧!!
以上工具 《飘云阁》下载中心 可以下载
共享软件注册问题:
程式如何判断注册与否?
1,在程式码的某一处,藏有"注册印记".
2,安装时在"安装信息文件",如*.INI中存入资料档.
程式如何生成注册码?
1,一般是通过用你的ID作KEY,经过一定的算法,牵引出CODE码.
2,但是也有通过依照随机产生的数字,显示出来,如果你要注册,须交钱给软件作者,并告诉他随机数字,他会给你一个经过按照随机数字产生出的注册码. 其实上面两种情况都是一个道理,即程式本身在判断你输入的注册码时都会呼叫算注册码的小程式,只要将这段程式正确找到,就可以破解它.
程式如何注册处理?
1,当输入ID、CODE等,立即进行比对,正确的话则做注册处理,以后也不会再麻烦你,也就是说你已经是注册用户了.不正确的话,当然是输入到你对为止了.
2,同上,但以后一执行程式还是会判断.征对这种情况,想只改机械码是根本不行的,必须把注册码揪出来.
3,输入时不比对,只写入资料到 "*.INI"文件中,程式第二次启动时再比对.例如: ULTRAEDIT,特点是巨麻烦,想破解它们,必须要有足够的耐心.
如何入手来破解:
首先,将程式的注册对话框打开,输入任意的注册码.
第二步,按CTRL+N呼叫出TRW,然后下中断
第三步,返回注册程式,按下注册窗中的"确定"按钮.
第四步,如果被TRW拦到,说明刚才打的中断发挥作用了,可以继续工作.如果出现的是"注册失败"的对话框,说明TRW的中断没有作用,只有重复第二步,换个中断试试(常用断点请看第五课),一般会用bpx hmemcpy 就足够了
第五步,键入bc*,回车,键入pmodule,回车,猛按F12键,等到出现"注册失败"的画面时,记下刚才按F12键的按数
第六步,第二次重复第二步至第四步,这次按第五步记下的按数减去1下的按数,停下来.
第七步,开始按F10键单独追寻,直到又出现注册失败的对话框,按下"确定",会返回到TRW,察看一下光标的上一行肯定是一处CALL,这个CALL肯定有问题.
第八步,既然有问题,当然要按F8键进去观察了.当然如果要进入此CALL,必须得再次重复第一步的行动.不要嫌麻烦,CRACK就是这样,要有耐心,才会成功.
第九步,如果你是个懒人的话,或者功力不太高,和我一样,可以试试这个方法: 注意观察这个CALL上面一段程式,是否有哪个地方可以跳过此CALL,一般来讲,只要将那个跳转命令改为无条件跳转(JMP)就可以了.
共享软件时间限制问题:
对于此类软体,通常是你每次使用程序时,它都有记录你的执行时间.如果碰上厉害一点的软体,它会分析你每次使用的时间, 如果发现你修改时间,即第一次执行时间比第二次的时间要晚,就会拒绝执行.对于这类软体你不破解它是豪无办法的.SO,要破解,就得了解它,一般来讲,这类软体发现时间过期,都会SHOW出时间过期的对话框,嘿嘿,这就是关键所在,选择中断,在它开窗之前将它拦截下来,再慢慢TRACE到开窗的地方,往程式流程的上方,看看有什么地方可跳过此CALL,如果找到,修改一下就可以了.是不是很简单啊? 注意一下,上面所说的程式流程上方,不是指程式的上面,而是程式刚才执行到这里的流程上方,虽然大部分情况是程式的正上方,但是要注意一点的为妙啦.
====================================================
破解教学第二课
一.壳的概念
作者编好软件后,编译成exe可执行文件
1.有一些版权信息需要保护起来,不想让别人 随便改动,如作者的姓名等
2.把程序搞的小一点,方便使用 于是,需要用到一些软件,他们能将exe可执行文件压缩, 实现上述两个功能,这些软件称为加壳软件或压缩软件. 它不同于一般的winzip,winrar等压缩软件. 它是压缩exe可执行文件的,压缩后的文件可以直接运行.
二.加壳软件
最常见的加壳软件ASPACK ,UPX,PEcompact
不常用的加壳软件WWPACK32;PE-PACK ;PETITE ;NEOLITE
三.侦测壳和软件所用编写语言的软件
1.侦测壳的软件fileinfo.exe 简称fi.exe(侦测壳的能力极强)
使用方法:待侦测壳的软件(如aa.exe)和fi.exe位于同一目录下,执行 windows起始菜单的运行,键入:
fi aa
2.侦测壳和软件所用编写语言的软件language.exe(两个功能 合为一体,很棒) 傻瓜式软件,运行后选取待侦测壳的软件即可(open)
3.新增加WinNT平台下的自动脱壳器插件,可以应对现在大部分的软件脱壳(包括PEiD自身的UPXShit0.06壳)!(推荐!本人一直在使用)以后在其他方面还会要用到它的
4.软件常用编写语言Delphi,VisualBasic(VB)---最难破,VisualC(VC)/VisualC++(VC++)
============================================================
破解教学第三课
大伙学会了第二课,手一定痒痒的吧。那就跟我来学最简单的脱壳吧!!!!!
一、首先大家要知道这软件时候被加壳,加什么壳。这就用到了第二课你所讲的language和fi。(本人建议,检测是否加壳时最好两个一起使用,因为language查壳是很方便的而且可以知道是用什么语言编的,不过有时侦察的不准确,因此需要fi了。
二、脱壳软件 unaspack,caspr,upx,unpecompact,procdump等等
三.部分脱壳软件的使用方法
(一)aspack壳 脱壳可用unaspack或caspr
1.unaspack 是傻瓜式软件,运行后直接选择要脱壳的文件。
2.caspr 将要脱壳的软件和caspr.exe位于同一目录下,在MS-DOS窗口中打入 caspr 文件名.exe。(先将地址转移到caspr和软件所在的目录) 脱壳后的文件为XXX.ex_,XXX.ex_改名为XXX.exe即可
(四)procdump 万能脱壳
在你找不到专门脱你手中这一类的脱壳软件或一个未知的壳时,你可以试试这个(不过我不太喜欢,脱得不太干净)。
使用方法:运行后,先指定壳的名称,再选定欲脱壳软件,确定即可。
注:由于现在是高科技时代,我便不写明手动脱壳的方法了。(以后再说!)
四. exe可执行文件编辑软件ultraedit 下载它的汉化版本,它的注册机可从网上搜到 ultraedit打开一个中文软件,若加壳,汉字不能被认出 ultraedit打开一个中文软件,若未加壳或已经脱壳,汉字能被认出 ultraedit可用来检验壳是否脱掉,以后它的用处还很多,请熟练掌握 例如,可用它的替换功能替换作者的姓名为你的姓名 注意字节必须相等,两个汉字替两个,三个替三个,不足处用00补
破解教学第四课
同学们:大家好,现在我来给大家讲一下汇编语言的几条常用命令: 跳转命令
根据条件作出是否跳转的决定,通常前面会有一个判断语句,例如:
CMP AX,BX
JZ XX
上面两条命令意为用AX减BX,它的值如果为0则跳转到XX的标号行.
常用的跳转命令有:
JZ/JE 相等或为零为则跳转
JNZ/JNE 不相等或不为零则跳转
JL/JLE 小于/小于或等于则跳转
JG/JGE 大于/大于或等于则跳转
JMP 无条件跳转
比较语句
CMP AX,BX AX寄存器减去BX寄存器的内容
AND AX,BX AX与BX做"与运算"
OR AX,BX AX与BX做"或运算"
TEST AX,BX 与 AND AX,BX 命令有相同效果
XOR AX,AX<?td> 使AX的内容清零,每个寄存器与自己作异或运算等于清零动作.<?td>
子程式
一个子程的模样长得像这个样子
CALL 15F:334422
子程式是个很重要的概念,它是主程式的一个分支,用来做特定动作.
打个比方: 你要上班,先你是走路到车站,然后上车,然后下车,然后走到自己的办公室.
这里如果要把上班编为一段程式的话,那么就可以把"走路","搭车","走到办公室"做为分支程式来处理.
说得再通俗一点就是: 你要破解的程式不可能就是一条主程式到底,肯定会呼叫下面的子程式,由子程式来处理你发送的注册信息,然后比较,然后标记是否注册正确,这些都是靠它来完成的.
所以说,破解的关键在于,你找准程式在哪儿将会作注册判断,并进入那个注册子程式,仔细观察,你就成功了.子程式的返回码是 RET
算术运算
ADD AX,BX 加法运算 AX=AX+BX
SUB AX,BX 减法运算 AX=AX-BX
INC AX 寄存器加一 AX=AX+1
DEC AX 寄存器减一 AX=AX-1
MUL 乘法运算
DIV 除法运算
数据操作
MOV AX,BX 数据传送指令,将BX的值移送到AX中
XCHG AX,BX 将AX与BX的值互换
======================================================
破解教学第五课
破解常用断点设置
软件破解的主要工具是softice,如何在softice中设置好断点对于破解的成功是非常重要的,下面列举了 一些常用的断点设置,这些断点同样适合于Trw2000,两者基本上是兼容的。
bpx hmemcpy 破解万能断点,拦截内存拷贝动作
bpx Lockmytask 当你用其它断点都无效时可以试一下,这个断点拦截按键的动作
实在找不到断点可以试下面的方法:
bmsg handle wm_gettext 拦截注册码(handle为对应窗口的句柄)
bmsg handle wm_command 拦截OK按钮(handle为对应窗口的句柄)
拦截窗口:
bpx CreateWindow 创建窗口
bpx CreateWindowEx(A) 创建窗口
bpx ShowWindow 显示窗口
bpx UpdateWindow 更新窗口
bpx GetWindowText(A) 获取窗口文本
拦截消息框:
bpx MessageBox(A) 创建消息框
bpx MessageBoxExA 创建消息框
bpx MessageBoxIndirect(A) 创建定制消息框
拦截警告声:
bpx MessageBeep 发出系统警告声(如果没有声卡就直接驱动系统喇叭发声)
拦截对话框:
bpx DialogBox 创建模态对话框
bpx DialogBoxParam(A) 创建模态对话框
bpx DialogBoxIndirect 创建模态对话框
bpx DialogBoxIndirectParam(A) 创建模态对话框
bpx CreateDialog 创建非模态对话框
bpx CreateDialogParam(A) 创建非模态对话框
bpx CreateDialogIndirect 创建非模态对话框
bpx CreateDialogIndirectParam(A) 创建非模态对话框
bpx GetDlgItemText(A) 获取对话框文本
bpx GetDlgItemInt 获取对话框整数值
拦截剪贴板:
bpx GetClipboardData 获取剪贴板数据
拦截注册表:
bpx RegOpenKey(A) 打开子健 ( 例:bpx RegOpenKey(A) if *(esp+8)=='****' )
bpx RegOpenKeyEx 打开子健 ( 例:bpx RegOpenKeyEx if *(esp+8)=='****' )
bpx RegQueryValue(A) 查找子健 ( 例:bpx RegQueryValue(A) if *(esp+8)=='****' )
bpx RegQueryValueEx 查找子健 ( 例:bpx RegQueryValueEx if *(esp+8)=='****' )
bpx RegSetValue(A) 设置子健 ( 例:bpx RegSetValue(A) if *(esp+8)=='****' )
bpx RegSetValueEx(A) 设置子健 ( 例:bpx RegSetValueEx(A) if *(esp+8)=='****' )
“****”为指定子键名的前4个字符,如子键为“Regcode”,则“****”= “Regc”
功能限制拦截断点:
bpx EnableMenuItem 禁止或允许菜单项
bpx EnableWindow 禁止或允许窗口
bmsg hMenu wm_command 拦截菜单按键事件,其中hMenu为菜单句柄
bpx K32Thk1632Prolog 配合bmsg hMenu wm_command使用,可以通过这个断点进入菜单处理程序
应用示例:
CALL [KERNEL32!K32Thk1632Prolog]
CALL [......] <-- 由此跟踪进入菜单处理程序
CALL [KERNEL32!K32Thk1632Epilog]
拦截时间:
bpx GetLocalTime 获取本地时间
bpx GetSystemTime 获取系统时间
bpx GetFileTime 获取文件时间
bpx GetTickCount 获得自系统成功启动以来所经历的毫秒数
bpx GetCurrentTime 获取当前时间(16位)
bpx SetTimer 创建定时器
bpx TimerProc 定时器超时回调函数
拦截文件:
bpx CreateFileA 创建或打开文件 (32位)
bpx OpenFile 打开文件 (32位)
bpx ReadFile 读文件 (32位)
bpx WriteFile 写文件 (32位)
bpx _lcreat 创建或打开文件 (16位)
bpx _lopen 打开文件 (16位)
bpx _lread 读文件 (16位)
bpx _lwrite 写文件 (16位)
bpx _hread 读文件 (16位)
bpx _hwrite 写文件 (16位)
拦截驱动器:
bpx GetDrivetype(A) 获取磁盘驱动器类型
bpx GetLogicalDrives 获取逻辑驱动器符号
bpx GetLogicalDriveStringsA 获取当前所有逻辑驱动器的根驱动器路径
拦截狗:
bpio -h 378(或278、3BC) R 378、278、3BC是并行打印端口
bpio -h 3F8(或2F8、3E8、2E8) R 3F8、2F8、3E8、2E8是串行端口
VB程序专用断点:
bpx msvbvm50!__vbaStrCmp 比较字符串是否相等
bpx msvbvm50!__vbaStrComp 比较字符串是否相等
bpx msvbvm50!__vbaVarTstNe 比较变量是否不相等
bpx msvbvm50!__vbaVarTstEq 比较变量是否相等
bpx msvbvm50!__vbaStrCopy 复制字符串
bpx msvbvm50!__vbaStrMove 移动字符串
bpx MultiByteToWideChar ANSI字符串转换成Unicode字符串
bpx WideCharToMultiByte Unicode字符串转换成ANSI字符串
上面的断点对应VB5程序,如果是VB6程序则将msvbvm50改成msvbvm60即可
========================================================
破解教学第六课
破解注意事项
下面谈到了一些在学习解密过程中经常遇到的问题,本人根据自己的经验简单给大家谈一谈。这些问题对于初学者来说常常是很需要搞明白的,根据我自己的学习经历,如果你直接照着很多破解教程去学习的话,多半都会把自己搞得满头的雾水,因为有很多的概念要么自己不是很清楚,要么根本就不知道是怎么一回事,所以希望通过下面的讨论给大家一定的帮助:
1. 断点:所谓断点就是程序被中断的地方,这个词对于解密者来说是再熟悉不过了。那么什么又是中断呢?中断就是由于有特殊事件(中断事件)发生,计算机暂停当前的任务(即程序),转而去执行另外的任务(中断服务程序),然后再返回原先的任务继续执行。打个比方:你正在上班,突然有同学打电话告诉你他从外地坐火车过来,要你去火车站接他。然后你就向老板临时请假,赶往火车站去接同学,接着将他安顿好,随后你又返回公司继续上班,这就是一个中断过程。我们解密的过程就是等到程序去获取我们输入的注册码并准备和正确的注册码相比较的时候将它中断下来,然后我们通过分析程序,找到正确的注册码。所以我们需要为被解密的程序设置断点,在适当的时候切入程序内部,追踪到程序的注册码,从而达到crack的目的。
2. 领空:这是个非常重要的概念,但是也初学者是常常不明白的地方。我们在各种各样的破解文章里都能看到领空这个词,如果你搞不清楚到底程序的领空在哪里,那么你就不可能进入破解的大门。或许你也曾破解过某些软件,但那只是瞎猫碰到死老鼠而已(以前我就是这样的^_^,现在说起来都不好意思喔!)。所谓程序的领空,说白了就是程序自己的地方,也就是我们要破解的程序自己程序码所处的位置。也许你马上会问:我是在程序运行的时候设置的断点,为什么中断后不是在程序自己的空间呢?因为每个程序的编写都没有固定的模式,所以我们要在想要切入程序的时候中断程序,就必须不依赖具体的程序设置断点,也就是我们设置的断点应该是每个程序都会用到的东西。在DOS时代,基本上所有的程序都是工作在中断程序之上的,即几乎所有的DOS程序都会去调用各种中断来完成任务。但是到了WINDOWS时代,程序没有权力直接调用中断,WINDOWS系统提供了一个系统功能调用平台(API),就向DOS程序以中断程序为基础一样,WINDOWS程序以API为基础来实现和系统打交道,从而各种功能,所以WINDWOS下的软件破解其断点设置是以API函数为基础的,即当程序调用某个API函数时中断其正常运行,然后进行解密。例如在SOFTICE中设置下面的断点:bpx GetDlgItemText(获取对话框文本),当我们要破解的程序要读取输入的数据而调用GetDlgItemText时,立即被SOFTICE拦截到,从而被破解的程序停留在GetDlgItemText的程序区,而GetDlgItemText是处于WINDWOS自己管理的系统区域,如果我们擅自改掉这部分的程序代码,那就大祸临头了^_^!所以我们要从系统区域返回到被破解程序自己的地方(即程序的领空),才能对程序进行破解。对于每个程序都会调用的程序段,我们可能从那里找到什么有用的东西吗?(怎么样去加密是程序自己决定的,而不是调用系统功能实现的!)
3. API:即Application Programming Interface的简写,中文叫应用程序编程接口,是一个系统定义函数的大集合,它提供了访问操作系统特征的方法。 API包含了几百个应用程序调用的函数,这些函数执行所有必须的与操作系统相关的操作,如内存分配、向屏幕输出和创建窗口等,用户的程序通过调用API接口同WINDOWS打交道,无论什么样的应用程序,其底层最终都是通过调用各种API函数来实现各种功能的。通常API有两中基本形式:Win16和Win32。 Win16是原来的、API的16位版本,用于Windows 3.1;Win32是现在的、API的32位版本,用于Windows 95/98/NT/ME/2000。Win32包括了Win16,是Win16的超集,大多数函数的名字、用法都是相同的。16位的API函数和32位的API函数的区别在于最后的一个字母,例如我们设置这样的断点:bpx GetDlgItemText、bpx GetDlgItemTextA和bpx GetDlgItemTextW,其中 GetDlgItemText是16位API函数,GetDlgItemTextA和GetDlgItemTextW是32位API函数,而GetDlgItemTextA表示函数使用单字节,GetDlgItemTextW表示函数使用双字节。现在我们破解中常用到的是Win32单字节API函数,就是和GetDlgItemTextA类似的函数,其它的两种(Win16 API和Win32双字节API函数)则比较少见。 Win32 API函数包含在动态链接库(Dynamic Link Libraries,简称DLLs)中,即包含在kernel32.dll、user32.dll、gdi32.dll和comctl32.dll中,这就是为什么我们要在softice中用exp=C:\windows\system\kernel32.dll等命令行将这些动态链接库导入softice中的原因。因为不这样做的话,我们就无法拦截到系统Win32 API函数调用了。
4. 关于程序中注册码的存在方式:破解过程中我们都会去找程序中将输入的注册码和正确的注册码相比较的地方,然后通过对程序的跟踪、分析找到正确的注册码。但是正确的注册码通常在程序中以两种形态存在:显式的和隐式的,对于显式存在的注册码,我们可以直接在程序所处的内存中看到它,例如你可以直接在SOFTICE的数据窗口中看到类似“297500523”这样存在的注册码(这里是随意写的),对于注册码显式存在的软件破解起来比较容易;但是有些软件的程序中并不会直接将我们输入的注册码和正确的注册码进行比较,比如有可能将注册码换算成整数、或是将注册码拆开,然后将每一位注册码分开在不同的地方逐一进行比较,或者是将我们输入的注册码进行某种变换,再用某个特殊的程序进行验证等等。总之,应用程序会采取各种不同的复杂运算方式来回避直接的注册码比较,对于这类程序,我们通常要下功夫去仔细跟踪、分析每个程序功能,找到加密算法,然后才能破解它,当然这需要一定的8086汇编编程功底和很大的耐心与精力。
5. 关于软件的破解方式:本人将破解方式分为两大类,即完全破解和暴力破解。所谓完全破解主要是针对那些需要输入注册码或密码等软件来说的,如果我们能通过对程序的跟踪找到正确的注册码,通过软件本身的注册功能正常注册了软件,这样的破解称之为完全破解;但如果有些软件本身没有提供注册功能,只是提供试用(DEMO),或是注册不能通过软件本身进行(例如需要获取另外一个专用的注册程序,通过INTERNET的注册等等),或者是软件本身的加密技术比较复杂,软件破解者的能力、精力、时间有限,不能直接得到正确的注册码,此时我们需要去修改软件本身的程序码,即人为改变软件的运行方向,这样的破解称之为暴力破解。
6. 关于破解教程中程序代码地址问题:破解教程中都会放上一部分程序代码以帮助讲解程序的分析方法,例如下面的一段程序代码:
......
0167:00408033 PUSH 00
0167:00408035 PUSH EBX
0167:00408036 CALL [USER32!EndDialog]
0167:0040803C JMP 0040812C
......
在这里程序中的代码地址如0167:00408033,其代码段的值(即0167)有可能根据不同的电脑会有区别,不一定一模一样,但偏移值应该是固定的(即00408033不变),所以如果看到破解文章里的程序代码的地址值和自己的电脑里不一样,不要以为搞错地方了,只要你的程序代码正确就不会有问题。
7. 关于如何设置断点的问题:正确恰当的设置好断点对于快速有效的解密非常重要,好的断点设置可以使我们迅速找到关键的程序段,而不恰当的断点则会对解密造成不必要的精力消耗,甚至根本就不能拦截到程序的运行。但是具体什么时候用什么断点比较合适很难说,这需要自己用经验去累积,总的说来bpx hmemcpy这个万能断点对大多数注册码方式的软件都有用,初学者不妨多试试这个断点(通常我也是用这个断点设置,懒嘛^_^,哈哈。。。)。对于那些需要暴力破解的非注册码方式的软件,通常我们应该拦截对话框(如bpx DialogBox)和消息框(如bpx MessageBox(A))等。不论对于哪一类软件,当我们设置的断点均没有效果时,可是试一下bpx lockmytask,这个断点的作用是拦截任何一个按键的动作,具体常用的一些断点设置请参考“破解常用断点设置”一文。另外,在注册码的破解中通常需要输入用户名和注册码,一般说来用户名和密码都可以随意输入,但是根据我自己的经验,很多软件对于注册码都会逐位的进行处理,假如输入“78787878”这串数字,那么在跟踪程序的时候我们就无法知道我们当时所看到的“78”倒底是哪一个“78”,所以我比较喜欢用“12345678”这样的注册码输入方式,这样的话就就能知道程序是在对注册码的哪一位进行运算,同样的对于那些需要输入较长序列号的软件,输入类似“12345-67890-ABCDEF”这样的序列号较好。 不过有一点大家需要特别的注意:上面讲的注册码输入方式“12345678”是针对拦截WIN32 API函数来说的,假如有些时候直接拦截WIN32 API函数难以找到程序的突破口,而要借助于“S”指令在内存中寻找我们输入的用户名或注册码时,就最好不要采用“12345678”作为注册码,因为内存中很可能有许多的“12345678”字符串,这样我们没有办法知道倒底我们要破解的程序使用的是哪一个“12345678”,所以我们应该选择一个不易和内存数据相同的注册码,比如:74747474(本人喜欢用,意思嘛:去死去死。。。哈哈哈^_^),对应的搜索指令为: S 30:0 L FFFFFFFF '74747474' 。当然,以上只是我个人的习惯而已,具体用什么样的输入形式可以根据本人的爱好、习惯来定,不必拘泥于某一固定的模式。
8. 关于如何跟踪程序的问题:初学者在开始学习解密的时候往往不知道怎么样去跟踪程序,怎么样找到注册码比较的地方,当面对长长的一堆程序代码时显得不知所措。通常软件的程序内部都会利用一个子程序(即 CALL ********)去验证我们输入的注册码正确与否,对于注册码显式存在的程序,一般都会将所输入的注册码和正确的注册码放进寄存器,然后调用验证子程序进行判断,将结果返回,应用程序根据子程序返回的结果决定是否注册成功,这样的程序经常具有如下的形式:
****:******** MOV EAX,[********] (或 PUSH EAX等形式)
****:******** MOV EDX,[********] (或 PUSH EDX等形式)
****:******** CALL ********
****:******** TEST EAX,EAX (或 TEST AL,AL,或是没有这一句等形式)
****:******** JNZ ******** (或 JZ ********等形式)
其中EAX和EDX指向的内存区域就是我们输入的注册码和正确的注册码,这里的寄存器EAX和EDX是随意写的,也可以是ECX,EBX,EDI,ESI等等。对于注册码隐式存在的程序,虽然不能直接看到正确的注册码,但是通常也是先将所输入的注册码地址放进某个寄存器,然后调用子程序去验证,破解时就需要进入子程序去分析注册算法。总之,看到子程序(call ********)后面跟着跳转指令(JNZ ********或JZ ********)的地方我们就应该提高警惕,多用 D EAX(或EBX、ECX、EDX、EDI、ESI...等)去看看寄存器指向的内存区域藏着什么东西。有一点大家要提醒大家:看见程序中使用下面这个函数是要注意,即GetDlgItenInt,这个API函数的作用是将输入的文本转化为整数,所以这类程序中是不会有显示存在的注册码的,因为注册码被转换为整数了,程序通常会用 CMP ECX,EDX 这种类型的指令去验证注册码的正确性,这里ECX和EDX中存的就是所输入注册码和正确注册码的整数形式,此时可以用 ? edx 和 ? ecx 看到其十进制形式,即我们输入的形式。
9. 关于软件的反安装问题:经常我们使用某些软件时都会遇到一个问题,就是共享软件过期之后即使删掉原程序重新安装,程序依然不能用,还是一样提醒你试用期已过请注册;或者是你已经破解了某个软件,但是还想继续研究它,但是因为软件已经注册好,没有了注册选项,这时你即使彻底删掉程序再重新安装软件,结果程序运行后还是注册过的。遇到这样的情况,其实原因很简单,因为程序将注册或过期信息存在了系统注册表里,所以简单的重新安装软件是无济于事的。解决的办法就是自己删掉注册表中有关的信息,但是因为注册表是WINDOWS系统工作的基础,如果不小心就很可能会损坏它而引起系统异常,所以如果你对注册表不是很熟的话,应该在修改之前备份一下注册表。不论是修改还是备份注册表都可以使用WINDOWS下的注册表管理工具“REGEDIT”来进行,一种办法是在“开始->运行”下输入“regedit”启动它,也可以直接点击“C:\WINDOWS\regedit.exe”来运行。大部分的应用软件都会将自己的信息存在如下的路径中:HKEY_LOCAL_MACHINE\Software、HKEY_LOCAL_MACHINE\Software\Microsoft、HKEY_CURRENT_USER\Software、HKEY_CURRENT_USER\Software\Microsoft 或 HKEY_USERS\.DEFAULT\Software下,具体是哪个地方依据不同的程序而有所不同,只要按上面的顺序肯定能找到有关应用程序的键,然后将和用户名及注册码有关的键值删掉就搞定了。
10. 关于破解练习的问题:学习破解需要大量的练习,对于破解目标的选择,初学者不宜以大型的、著名的软件为目标,因为这些软件通常加密较为复杂,破解不易,应该选择一些比较不出名的、小型的和早些时候的共享软件来练习,因为加密相对简单的软件有利于初学者快速掌握破解思想和技能。至于习题的来源则很广泛,可以从网上下载,也可以去市面上购买一些共享软件光盘。
====================================================
破解教学第七课
******技巧*******(熟记50遍先^_^)
经典比较组合,常为注册码出现处(我们以后将把下面的1,2称为破解经典句式)
1.(最常用)
mov eax [ ] 这里可以是地址,也可以是其它寄存器 或mov eax [ ]
mov edx [ ] 同上 通常这两个地址就储存着重要信息 pop edx
call 00?????? 关键call
test eax eax
jz(jnz)或 jne(je) 关键跳转
2 (最常用)
mov eax [ ] 这里可以是地址,也可以是其它寄存器 或mov eax [ ]
mov edx [ ] 同上 通常这两个地址就储存着重要信息 pop edx
call 00?????? 关键call
jne(je) 关键跳转
3
mov eax [ ]
mov edx [ ]
cmp eax,edx
jnz(jz)
或者
begin mov al [ ]
mov cl [ ]
cmp al,cl
jnz(jz)
mov al [ +1]
mov cl [ +1]
cmp al,cl
jnz(jz)
cmp eax ecx (eax为计数器)
jnl begin
mov al 01
4
lea edi [ ]
lea esi [ ]
repz cmpsd
jz(jnz)
5
mov eax [ ] 这里可以是地址,也可以是其它寄存器
mov edx [ ] 同上 通常这两个地址就储存着重要信息
call 00??????
setz (setnz) al (bl,cl…)
6
mov eax [ ] 这里可以是地址,也可以是其它寄存器
mov edx [ ] 同上 通常这两个地址就储存着重要信息
call 00??????
test eax eax
setz (setnz) bl,cl…
7
call 00?????? ***
push eax (ebx,ecx…)
……
……
call 00??????
pop eax (ebx,ecx…)
test eax eax
jz(jnz)
这个形式比较特别,它的关键比较地方不在第二call中,而在第一call中
其中1,2最为常见和重要,其余的不常用(但也应该记记住)
以上技巧为破解的精髓所在,以后无非是大量的破解练习,提高经验和功力
破解的大门由此而开,破解入门的障碍所在,祝早日突破这一关
———时刻记住一句话:罗马不是一天建成的!
***几种常见情况的不同处理方法***
1.像那种一个字符一个字符验证的软件(输入不正确没有“确定”按钮)
bpx hmemcpy
g就会中断,如:音乐无限,后面的教学里有详细方法!
2.输入注册码不正确,点确定没有反应,不关闭注册窗口
bpx hmemcpy
g 点确定,就会中断
3、那种乱输入注册码点“确定”但什么提示也没有就消失了的
属于不直接比对注册码,重新启动时再比对,破解起来比较困难
具体情况具体分析,没有统一的方法。
TRW2000下写破解教程截取部分汇编代码的方法
u 起始行地址,结束行地址 >c:\piaoyunge.txt 如上面的是
例如:u 4416f8,451706 >c:\piaoyunge.txt
截取的汇编代码保存在piaoyunge.txt中
> >