注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

中国古代易经之精华四柱八字之研究和实践

偏印是人类潜藏的灵感和智慧,火克金初形成之水是智慧之源泉。

 
 
 

日志

 
 

softice加解密工具使用经验  

2009-12-21 21:15:42|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

有关详细教程请看http://www.niuniu8.org/Article/Crack/Article_3783.html

调试Windows程序步骤介绍

本教程给你一个亲手调试Windows程序的经验,教你调试应用程序和驱动程序的基
本步骤。在调试过程中,你将学会下面的的技能:
  载入SoftICE
  构造一个程序
  装入程序的源码和符号文件
  跟踪和逐步调试汇编码
  看本地数据和结构
  设置目标断点
  使用SoftICE信息命令读程序的状态
  处理符号和符号表 
  修改断点以使用条件表达式
本教程的每一小节都与前面的小节相关,所以你应按顺序学习。

教程所使用的样本文件是GDIDEMO程序。GDIDEMO是一个演示GDI功能的程序。它在
光盘上的EXAMPLESGDIDEMO目录下。它也可以从mstoolssampleswin32GDID
EMO下得到。如果GDIDEMO位于光盘上,将它拷入硬盘。
你可以用其它的样本程序或自己设计的程序来替换它。本教程使用SoftICE调试的
原理和特性可以应用到许多程序中去。
注意:在本教程中使用的程序是基于Windows NT的。如果你使用Windows 95的话
,输出可能会有些许的不同。
载入SoftICE
如果你在Windows 95或Windows NT的Boot、System、Automatic模式下运行SoftI
CE,它会在启动或重启计算机的时候自动载入。如果你在Windows NT下使用Maua
l Startup模式,SoftICE不会自动载入。
在Windows 95下载入SoftICE,键入命令:WINICE。在Windows NT下载入SoftICE
,需要:
1. 选择START SOFTICE(开始SoftICE)
2. 键入命令:NET START NTICE
注意:一旦你装入了SoftICE,除非重启计算机,否则你将不能卸载SoftICE。
检验SoftICE是否装入了,按SoftICE的热键CTRL+D。SoftICE的窗口将弹出。返回
Windows操作系统,使用X(exit)或G(go to)命令(F5)。
构造GDIDEMO样本程序
准备调试Windows应用程序的第一步是构造它的调试信息。样本程序GDIDEMO的ma
kefile(构造文件)已经设置好了。
构造样本文件的步骤:
1.启动DOS壳(就是打开DOS窗口)。
2.有样本文件的路径下。
3. 执行NMAKE命令:
C:MSTOOLSSAMPLESWIN32GDIDEMO>NMAKE
(讨论...我始终不明白这个NMAKE命令为何要这样执行。这个命令好象是把GDID
EMO的输出显示放到NMAKE这个文件中去。在MASM中也有一个NMAKE.EXE的文件,是
关于程序维护的东西。因为我没有GDIDEMO文件。不过我认为一定是它有什么特殊
的输出。)

如果GDIDEMO位于其它路径下,改变到合适的路径中去。
装入GDIDEMO样本程序
载入一个程序并从程序的调试信息中建立符号文件,然后将符号文件和源文件载
入到SoftICE中。要载入GDIDEMO程序需要如下步骤:
1. 启动Symbol Loader。
2. 从File菜单下选择OPEN MODULE(打开模块)或单击OPEN按纽。打开文件窗口
弹出。
3. 选择GDIDEMO.EXE然后点击OK按纽。
4. 从Module菜单下选择LOAD或单击LOAD按纽装入GDIDEMO。
Symbol Loader将调试信息翻译成.NME符号文件。装入符号文件和源文件,启动G
DIDEMO,打开SoftICE窗口,显示了GDIDEMO.C文件的源代码。
控制SoftICE屏幕
SoftICE窗口使看信息和调试的场所。它提供了多达7个的窗口和帮助行使你读以
及控制调试过程中的不同部分。缺省情况下,SoftICE显示如下部分:
本地窗口--显示并展开分布在堆栈中的变量
代码窗口--显示源代码或反汇编码
命令窗口--输入命令并显示信息
帮助行--提供关于SoftICE命令行的帮助和活动地址内容
1. 看代码窗口的内容。注意SoftICE在第34行显示WinMain例程。缺省情况下,
SoftICE载入程序后所遇到的第一个主模块中建立一个断点并停在那里。
2. 要看SoftICE载入的所有源文件,键入FILE命令和通配符:
:FILE *
SoftICE显示GDIDEMO的源文件:draw.c, maze.c, xform.c, poly.c, wininfo.c
, dialog.c, init.c, bounce.c和gdidemo.c。命令行窗口的大小按你所打开的窗
口数量而定,所以你可能无法看见全部的文件名。要显示剩下的文件名,按任意
键。(参考第五章)。
3. 许多SoftICE窗口可以滚动。如果你有鼠标,你可以单击滚动箭头。没有的话
,SoftICE提供了一系列的按键让你滚动指定的窗口。用如下的方式滚动代码窗口

窗口滚动方式          按键                       鼠标
到前一页             PageUp
到下一页             PageDown
到上一行             UpArrow
到下一行             DownArrow
向左移一个字符       Ctrl+LeftArrow
向右移一个字符       Ctrl+RightArrow
4. 在U命令下输入EIP,对当前指令点反汇编:
:U EIP
你也可以使用点(.)命令完成同样功能。
通过源码跟踪和逐步调试
下面的步骤教你如何使用SoftICE去跟踪源代码:
1. 输入T命令或按F8键去跟踪一条指令。
:T
执行过程到下一条指令并突出显示它。现在你可以看到如下显示:
if(!hPrevInst)
2. 代码窗口当前显示源代码。它也可以显示汇编码或者两者混合显示。要看混
合代码,使用SRC命令:
:SRC
注意每一行源代码都跟着相应的汇编指令。
3. 按F3看汇编码,再按一次看源码。
4. 输入T或按F8键去跟踪下一条指令。
执行到RegisterAppClass这一行。
正如这一步所展示的,T命令执行一条源代码或汇编指令。你可以使用P命令(F1
0)来完成一个程序段。它们之间有很大的不同。如果你逐步跟踪到指令中的调用
中去了,在调用结束之前无法返回到调用的位置。(我插一句,就是说P指令可以
直接完成调用的程序段,执行到调用语句的下一语句上。)
提示:如果调用的源代码不存在的话,T命令不会进入到调用中去。典型的例子就
是Win32 API调用。如果跟踪时所调用的源码没有的话,使用SRC命令转换到混合
或汇编模式。
读本地数据
本地窗口显示当前的堆栈结构。本例中它包含WinMain函数的本地数据。下面介绍
了如何使用本地窗口:
1. 输入T命令进入RegisterAppClass函数。本地窗口为空,因为还没有为这个函
数分配数据。
RegisterAppClass函数的实现是在INIT.C文件中。SoftICE在代码窗口的左上角显
示当前源文件。
2. 再输入T命令。
本地窗口包含了传递到RegisterAppClass的参数(hInstance),和局部结构体w
ndClass。WndClass的结构标志是一个加号(+)。这个加号表示你可以展开结构
体以浏览其内容。
注意:你也可以展开字符串和数组。
3.如果你的处理器是奔腾型号的,你可以用鼠标双击WNDCLASSA结构以展开它。
要迭起wndClass,双击它即可。
3. 使用键盘来展开结构体:按Alt+L移动光标到本地窗口,用UpArrow和DownAr
row将亮条移到wndClass结构体上,按回车键。再按回车迭起它。

使用SOFTICE心得

几招常用破解方法 (1)2009-09-28 10:00:56  www.hackbase.com  来源:try2
  下面谈到了一些在学习解密过程中经常遇到的问题,本人根据自己的经验简单给大家谈一谈。这些问题对于初学者来说常常是很需要搞明白的,根据我自己的学习经历,如果你直接照着很多破解教程去学习的话,多半都 ...
  下面谈到了一些在学习解密过程中经常遇到的问题,本人根据自己的经验简单给大家谈一谈。这些问题对于初学者来说常常是很需要搞明白的,根据我自己的学习经历,如果你直接照着很多破解教程去学习的话,多半都会把自己搞得满头的雾水,因为有很多的概念要么自己不是很清楚,要么根本就不知道是怎么一回事,所以希望通过下面的讨论给大家一定的帮助:
  
  1. 断点:所谓断点就是程序被中断的地方,这个词对于解密者来说是再熟悉不过了。那么什么又是中断呢?中断就是由于有特殊事件(中断事件)发生,计算机暂停当前的任务(即程序),转而去执行另外的任务(中断服务程序),然后再返回原先的任务继续执行。打个比方:你正在上班,突然有同学打电话告诉你他从外地坐火车过来,要你去火车站接他。然后你就向老板临时请假,赶往火车站去接同学,接着将他安顿好,随后你又返回公司继续上班,这就是一个中断过程。我们解密的过程就是等到程序去获取我们输入的注册码并准备和正确的注册码相比较的时候将它中断下来,然后我们通过分析程序,找到正确的注册码。所以我们需要为被解密的程序设置断点,在适当的时候切入程序内部,追踪到程序的注册码,从而达到crack的目的。
  
  2. 领空:这是个非常重要的概念,但是也初学者是常常不明白的地方。我们在各种各样的破解文章里都能看到领空这个词,如果你搞不清楚到底程序的领空在哪里,那么你就不可能进入破解的大门。或许你也曾破解过某些软件,但那只是瞎猫碰到死老鼠而已(以前我就是这样的^_^,现在说起来都不好意思喔!)。所谓程序的领空,说白了就是程序自己的地方,也就是我们要破解的程序自己程序码所处的位置。也许你马上会问:我是在程序运行的时候设置的断点,为什么中断后不是在程序自己的空间呢?因为每个程序的编写都没有固定的模式,所以我们要在想要切入程序的时候中断程序,就必须不依赖具体的程序设置断点,也就是我们设置的断点应该是每个程序都会用到的东西。在DOS时代,基本上所有的程序都是工作在中断程序之上的,即几乎所有的DOS程序都会去调用各种中断来完成任务。但是到了WINDOWS时代,程序没有权力直接调用中断,WINDOWS系统提供了一个系统功能调用平台(API),就向DOS程序以中断程序为基础一样,WINDOWS程序以API为基础来实现和系统打交道,从而各种功能,所以WINDWOS下的软件破解其断点设置是以API函数为基础的,即当程序调用某个API函数时中断其正常运行,然后进行解密。例如在SOFTICE中设置下面的断点:bpx GetDlgItemText(获取对话框文本),当我们要破解的程序要读取输入的数据而调用GetDlgItemText时,立即被SOFTICE拦截到,从而被破解的程序停留在GetDlgItemText的程序区,而GetDlgItemText是处于WINDWOS自己管理的系统区域,如果我们擅自改掉这部分的程序代码,那就大祸临头了^_^!所以我们要从系统区域返回到被破解程序自己的地方(即程序的领空),才能对程序进行破解,至于怎样看程序的领空请看前面的SOFTICE图解。试想一下:对于每个程序都会调用的程序段,我们可能从那里找到什么有用的东西吗?(怎么样去加密是程序自己决定的,而不是调用系统功能实现的!)
  
  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:windowssystemkernel32.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 看到其十进制形式,即我们输入的形式。

本篇文章来源于 黑客基地-全球最大的中文黑客站 原文链接:http://www.hackbase.com/tech/2009-09-28/56506_2.html

  评论这张
 
阅读(552)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017