2006年07月26日
局域网管理软件集成

1. 网路岗 v5 企业特别版 + 网路岗金版(金版系列) 4.9.1特别完美版(win200 破解补丁 200用户)
软件类型: 特别软件/特别软件
软件语言: 简体中文
运行环境: Win9X/WinME/NT/Win2000/WinXP/Win2003
软件大小: 11.73 MB
整理时间: 2005-11-23 14:08:33
下载次数: 本日:227 本周:227 本月:227 总计:227
软件简介:
网路岗》是一款优秀的网络监控软件产品,自2002年推出第一代产品以来,通过我们的不断完善与改进,现在已经升级到第五代,在产品监控功能不但增强的同时,产品的稳定性也得到大幅度提高,目前在国内拥有数千家企业和校园客户,并得到客户的广泛好评;《网路岗》在同类网络监控软件产品中的拥有很高的声誉,已成为国内企业网络监控必备软件之一。
一、本网络监控软件功能
1、监控员工常用的网络活动。
如:上网网站、收发邮件、网上聊天内容(MSN/QQ/Yahoo Messenger)、FTP上传命令、TELNET远程登录命令等,以实现全面的网络行为监控。
2、规定员工上网行为。
封堵腾讯QQ;限制上网站点、限制收发邮件服务器;网页过滤(如色情网)、邮箱过滤、端口过滤、Ip过滤、关键词过滤;规定上网和收发邮件时间;封堵网络游戏、股票软件;规定外发资料的最大尺寸;限制上网流量;IP白名单,IP黑名单。
3、日志统计。
可统计员工的上网时间、网站排名、收发邮件数量、聊天、上网流量等。
4、绑定IP和MAC(单网段的情况)。
监控网络中盗用IP地址的情况。
5、多种过滤库。
系统同时提供多种过滤库,把包括:色情网址库、游戏网站库、聊天网站库、财经股票库、游戏端口库等。
6、免费高速共享上网NAT。
可实现多台机器共享上网,代替市面上大多数代理服务器软件。
[ 以上是功能 ]
7、邮件监控。
详细记录通过所有邮件收发工具所收发的邮件(含内容和附件),可记录通过网站所发的邮件内容和附件。
8、屏幕监控/信息探测。
截取被监控者的电脑屏幕,获取客户机器系统信息,操作客户硬盘,操作客户机注册表等。
9、十多种专业报表。
[ 以上是功能 ]
二、本网络监控软件优势
1、能应对各类复杂环境下的网络监控要求
2、跨Vlan环境监控能力很强
3、监控Web 邮件内容及附件,
4、聊天内容监控,监控msn/qq等聊天软件传输文件
5、同时提供多种网络监控模式:基于网卡、IP等
6、拥有超过8000台以上电脑的客户
7、同类产品中拥有最多量的国内知名企业客户
三、本网络监控软件特色
1. 实施网络监控的机器只需要一台,领导可通过远程查看的方式查阅监控内容。
2. 严格的权限控制管理。对于服务器的设置操作、远程查阅日志、本地查阅日志等都需要严格的身份验证。
3. 系统的网络监控日志自动定期压缩备份转移。
4. 查阅、统计、打印网络监控日志内容
5. 现场观察网络监控内容。
6. 正式版安装以后,同一网段内,其他机器上的试用版不能正常运行,以免一般员工监控网络上其同事的电脑。
7. 跨平台监控;被监控电脑也可以是Unix 、Linux 等其他操作系统的网络。
8. 跨VLan监控(可基于网卡监控)

http://www.orsoon.com/Software/Catalog183/4983.html

网路岗金版(金版系列) 4.9.1特别完美版(win200 破解补丁 200用户)
运行环境 Win9X/WinXP/Win2000/
整理时间 2005-6-8 16:18:12
软件语言 简体中文
软件类型 网络工具
授权方式 破解软件
软件大小 5.54 MB
软件简介∷
[邮件监视/控制]
1. 监视并记录通过OutLook Foxmail等工具接受/发送邮件的邮件正文和附件;
2.监视通过免费邮局发送的Web邮件内容和附件;
3.控制外发邮件的大小;
4.对邮箱的过滤;
5.限制收发邮件的端口;
[聊天监视/控制]
1.监视MSN Messenger /Yahoo Messenger /ICQ 的聊天内容;能监视发送QQ消息的机器;
2.全方位封堵聊天软件(包括使用HTTP代理做出口);
[上网监视/控制]
1.可监控到上网的网站URL;
2.可监视到在网页上发表文章或申请服务或在一些网站上的聊天内容;
3.多种过滤库;其中,列表库有:色情列表库/游戏网站列表库/股票网站过滤库/聊天网站过滤库;端口有:股票软件端口库/游戏端口库;关键词有:黄色关键词过滤库;
4.只允许某些机器在某些时段只能上指定的网站;
5.关键词过滤;可封锁Google Baidu 3721 Yahoo等知名搜索引擎上的搜索关键词,并支持中文关键词的过滤;
6.自定义封锁端口或只开放某些上网端口;
7.下载过滤;可封锁某些类型的下载文件;
8.IP过滤;可过滤某些地区的网络服务器;
9.IP与MAC地址的绑定;
[其他协议的监控]
1.FTP详细命令监控/FTP上传文件内容记录;
2.Telnet详细命令记录;
3.Netbios命令监控;
[监控屏幕]
1.可动态(或静态)截取客户机的电脑屏幕;
2.可设置监控屏幕的图片质量和自动抓取屏幕的功能;
3.可随时发送消息给被监控机器;
[监控上网流量]
1.可实时看到每台上网机器的网络流量(上行流量/下行流量);
2.可统计每台机器在某段时间的上网流量;
3.可限制每台机器的上网流量;包括限制每周/每天/每小时/每刻钟/每分钟的上网流量;
[自定义监控项目]
对网路通讯数据包结构比较熟悉的高级用户可根据自身要求,定义要监控的通讯数据。
[软件本身的功能]
1.自动搜索功能;可迅速搜索网络内的机器,并可解析出机器名;
2.提供IP包分析工具;便于用户自己分析网络游戏软件的端口;
3.一机监控,多机远程查看;管理者可通过因特网从其他电脑上查阅监控日志;
4.严格的权限控制管理;对于服务器的设置操作、远程查阅日志、本地查阅日志等都需要严格的身份验证;
5.监控日志自动定期压缩备份转移;
6.多种监控模式:基于网卡的监控/基于帐户的监控/基于IP的监控,以及混合模式的监控;
7.超强适应各种网络环境的能力;可捆绑目前市面上的所有代理服务器软件,可适应各种硬件环境下的上网模式;
8.查阅、统计、打印监控日志内容;
9.现场观察监控内容;
10.日志内容转移接口;为便于日志内容的上报,该系统提供了日志上报转移的开发接口;
11.正式版安装以后,同一网段内,其他机器上的试用版不能正常运行;
12.跨平台监控;被监控电脑也可以是Unix 、Linux 等其他操作系统;
补丁使用方法:
替换 安装目录中的 SentryDll.dll
此破解在 win2000 + sp4 测试通过
winxp win2003 破解补丁请在 r51社区下载
注册时请输入大于 4位的注册码 ^_^
注册成功后软件可以使用到 2010年 200 用户

http://www.downbest.net/down/Softwar…og22/3103.html

2.AnyView(网络警)网络监控系统 v3.36 特别版
软件类型: 特别软件/特别软件
软件语言: 简体中文
运行环境: Win9X/WinME/NT/Win2000/WinXP/Win2003
软件大小: 5.63 MB
整理时间: 2005-10-31 10:49:22
下载次数: 本日:26 本周:26 本月:26 总计:26
软件简介:
是一款企业级的网络监控软件。一机安装即可监控、记录、控制局域网内其他计算机的上网行为。用于防止单位重要资料机密文件等的泄密;监督审查限制网络使用行为;备份重要网络资源文件。主要功能有:
一、网络行为和内容监视:
包括:网站浏览监视、邮件收发监视、聊天行为监视、游戏行为监视、FTP监视、流量监视、自定义监视;
(1)AnyView能实时记录局域网内所有用户浏览过的网页(包括网页标题、网页内容、所属网站、网页大小等),并以网页快照的形式供管理者查看;
(2)AnyView能实时记录局域网内所有收发的邮件(包括POP3/SMTP协议和HTTP协议的邮件),同时检测并记录其所用的IP地址、收发时间、标题、收件人/发件人、附件、内容及邮件大小等信息。
(3)AnyView能实时监控局域网用户对各类聊天工具的使用情况,能检查出在线用户所使用的聊天工具、上下线时间等信息,并保存。
(4)AnyView能实时记录网内所有用户通过FTP协议上传下载的文件(服务地址以及内容)
(5)AnyView能监视所有网络游戏行为,并可以自己定义需要监视的网络游戏;
(6)AnyView能监视用户即时流量,历史流量分析和流量排行
(7)AnyView能自定义被监视的网络应用,比如BT、股票软件、FLASHGET等
二、通用的、全系列、整网络、自定义、端口级的上网行为控制
包括:网站浏览控制、邮件收发控制、聊天行为控制、游戏行为控制、自定义行为控制、端口级控制;所有的控制都可针对3层对象(一个网络、一个分组、一个电脑);都可针对指定的时段;都可针对指定的协议TCP/UDP;可通用的自由定义;全系列端口级别管理;
(1)可禁止浏览所有网站、只允许浏览指定网站(白名单)、禁止浏览指定网站(黑名单)
(2)可禁止收发邮件、只允许收发指定邮局(白名单)、禁止手法指定邮局(黑名单)
(3)可禁止所有的聊天行为(比如QQ、MSN、ICQ、YAHOO、UC、POPO、E话通等),并可以自行增加聊天行为控制列表;
(4)可禁止所有的网络游戏(比如联众、中国游戏中心等等);并可以自行增加网络游戏行为控制列表;
(5)可禁止自定义控制列表,比如股票软件、BT软件等;并发起阻断;
(6)可进行严格的UDP/TCP整个网络段的全系列端口级别的控制,并支持黑名单和白名单功能;
三、内容过滤功能
包括:对不需要的监视的象和行为进行过滤,忽略监视;可针对3种对象操作(一个网络、一个分组、一个电脑);
(1)全部监视、不监视、只监视部分应用
(2)网站过滤白名单和黑名单功能
四、IP和MAC绑定
包括:禁止MAC地址修改、禁止所有IP地址修改、禁止部分IP地址修改;有效防止非法用户访问网络资源;
五、用户管理
包括:分组增加删除、用户名修改、锁定分组刷新、监视对象设置
(1)自动搜索局域网内的电脑,并自动解析出机器名,默认以MAC地址区分用户
(2)允许建立分组并允许刷新分组;方便管理以及权限控制;
(3)允许用户名修改,方便识别和管理,分组权限移动后自然继承新分组权限;
六、其他功能。
(1)采用C/S管理模式,支持分级权限管理。AnyView支持服务器和客户端程序分开,支持多客户连接,允许对不同控制台赋予不同的监控权限。如果是有固定外部IP,可以远程管理和查看;
(2)跨平台监控;被监控电脑也可以是Unix 、Linux 等其他操作系统;
(3)不需要在被监视和管理电脑上安装任何软件,一机运行,整网管理;
(4)支持拦截监视内容和配置文件的的备份、恢复;支持无限多个IP网段监视
(5)采用连接密码管理禁止非法用户连接,采用控制台密码管理禁止非法用户查看;
(6)引擎作为系统服务运行在后台(如IIS一样),不需要登陆和用户干预就可监控;
(7)脱机浏览监视数据功能,附带自动检测连接设备是否HUB的功能;
(8)正式版安装以后,同一网段内,其他机器上的试用版不能正常运行。

http://www.orsoon.com/Software/Catalog75/4729.html

3.局域网助手(LanHelper) V1.4.7 绿色特别版 +局域网助手 LanHelper1.47 简体中文破解版
软件类型: 绿色软件/特别软件
软件语言: 简体中文
运行环境: Win9X/WinME/NT/Win2000/WinXP/Win2003
软件大小: 729 KB
整理时间: 2005-9-26 12:06:07
下载次数: 本日:95 本周:95 本月:95 总计:95
软件简介:
LanHelper(中文名称“局域网助手”)是Windows平台上强大的局域网管理、扫描、监视工具。LanHelper独特的强力网络扫描引擎可以扫描到您所需要的信息,使用可扩展和开放的XML管理扫描数据,具有远程网络唤醒、远程关机、远程重启、远程执行、发送消息等功能,能够5。同时不需要服务端软件,节省您的时间和金钱,使您的网络管理更加轻松和安全。
LanHelper能扫描到远程计算机非常丰富的各种信息,包括了名称(NetBIOS名或者DNS名)、IP地址、MAC地址、工作组名、用户名称、操作系统类型、服务器类型、备注、共享文件夹、隐藏共享、共享打印机、共享文件夹的属性(是否可写、只读或者密码保护等)、共享备注等,而且由于使用了多线程,每秒钟最快可以扫描上百台计算机。扫描引擎集成的扫描共享文件夹是否可写、只读、密码保护等属性为LanHelper独有的特性,其中扫描可写共享对于预防和协助清除像尼姆达这样难于根除的蠕虫病毒非常有用。
不需要额外安装任何服务端程序,使用LanHelper可以大大简化您的网络管理。“远程唤醒”可以给位于局域网、广域网或者因特网上的计算机发送唤醒命令而使其自动加电启动,可以定时。“远程关机”让系统管理员能够通过网络关闭或者重新启动远程计算机,可以定时。“远程执行”使您可以在远程机器统上执行命令,运行程序或者打开文件,比如使远程机器启动信使服务,或者只是播放一首MP3歌曲等,执行专门设计的“LanHelper集成命令”则可以轻松让远程机器完成关机、锁定、截取屏幕、获取系统信息、窗口管理、进程管理等等各种操作。“刷新状态” 可用于定时监视网络,查看计算机是否在线,以及检测计算机名或者IP地址是否有改动,当指定的事件发生时能够以电子邮件等方式通知管理员。“发送消息”功能可以用非常灵活的方式给用户、计算机、工作组或者整个局域网发送消息。
扫描数据的保存使用XML,在LanHelper后续版本甚至以前版本中都可以使用。即使没有LanHelper,保存的XML文件可以使用IE 浏览器或者其他像MS OFFICE 2002这样支持XML的软件打开。当使用浏览器打开XML文件时,使用XSL编写的样式表文件LHstyle.xsl会将其转换为网页表格,非常便于查看。
请输入任意用户名和注册码完成注册!!

http://www.orsoon.com/Software.Asp?id=4249

局域网助手 LanHelper1.47 简体中文破解版
软件语言: 简体中文
软件类别: 国产软件 / 破解版 / 浏览辅助
运行环境: Win9x/NT/2000/XP/
整理时间: 2005-9-28 10:45:30
页面刷新: 2005-10-6 8:49:06
软件简介:
局域网助手 LanHelper 是Windows平台上强大的网络管理和应用工具。(1)具备强大的网络扫描引擎,扫描方式多,扫描速度快,能扫描计算机名、作组名、IP地址、MAC地址、备注、共享文件夹、隐藏共享、共享打印机、共享文件夹的存取属性(是否可写、只读或者密码保护等)、共享备注、操作系统类型、服务器类型等。(2)使用可扩展和开放的XML管理扫描数据。(3)远程网络唤醒,支持计划,可以在局域网或者广域网中远程开机。(4)远程关机和远程重启,可以定时。(5)使远程机器执行任务,打开程序或文件。(6)“LanHelper集成命令”可以使局域网或者其他子网中的远程机器关机(断电)、休眠、锁定等等。(7)发送消息到局域网或者因特网,有非常灵活的发送模式。(8)查看计算机是否在线,检测计算机名或者IP地址是否有更改。(9)不需要额外安装任何服务端程序。

原版:
http://www.sjedu.net/LanHelper/LHsetup-cn.exe
破解:
http://down.tiansha.net/20040409/tia…et-jywzscr.rar
http://down4.tiansha.net/20040409/ti…et-jywzscr.rar

4.Easy网管 V8.3 +破解补丁
软件大小:14.5 MB
软件语言:简体中文
软件类别:国产软件 /远程监控
运行环境:WinXP, Win2000, NT, WinME, Win9X
添加时间:2005-3-13 17:15:09
更新时间:2005-9-5 13:38:40
下载统计:本日:23 本周:29 本月:203 总计:1535
软件简介:
通过局域网内1台计算机实现:1.自动扫描局域网内IP节点,包括网络、工作组、网络打印机、计算机,自动获得IP地址、MAC地址、机器名称、共享目录;对于Win2000/XP/2003计算机可远程安装监测客户端软件;2. 监视网内计算机收发邮件,保留邮件摘要副本;3.限制使用Web Mail邮箱;4.限制可以上网计算机;5.限制访问网站;6.限制上网时间;7.监视网内计算机收发邮件,保留邮件摘要副本;8.规定哪些计算机可以使用QQ、在什么时间可以使用QQ;9.控制使用各种聊天软件,包括QQ、MSN Messenger、YAHOO通等;10.远程"任务管理器",实时监测其他计算机运行程序,杀死进程;11.锁其他计算机键盘、鼠标和禁止屏幕保护;12.遥控其他Log Off;13.遥控其他计算机关闭电源Power Off;14.遥控其他计算机重新启动Reboot;15.远程截取工作站屏幕;16.控制运行“联众”等各种网络游戏和各种单机游戏程序;17.控制和管理局域网内计算机上运行程序;18.网络文本会话、文本广播;19.网络电话、网络语音广播;20.适合通过代理服务器、路由器、专线等各种方式接入Internet环境;21.限制修改IP地址与MAC地址

原版:
http://www.997.cn/Download.asp?ID=1290
破解:
http://www.997.cn/Download.asp?ID=926&sID=0
http://www.997.cn/Download.asp?ID=926&sID=1

5.局域网查看工具(LanSee) V1.60 绿色完美破解版 +局域网查看工具 1.60 破解版
软件类型: 绿色软件/破解注册
软件语言: 简体中文
运行环境: Win9X/WinME/NT/Win2000/WinXP/
软件大小: 304 KB
整理时间: 2005-8-30 9:21:43
下载次数: 本日:1 本周:427 本月:1 总计:427
软件简介:
局域网查看工具(LanSee)是一款主要用于对局域网(Internet上也适用)上的各种信息进行查看的工具。采用多线程技术,搜索速度很快。它将局域网上比较实用的功能完美地融合在一起,比如搜索计算机(包括计算机名,IP地址,MAC地址,所在工作组,用户),搜索共享资源,搜索共享文件,多线程复制文件(支持断点传输),发短消息,高速端口扫描,捕获指定计算机上的数据包,查看本地计算机上活动的端口,远程重启/关闭计算机等,功能十分强大。该软件是一款绿色软件,解压后直接打开运行,无需安装。

http://www.orsoon.com/Software.Asp?id=3647

局域网查看工具 1.60 破解版
软件大小:605K
软件语言:简体中文
授权方式:破解版
软件类别:网络监测
软件更新:2005-4-15 18:38:23
页面刷新:2005-4-15 18:38:25
下载次数:5697
软件介绍:
该软件是一款非常方便实用的对局域网各种信息进行查看的工具,采用多线程技术,搜索速度很快。它可以实现以下主要功能:(1)搜索所有工作组。(2)搜索指定网段内的计算机,并显示每台计算机的计算机名,IP地址,工作组,MAC地址,用户。(3)搜索所有工作内或是选定的一个或几个工作组内的计算机,并显示每台计算机的计算机名,IP地址,工作组,MAC地址,用户。(4)搜索所有计算机的共享资源。(5)将指定共享资源映射成本地驱动器。(6)搜索所有共享资源内的共享文件。(7)搜索选定的一个或几个共享资源内的共享文件。(8)在搜索共享文件时,你可选择搜索你所需要的一种或几种文件类型的共享文件。(9)打开指定的计算机。(10)打开指定的共享目录(11)打开指定的共享文件。(12)强大消息发送功能,给选定的一台或几台计算机发消息,给指定工作组内的所有计算机发消息,给所有计算机发消息。(13)强大的扫描功能,你可以扫描出局域网内或指定网段内所有提供FTP,WWW,Telnet等服务的服务器,你也可以扫描出局域网内或指定网段内所有开放指定端口的计算机。(14)ping指定的计算机,查看指定计算机的MAC地址,所在的工作组以及当前用户等。
用户名:LAN00E
注册码:0123959785AB

http://www.arongsoft.com/down/down.asp?id=2804&no=1
http://www.arongsoft.com/down/down.asp?id=2804&no=2

6.局域网查看工具 1.60 注册版
软件语言: 简体中文
软件类型: 国产软件 / 免费版
运行环境: Win9X/Me/WinNT/2000/XP
授权方式: 免费版
软件大小: 385KB
整理时间: 2005-05-22
软件简介: 局域网查看工具(LanSee)是一款主要用于对局域网(Internet上也适用)上的各种信息进行查看的工具。采用多线程技术,搜索速度很快。它将局域网上比较实用的功能完美地融合在一起,比如搜索计算机(包括计算机名,IP地址,MAC地址,所在工作组,用户),搜索共享资源,搜索共享文件,多线程复制文件(支持断点传输),发短消息,高速端口扫描,捕获指定计算机上的数据包,查看本地计算机上活动的端口,远程重启/关闭计算机等,功能十分强大。该软件是一款绿色软件,解压后直接打开运行,无需安装。
注册信息:
注册名:OkGet
注册码:O1279W97MWCE
M1349697N1EK

http://www.okget.com/down.php?id=651&url=1
http://www.okget.com/down.php?id=651&url=2

7.端口映射器(TCP Mapping) V2.02 绿色版
软件类型: 绿色软件/免费软件
软件语言: 简体中文
运行环境: Win9X/WinME/NT/Win2000/WinXP/Win2003
软件大小: 387 KB
整理时间: 2005-11-23 12:59:30
下载次数: 本日:110 本周:110 本月:110 总计:110
软件简介:
TCP Mapping 是简单、易用、高性能的端口映射软件,当在因特网上需要访问局域网内的机器时,可以在局域网的网关上运行此程序,映射TCP端口到局域网内的某台机器的指定端口,则在因特网上可以访问到局域网内部的机器,新版本支持多端口映射。

http://www.orsoon.com/Software/Catalog70/4981.html

8.GJProxy(代理服务器) v2.41 绿色版
软件类型: 绿色软件/免费软件
软件语言: 简体中文
运行环境: Win9X/WinME/NT/Win2000/WinXP/Win2003
软件大小: 3.52 MB
整理时间: 2005-10-20 10:28:02 解压密码: 默认密码:
www.orsoon.com

下载次数: 本日:24 本周:24 本月:24 总计:24 『查看和发表对此软件的评论』
软件简介:
GJProxy是一款代理服务器软件。通过它,局域网中的电脑可以共享一个Internet连接上网,并且可以对上网电脑进行监控和管理。
GJProxy 的七大特点
一、丰富的协议支持 支持HTTP、FTP、SOCKS、SMTP、POP3、TELNET、NNTP、RTSP、MMS等协议;内置DNS域名解析系统;支持TCP、UDP端口映射
二、高速、稳定、CPU占用率低
三、多种接入方式 支持拨号接入(ADSL、ISDN、PSTN等);支持专线接入(DDN);支持小区局域网接入
四、对客户机的多种控制 可以根据需要对客户机的协议、上网时间、网站过滤、拨号权限(支持各种拨号)等进行灵活限制
五、实用的信息显示 服务器可以随时查询已登录用户的信息,如真实姓名、IP、上网时间、使用时长等;服务器端实时显示上下行速率、协议连接数;采用拨号方式上网时,客户端可以实时显示服务器与INTERNET的连接状态
六、定时关机 服务器上设置好“定时关机”后,服务器在指定的时间到达时会自动关机,方便网管的管理
七、信使服务 通过服务器可以随时给在线的客户端发送信息,如服务器维护、会议通知等

http://www.orsoon.com/Software/Catalog72/4579.html

9.超级网管(SuperLANadmin) V5.2 破解版
软件语言: 简体中文
软件类别: 国产软件 / 破解版 / 网络辅助
运行环境: Win9x/WinNT/Win2000/WinME
整理时间: 2005-9-13 11:28:23
页面刷新: 2005-10-6 8:49:42
软件简介:
SuperLANadmin的中文名为超级网管,简单易用而功能强大。SuperLANadmin可以运行在Windows 95/98/Me/NT/2000/XP系统中。SuperLANadmin不需要安装任何客户端就可以实现一些以下功能:(1)列举所有工作组、计算机名称、IP地址、MAC地址、共享文件、打印机 。(2)局域网内信息沟通,可以发信息给一个人、工作组,也可以发给所有人 。(3)远程关机,远程重启。(4)搜索指定的某个计算机的共享资源。(5)搜索所有计算机的所有共享资源。(6)打开某个指定的计算机。(7)打开某个指定的共享目录。(8)将搜索到信息导出到文本文件。(9)对搜索结果进行排序。

http://down5.tiansha.net/20031209/ti…net-cjwgcr.rar
http://down3.tiansha.net/20031209/ti…net-cjwgcr.rar

10.代理超人 V2.80
软件大小: 3433 KB
软件语言: 简体中文
软件类别: 国产软件 / 免费版 / 网络辅助
应用平台: Win9x/NT/2000/XP
加入时间: 2005-10-10 10:16:30
下载次数: 52642
软件介绍:
代理超人的主要功能
1. 自动按设定的条件上网搜索代理,并可过滤掉重复代理;
2. 自动多线程(1-100)验证代理的匿名程度(超级匿名、普通匿名、透明代理),可在验证代理匿名程度的基础上自定义特定验证网址以便验证代理对该网址是否有效,可以无限制重新验证没有验证出来的代理;
3. 自动识别代理所在国家或地区,可选择保留哪些国家和地区的代理;
4. 可按自定义选项(如匿名程度、位于哪些国家地区,传输速度)自动整理和过滤代理列表;
5. 可以直接双击代理列表启用代理和停止代理(无须重启IE,即时生效),可以复制代理指定格式到剪贴板,方便别处设置;
6. 可以对代理列表进行管理:新增、删除、清空、导入、导出;
7. 可以单独查询IP的归属地;
8. 方便的监视剪贴板主动式智能分析代理功能,只需要选择含有代理的文本点一下复制,代理全都到你手中;
9. 独有智能代理功能,可以完全自动的实现代理的取得和使用,只要你按如下步骤设定:设置开机自动运行程序->设置自动执行智能代理->设置系统设置里的各项参数。一切OK,不用你动一个手指头,智能代理会帮你搞定一切的;
10. 方便快捷的智能代理浮动窗口,可以帮助你轻松使用智能代理功能,并且可以通过其快捷菜单简单启用速度最快的20个代理;
11.内置代理服务器调度,可监视进出网络的传输信息,你可以选择使用IE代理设置还是直接使用内置代理服务,并且可以自定义内置代理服务的监听端口;
12.内置的消除上网痕迹功能,可以一键消除Cookie、历史记录、临时文件和地址栏列表,让你在使用代理时安全;
13.软件内置在线升级和参数更新功能,不需要重启系统就可完成升级;
14.简单直观的操作状态显示:程序主界面的状态栏提示以及智能代理浮动窗口的图标状态提示。
15.可以自动保存和载入上次代理列表,可以为每个代理添加注释备忘,方便用户操作;
主要新增功能如下:
1、增加了对所有上网方式的代理自动调度支持,可以直接在程序中设置局域网(LAN)、ADSL拨号、MODERM拨号,VPN拨号等上网方式的代理服务器;
2、增加了验证选中代理功能,现在有三种验证代理选项:验证全部代理、验证单个代理、验证选中代理。
3、修正了验证代理时线程数目和实际线程数不一致的BUG。
2.5版新增功能:
1、增加了单独的精确识别地区功能(在高级菜单中),速度飞快,识别10000个代理只要2秒钟,可以对列表内的代理IP进行精确定位所在国家和地区,IP库采用最新纯真QQIP库:qqwry.dat,用户可以随时自己升级,只要把最新的qqwry.dat拷贝到代理超人目录下就可以了,代理超人会自动分析和启用新IP库的;
2、代理查询模块的IP数据库也采用最新的纯真QQIP库。
3、改进了几个线程调用方式,软件将比以前更稳定一些。
4、注意:在线程内同步验证时使用的IP库还是以前的标准IP库,这是为了保证保留国家地区选项的正确与有效,大家可以先使用保留国家地区选项过滤和验证后,再使用精确识别地区来定位到省市县甚至街道(仅限于中国)。
2.6版增加功能: 1、增加了SOCKS4/SOCKS5代理支持,现在可以同时验证HTTP、SOCKS4、SOCKS5代理(在设置中有灵活的选项可以调节),强烈建议如果只需要验证某类代理时将其他种类的验证关掉,否则将影响效率; 2、增加了无法判别代理类型,表示可以通过此代理访问你自定义的附加验证地址,但是无法确定匿名程度; 3、由于前面版本为了提高效率,默认搜索和吸附代理总数超过1000个时自动过滤重复将不起作用,2.6特意在整理选项中增加了删除重复代理功能,如果你搜索的代理过多导致搜索时没有过滤掉全部重复代理,可以使用整理功能去除重复; 4、根据用户反馈,恢复了代理列表多选的功能,以方便大家批量删除等操作; 5、为了让大家使用更方便,增加了软件自动记忆主窗口和浮动窗口位置功能,你改变了窗口位置,下次启动就将按你上次的安排来显示。

http://www.997.cn/Download.asp?ID=8368
http://www.skycn.com/soft/21440.html

11.P2P终结者 V2.07 企业版 破解版 +2.02完美版
运行环境 Win9X/WinXP/Win2000/ 软件语言 简体中文
整理时间 2005-9-8 19:42:10 软件类型 破解注册
授权方式 破解版
软件大小 2.69 MB
本月下载:1594 总共下载:5939
软件简介
P2P终结者是国内目前首套专门针对网络P2P滥用问题开发的系统软件,软件可以实现对局域网全网主机的P2P下载控制,只需要一机安装,就可以控制全网,非常易于部署,可保证企业网络有限带宽得到正当利用。
由于目前国内企业一般只有有限的带宽,而P2P的出现在带来巨大的好处的同时也造成了网络带宽的巨大浪费,尤其在被用来进行大量数据下载,这给企业整体网络应用带来了巨大的压力,甚至企业正常业务网络带宽也无法保证,而目前对P2P尚没有专门的控制软件,一般是通过在防火墙或者代理服务器进行纷繁的规则设定来完成,这也给网络管理人员带来巨大的麻烦,本软件一机安装,控制全网P2P应用,可帮助企业轻松解决这个日益严重的问题,软件安装使用都极为简便,是解决P2P问题的最佳选择。
安装序列号:133A-CA17-C630-B20F

http://www.5icrack.com/Software/catalog22/7243.html

P2P终结者 2.02完美版
运行环境 Win9X/WinXP/Win2000/
整理时间 2005-6-11 11:56:11
软件语言 简体中文
软件类型 网络工具
授权方式 破解软件
软件大小 2.21 MB

http://www.downbest.net/down/Softwar…og22/3123.html

12.子网分割器 1.0
软件语言: 简体中文
软件类型: 国产软件 / 免费版
运行环境: Win9X/Me/WinNT/2000/XP
授权方式: 免费版
软件大小: 222KB
整理时间: 2005-08-09
软件简介: 本小软件用于计算子网划分的个数和主机数
1 软件会自动判断你的子网划分是否正确
2 软件会判断你的IP地址类别
3 包括二进制和十进制显示方式 是网络工程师理想的简便小工具。

http://www.okget.com/down.php?id=2497&url=1
http://www.okget.com/down.php?id=2497&url=2

13.长天局域网IP扫描工具NetScan 特别完美版
运行环境 Win9X/WinXP/Win2000/
整理时间 2005-6-17 14:23:01
软件语言 简体中文
软件类型 网络工具
授权方式 破解软件
软件大小 600 KB
本月下载:49 总共下载:49
软件简介∷
长天局域网IP扫描工具NetScan远程扫描局域网内各个网段的在线电脑的网卡mac地址、主机名称,进行端口扫描,可以查出开放的端口号。

http://www.downbest.net/down/Softwar…og31/3187.html

14.网管大师(追踪者)-数据包抓取分析系统 V 1.281 国安专用版
软件类型: 绿色软件/免费软件
软件语言: 简体中文
运行环境: Win9X/WinME/NT/Win2000/WinXP/Win2003
软件大小: 1.95 MB
整理时间: 2005-11-20 12:54:51
下载次数: 本日:96 本周:96 本月:96 总计:96
软件简介:
网管大师(追踪者)-数据包抓取分析系统
V 1.281 国安专用版
For win2000/winxp/win2003/Vista
专用版,无任何限制!
功能:可以高速截取局域网中的数据包,可用来判断网络状态,网络信息。可用来检查局域网中蠕虫病毒的源头。
可将数据包保存在数据库中,可离线单独分析数据。
网管大师的一个部件程序,这个是2005年出的1.281版,
机构内部使用版本,内含2种数据包抓取模式,一个是利用WINPCAP驱动抓包,一个是
不需要安装任何驱动的模式抓包(该模式只适用于win2000/winxp/win2003/Vista);
程序中已经捆绑了Winpcap驱动安装程序,如果没有驱动,可以选择直接安装!
该程序非常强大,可以高速截取局域网中的数据包,可用来判断网络状态,网络信息。
可用来检查局域网中蠕虫病毒的源头。可将数据包保存在数据库中,可离线单独分析
数据。功能多多!推荐安全工程师,网络工程师使用!

http://www.orsoon.com/Software/Catalog183/4939.html

15.串行口应用 V2.3
软件类别: 国产软件 / 免费版 / 调试工具
文件大小: 4150 KB
运行环境: Win9x/NT/2000/XP
软件语言: 简体中文
添加时间: 2005-06-19 17:10:17
下载次数: 2958
软件简介:
1.监控串口:具有端口监控功能,可以监控、拦截、保存所收发的数据((9X/2K/XP/2003).
2.串口调试:支持常用的串口操作功能,支持大数据量的收发、保存,支持自动发送.
3.串行口应用软件界面友好,方便易用。

http://count.skycn.com/softdownload…./COMMVV2.3.rar
http://count.skycn.com/softdownload…./COMMVV2.3.rar

16.代理服务器列表 V4.0
软件大小:1749K
软件语言:简体中文
授权方式:免费版
软件类别:网络共享
运行环境:Win9x/WinNT/2000/ME/XP
软件更新:2004-10-30 9:05:47
页面刷新:2005-6-8 21:16:11
下载次数:29765
软件介绍:
代理服务器设置工具,自动更新代理服务器列表。

http://www.arongsoft.com/down/down.asp?id=241&no=1

17.美萍网管大师 Ver9.8 破解版
软件大小:1460K
软件语言:简体中文
授权方式:破解版
软件类别:网吧管理
运行环境:Win9x/WinNT/2000/ME/XP
软件更新:2005-7-15 18:04:24
页面刷新:2005-7-15 18:04:26
下载次数:17337
软件介绍:
“美萍网管大师”软件是最实用的网吧管理系统。它集实时计时计费,计帐于一体,即可单独作为网吧的计费管理机,也可配合安全卫士远程控制整个网络内的所有计算机。可对任意机器进行开通停止,限时,关机,热启动等操作,并且具有会员制管理,网吧商品管理,每日费用统计等众多功能,是管理网吧,电脑游戏房,培训中心等复杂场合的纯软件管理解决方案。
1)提供全部开通,全部停止功能。 2)增加客户“自助换机”功能。以及功能可以选设置。 3)提供远程管理查看当前计费状态功能。管理员可以通过网络在任何地方了解当前的计费状况。 4) 改进了1024分辨率下的操作界面,完善了操作方式。 5)增加批量修改会员费率的功能

http://www.arongsoft.com/down/down.asp?id=414&no=1

18.万象网管2004+万象网管 2004破解版
文件大小:60MB 总浏览:11222
运行平台:Windows9X/ME/NT/2000/XP 总下载:15667
级别评定: 本 月:3512
添加时间:2005-3-2 16:42:44 本 周:1006
最后更新:2005-3-2 16:42:44 今 日:114
软件简介
万象网管软件是开发销售长达五年的产品,拥有正版注册用户已超过两万家网吧,盗版用户更是不计其数。能真正满足各类型网吧运营管理需要的软件,系统界面友好、功能完善、操作简单,是网吧业主的有力助手。庞大的用户基础使绝大多数网吧从业人员熟悉我们的软件,熟悉我们的设置和管理流程,使用我们的系统可以使您无需在对技术人员进行培训,可迅速上手操作,为您节约时间和大量成本。
提示:1、安装之前请检查您的机器上是否安装IPX/SPX协议。
2、服务端建议用一台单独机器
3、服务端可以在 Windows95/95 OSR2/98/NT/2000上使用,建议为window 2000。
4、服务端和客户端不能安装在同一台计算机中同时执行。
服务端安装在您的用来收费的计算机上,客户端需要安装在所有要被管理的计算机上。您可以安装一台计算机以后,用克隆方式做出其它计算机,支持万象自已开发的VOD系统。

http://soft.only169.com/get.asp?id=30&type=1&url=1

万象网管 2004破解版
软件大小:22MB
语言种类:简体中文
授权方式:免费版
所在类别:网吧管理 / 国产软件
运行环境:Win9x/NT/2000/XP/
页面刷新:2005-9-10 4:24:09
下载次数:2174
相关介绍: 万象网管 2004破解版:先在吉胜官方网站下载原版,然后安装破解版,就可以用了,本人测试过,稳定,暂时没发现问题!

http://www.naf.com.cn/download.asp?id=74022&no=1

19.遥志代理服务器CCProxy V6.30 +破解补丁
软件大小:820 KB
软件语言:简体中文
软件类别:国产软件 / 网络共享
运行环境:WinXP, Win2000, NT, WinME, Win9X
添加时间:2004-10-15 16:40:00
更新时间:2005-7-23 19:13:58
下载统计:本月:69 总计:5070
软件简介:
  CCProxy是国内最流行、下载量最大的国产代理服务器软件。主要用于局域网内共享Modem、ADSL、宽带、专线、ISDN等代理上网。它具有两项最主要功能:代理共享上网和客户端代理权限管理。只要局域网内有一台机器能够上网,其它机器就可通过这台机器上安装的CCProxy代理共享上网。支持浏览器代理、邮件代理、游戏代理等等,可以控制客户端代理上网权限,针对不同用户合理安排上网时间,监视上网记录,限制不同用户带宽流量,十种文字界面,设置简单,功能强大,适合中小企业共享代理上网。新版本6.2中又增加了服务器IP绑定功能、详细的日志分析功能、加强过滤功能(端口屏蔽、站点过滤)、更强大的帐号管理功能(组管理、使用时间),还有远程WEB方式帐号管理。

http://www.997.cn/Download.asp?ID=5319
遥志代理服务器CCProxy V6.30 破解补丁
软件大小:6 KB
软件语言:简体中文
软件类别:注册/破解补丁 / 破解软件 / 网络共享
运行环境:WinXP, Win2000, NT, WinME, Win9X
添加时间:2004-10-15 16:41:00
更新时间:2005-8-11 20:02:36

http://www.997.cn/Download.asp?ID=5321&sID=0

http://www.997.cn/Download.asp?ID=5321&sID=2

20.局域网花名册(LANregister) V0.99
软件语言: 简体中文
软件类型: 国产软件 / 免费版 / 网络辅助
运行环境: Win9x/NT/2000/XP/
下载次数: 1074
软件大小: 4368 KB
整理时间: 2005-4-28 14:57:00
软件简介:  
本软件可以自动检测IP地址的占用情况,以图形和表格两种形式加以显示。能自动取得各计算机的相关信息(例如,工作组、标识、MAC地址),为局域网的管理带来了极大的方便。利用本软件还可以把上述信息转化为Web页(HTML文件),便于将这些信息打印出来或在网上发布。

http://www.78soft.com/down.asp?id=2178&no=1

21.网络扫描仪 V1.0 特别版
软件类型: 绿色软件/特别软件
软件语言: 简体中文
运行环境: Win9X/WinME/NT/Win2000/WinXP/Win2003
软件大小: 621 KB
整理时间: 2005-9-29 11:05:01 解压密码: 默认密码:
www.orsoon.com

下载次数: 本日:36 本周:193 本月:193 总计:193
软件简介:
如何确定您的局域网内所有机器的开关情况呢?不必您亲自对每台机器去仔细检查,用“灏远网络扫描仪”,坐着点一个按钮,就全知道了,既方便又确保不会像人为检查一样有漏网之鱼;如果您的局域网内的机器不便使用对外的即时聊天工具,但您却又有在局域网内发通知的需要,用“灏远网络扫描仪”,也能满足您的需求:网络扫描仪可以对局域网中任何PC机发送信息,并且不需要在仅用于接收的PC机上另外安装任何程序,方便之余,也大量节约成本。小软件,大方便,试试就知道!
主要功能:
一、扫描PC信息:可以迅速扫描局域网中所有PC机的开关等情况,省去您每次亲自查看的烦琐。您还可以定时扫描,让您局域网中的机器随时在您的监控之下。
二、发送信息:可以在局域网中对所有PC机发送您的信息:面向所有人的会议通知、针对个人的工作安排……省去您亲身、亲口逐一传达的麻烦。而接收您的信息的机子,不需要安装任何软件。既能避免使用即时聊天工具可能造成的工作不规范,也能满足您发布信息的需求。
注意:应用破解补丁后输入任意注册码!

http://www.orsoon.com/Software.Asp?id=4289

22.ip2(确定您的广域网及局域网IP地址的工具) v1.03 绿色版
软件类型: 绿色软件/免费软件
软件语言: 简体中文
运行环境: Win9X/WinME/NT/Win2000/WinXP/Win2003
软件大小: 13 KB
整理时间: 2005-10-8 11:33:48 解压密码: 默认密码:
www.orsoon.com

下载次数: 本日:81 本周:81 本月:442 总计:442
软件简介:
确定您的广域网及局域网IP地址的工具

http://www.orsoon.com/Software.Asp?id=4414

23.易通网管王2005 2.2.0 破解版
软件语言: 简体中文
软件类别: 国产软件 / 破解版 / 网络辅助
运行环境: Win9x/NT/2000/XP/
整理时间: 2005-9-18 10:12:58
页面刷新: 2005-10-6 8:49:35
软件简介: 面向公司,学校等企事业单位而开发的一套远程计算机监控与管理软件,是计算机监控与管理的最佳选择

原版:
http://www.etongsoft.net/download/etnetadmin.rar

破解:
http://down.tiansha.net/20050901/tiansha.net-ytwgcr.rar
http://down4.tiansha.net/20050901/ti…net-ytwgcr.rar

24.天音网管 V5.612 绿色特别版
软件类型: 绿色软件/特别软件
软件语言: 简体中文
运行环境: Win9X/WinME/NT/Win2000/WinXP/Win2003/
软件大小: 320 KB
整理时间: 2005-11-27 9:51:03
下载次数: 本日:12 本周:12 本月:99 总计:127
软件简介:  
本软件为一简单易用功能强大的网管类软件,是学校机房,网吧,以及家长们的管理工具。主要功能包括定时关机,禁用一些非健康的程序,屏蔽不良网站,隐藏硬盘以及屏幕监控等功能。按CTRL+S或者CTRL+H可以实现界面的显示或者隐藏,程序中默认的密码为空。

http://www.orsoon.com/Software/Catalog99/328.html

25.网络执法官 2.88 企业破解版
软件语言: 简体中文
软件类型: 国产软件 / 免费版
运行环境: Win9X/Me/WinNT/2000/XP
授权方式: 免费版
软件大小: 2.28MB
整理时间: 2005-07-03
软件简介:
“网络执法官”是一款局域网管理辅助软件,采用网络底层协议,能穿透各客户端防火墙对网络中的每一台主机(本文中主机指各种计算机、交换机等配有IP的网络设备)进行监控;采用网卡号(MAC)识别用户,可靠性高;软件本身占用网络资源少,对网络没有不良影响。
软件不需运行于指定的服务器,在网内任一台主机上运行即可有效监控所有本机连接到的网络(支持多网段监控),主要功能如下:
一、 实时记录上线用户并存档备查
网络中任一台主机,开机即会被本软件实时检测并记录其网卡号、所用的IP、上线时间、下线时间等信息,该信息自动永久保存,可供查询,查询可依各种条件进行,并支持模糊查询。利用此功能,管理员随时可以知道当前或以前任一时刻任一台主机是否开机、开机多长时间,使用的是哪一个IP、主机名等重要信息;或任一台主机的开机历史。
二、 自动侦测未登记主机接入并报警
管理员登记完或软件自动检测到所有合法的主机后,可在软件中作出设定,拒绝所有未登记的主机接入网络。一旦有未登记主机接入,软件会自动将其MAC、IP、主机名、上下线时段等信息作永久记录,并可采用声音、向指定主机发消息等多种方式报警,还可以根据管理员的设定,自动对该主机采取IP冲突、与关键主机隔离、与网络中所有其它主机隔离等控制措施。
三、 限定各主机的IP,防止IP盗用
管理员可对每台主机指定一个IP或一段IP,当该主机采用超出范围的IP时,软件会判定其为\"非法用户\",自动采用管理员事先指定的方式对其进行控制,并将其MAC、IP、主机名作记久记录备查。管理员可事先指定对非法用户实行IP冲突、与关键主机隔离、与其它所有主机隔离等管理方式。
四、 限定各主机的连接时段
管理员可指定每台主机在每天中允许与网络连接的时段或不允许与网络连接的时段(可指定两个时段,如允许每天8:30-12:00和13:30-17:00与网络连接),并可指定每一用户是否被允许在每个周六、周日与网络连接。对违反规定的用户,软件判其为非法用户,自动记录并采用管理员事先指定的方式进行管理。管理方式同样可为IP冲突、与关键主机隔离、与其它所有主机隔离等。
总之,本软件的主要功能是依据管理员为各主机限定的权限,实时监控整个局域网,并自动对非法用户进行管理,可将非法用户与网络中某些主机或整个网络隔离,而且无论局域网中的主机运行何种防火墙,都不能逃避监控,也不会引发防火墙警告,提高了网络安全性。管理员只需依据实际情况,设置各主机的权限及违反权限后的管理方式,即可实现某些具体的功能,如禁止某些主机在指定的时段访问外网或彻底禁止某些主机访问外网;保护网络中关键主机,只允许指定的主机访问等等。

http://www.okget.com/Soft/Soft_1115.htm

26.海天屏幕广播 2.20
软件大小:224KB
软件语言:简体中文
软件类别:国产软件 / 破解版 / 电子教室
运行环境:Win9x/NT/2000/XP/
软件更新:2005-9-28 9:15:21
页面刷新:2005-9-28 9:44:00
下载次数:128
软件介绍:
海天屏幕广播软件是将局域网内一台电脑的屏幕画面广播到其他电脑上的软件.海天屏幕广播软件采用虚拟显示驱动,实时性好,CPU占用低,在局域网内能取得很好的效果。可以直接广播视频画面。本软件为绿色软件,仅服务端需要安装一个虚拟显示驱动程序,无需设置,操作简单。可应用于学校,企事业单位教学,培训,演示等场合
海天屏幕广播软件采用虚拟显示驱动
实时性好,CPU占用低
在局域网内能取得很好的效果
可以直接广播视频画面
本软件为绿色软件
仅服务端需要安装一个虚拟显示驱动程序
服务端先运行driver\setup.exe安装驱动程序
在安装时会黑屏2秒,此为正常现象
服务端运行HTServer.exe
客户端运行HTClient.exe
运行注册机得到注册码。去最后的那一位。就是真正的注册码。
然后注册成功。

海天屏幕广播 2.20:
http://www2.piaodown.com/down/down.asp?id=20606&no=1
海天屏幕广播 2.20 绿色特别版:
http://www2.piaodown.com/down/down.asp?id=20606&no=2
海天屏幕广播 2.1 破解补丁:
http://www2.piaodown.com/down/down.asp?id=20606&no=3

27.局域网地址检测器 1.60
软件语言: 简体中文
软件类型: 国产软件 / 免费版
运行环境: Win9X/Me/WinNT/2000/XP
授权方式: 免费版
软件大小: 228KB
整理时间: 2005-12-24
软件简介: 使用本软件您可以快速的查找局域网中正在使用的IP地址和空闲的IP地址,并可以知道正在使用IP的计算机对应的网卡MAC地址(物理地址)。即便是对方装有防火墙,也可以准确得到对方的MAC地址(即可以穿透防火墙)。
  
所以本软件适用于网吧管理员、计算机房管理员管理所有的计算机的IP分配情况,并可以查看是否有人私自更改IP地址。(绿色软件、无须安装、免费软件,欢迎使用)

http://www.okget.com/Soft/Soft_2790.htm

2006年07月08日

Autocad常用快捷键

 

A、绘图工具
直线(l)、参照线(xl)、多线(ml)、多段线(pl)、多边形(pol)、矩形(rec)、弧(a)、圆(c)、样条曲线(spl)、椭圆(el)、插入块(i)、点(po)、图案填充(h)、面域(reg)、多行文字(t)
B、修改工具
删除(e)、复制对象(co)、镜像(mi)、偏移(o)、阵列(ar)、移动(m)、旋转(ro)、比例(sc)、拉伸(s)、拉长(len)、剪切(tr)、延伸(ex)、断(br)、倒角(cha)、圆角(f)、分解(x)

F1: 获取帮助                            

F2: 实现做图窗和文本窗口的切换          

F3: 控制是否实现对象自动捕捉            

F5: 等轴测平面切换       

F7: 栅格显示模式控制                   

F9: 栅格捕捉模式控制                    

F10:极轴模式控制

F11:对象追踪式控制      

D:尺寸资源管理器

G:对象组合

Ctrl+B:栅格捕捉模式控制                

Ctrl+C:将选择的对象复制到剪切板上            

Ctrl+F:控制是否实现对象自动捕捉         

Ctrl+G:栅格显示模式控制                

Ctrl+K:超级链接                         

Ctrl+N:新建图形文件                     

OP:打开选项对话框                      

AA:测量区域和周长                      

U:恢复上一次操做

AL:对齐                                 

AR:阵列                                 

P:移动

W:定义块

V:设置当前坐标

SE:打开相对自动捕捉对话框    Z:缩放

ST:打开字体设置对话框            SO:绘制二围面

SP:拼音的校核                          SC:缩放比例

SN:栅格捕捉模式设置               DT:文本的设置

DI:测量两点间的距离                 OI:插入外部相对

Ctrl+1:打开特性对话框        Ctrl+2:打开图象资源管理器

Ctrl+6:打开图象数据原于     Ctrl+0:打开图象文件

Ctrl+P:打开打印对话框         Ctrl+S:保存文件

Ctrl+E:极轴模式控制             Ctrl+V:粘贴剪贴板上的内容

Ctrl+W:对象追踪式控制         Ctrl+X:剪切所选择的内容

Ctrl+Y:重做                           

 

AutoCAD中常用的快捷键
1、系统配制:
SH, *SHELL 访问操作系统;
LI, *LIST 列出对象的数据库信息;
LS, *DBLIST 列出图形中每个对象的数据库信息;
UN, *UNITS 设置坐标和角度的显示格式和精度(设置图形单位);
TIME, *TIME 显示图形的时间信息;
SAT *SAVETIME 设置自动保存时间(分钟); %%D 度
OP,PR, *OPTIONS 修改CAD环境变量(config); %%P 正负号
GR, *DDGRIPS 自定义AUTOCAD设置; %%C 直径符号
MLO, *MENULOAD 菜单自定义;
TO, *TOOLBAR 显示、隐藏和自定义工具栏;
DWG, *DWGPROPS * 设置和显示当前图形的属性;
EDM, *EDGEMODE 设定边界模式(0为必须要相交;1为延伸相交);
MIT *MIRRTEXT 设定文字镜像(0为反像;1为同像)
Z, *ZOOM 图形缩放;
P, *PAN 界面适时拖动;
-P, *-PAN 界面移动(在命令行输入移动的尺寸);
AV, *DSVIEWER 打开"鸟瞰视图"窗口;
DS, *DSETTINGS 捕捉设置;
OS, *OSNAP (对象捕捉)草图设置;
SN, *SNAP 规定光标按指定的间距移动;
SE, *DSETTINGS 指定捕捉模式、栅格、极坐标和对象捕捉追踪的设置;
LA, *LAYER 图层管理器;
-LA, *-LAYER 图层管理器(命令行);
IM, *IMAGE 图像管理器;
-IM, *-IMAGE 图像管理器(命令行方式);
LM, *LIMITS 设置并控制图形边界和网格显示;
ADC, *ADCENTER * AutoCAD 设计中心; CTRL+2
CH, *PROPERTIES * 对象特性(控制现有对象的特性); CTRL+1
SP, *SPELL 检查图形中文字的拼写;
DBC, *DBCONNECT 数据库接连;
BO, *BOUNDARY 边界创建;
-BO, *-BOUNDARY 手动创建边界;
TA, *TABLET 校准、配制、打开和关闭已安装的数字化仪;
SCR, *SCRIPT 运行脚本;
IMP, *IMPORT 向AUTOCAD输入文件;
IO, *INSERTOBJ 插入链接或嵌入对象;
K, *OPEN 打开现有的图形文件;
-V, *-VIEW 保存和恢复已命名的视图(显示命令行提示);
*TEXTFILL 控制打印和渲染时 TrueType 字体的填充方式(0,空心;1,实心);
*MTEXTED 来指定编辑器来选择使用替换编辑器的系统变量;
*QTEXTMODE 控制图中所有文字对象的显示(0,正常;1,空的矩形框);
*PICKFIRST 控制在发出命令之前(先选择后执行)还是之后选择对象;
*PICKSTYLE 启用和关闭对象编组;
*GRIPS 选择对象时,控制夹点是否显示;
*PICKAUTO 控制选择窗口的显示;
*IMAGEFRAME 控制插入的光栅图像的边框显示;(如关闭则不可选)
*IMAGECLIP 剪裁图像;

QS, *QSAVE 快速保存图形;
V, *VIEW 保存和恢复已命名的视图;
EXP, *EXPORT 以其它文件格式保存对象;
*CLOSE 关闭当前图形;
AP, *APPLOAD **** 加载/卸载应用程序;
ADI *ATTDISP 显示属性值命令;
ADE, *ATTDEF (数) 创建对象的属性;
-ATT, *-ATTDEF 在命令行手动创建对象的属性;
DAT, *DDATTE
ATE, *ATTEDIT 改变属性信息;
-ATE,ATTE *-ATTEDIT 在命令行手动改变属性信息;
EXIT, *QUIT 退出CAD程序;
FI, *FILTER 创建可重复使用的过滤器以便根据特性选择对象;(图层过滤器)
G, *GROUP 创建对象的命名选择集;
-G, *-GROUP 手动命令行创建对象的命名选择集;
HI, *HIDE 消除隐藏线或重生成三维模型时不显示隐藏线;
DV, *DVIEW 定义平行投影或透视图;
LO, *LAYOUT 创建新布局,重命名、复制、保存或删除现有布局;
PRE, *PREVIEW 显示打印图形的效果;
PI, *PLOT 显示"打印"对话框;

2、文字、点、线的定义及绘制:
L, *LINE 绘直线;
LT, *LINETYPE 线型管理器;
LTS, *LTSCALE 设置线型比例因子;
LW, *LWEIGHT 设置当前线宽、线宽显示选项和线宽单位;
XL, *XLINE 绘构造线;
YL, *RAY * 创建射线;
PL, *PLINE 绘多段线;
PE, *PEDIT 改动线条或弧线为多线;
LE, *LEADER 创建引线;
QLE, *QLEADER * 快速创建引线;
ML, *MLINE 绘多重平行线;
MLS, *MLSTYLE 定义多重平行线的样式;
MLE, *MLEDIT 编辑多重平行线;
SPL, *SPLINE 创建二次或三次 (NURBS) 样条曲线;
SPE, *SPLINEDIT 编辑样条曲线对象;
3P, *3DPOLY 在三维空间中使用"连续"线型创建由直线段组成的多段线;
ST, *STYLE 文字样式;(将大字体改为小字体可纠正乱码)
DT, *DTEXT 创建多行文本;
PO, *POINT 创建点对象;
PT, *DDPTYPE 点样式设置;
T,MT, *MTEXT 创建多行文本;
-T, *-MTEXT 在命令行创建多行文体

3、其它图形的绘制:
POL, *POLYGON 创建闭合的等边多边形;
CO, *CIRCLE 创建圆;
DO, *DONUT 绘制圆环;
TOR, *TORUS 创建圆环实体;
A, *ARC 画圆弧;
EL, *ELLIPSE 创建椭圆或椭圆弧;
3A, *3DARRAY 创建三维阵列;
B, *BLOCK 制作块;
-B, *-BLOCK 命令行手动制作块;
3DO, *3DORBIT 三维动态观察器;FF
3F, *3DFACE 创建三维面;
IN, *INTERSECT 创建多个实体或面域的交集复合实体或面域;
INF, *INTERFERE 用多个三维实体的公用部份创建三维复合实体;
SO, *SOLID 创建二维填充多边形;(1和4、2和3为对角关系)
EXT, *EXTRUDE **** 通过拉伸现有二维对象来创建三维原型;
ARR, *ARRAY 创建按指定方式排列的多重对象副本;

4、标注及其设置:
D, DST *DIMSTYLE 标注样式管理器;
DOR, *DIMORDINATE 创建坐标点标注;
DOV, *DIMOVERRIDE 替代标注系统变量(不影响当前标注样式);
DLI, *DIMLINEAR 创建线性尺寸标注;
DBA, *DIMBASELINE 从上一个标注处创建筑线性、角度或坐标标注;
DCO, *DIMCONTINUE 从上一个标注的第二尺寸界线处创建线性、角度或坐标标注;
DCE, *DIMCENTER 创建圆或圆弧的中心线或圆心标记;
DAL, *DIMALIGNED 创建对齐线性标注(斜向);
DDI, *DIMDIAMETER 创建圆和圆弧的直径标注;
DRA, *DIMRADIUS 创建圆和圆弧的半径标注;
DAN, *DIMANGULAR * 创建角度标注;
DED, *DIMEDIT 移动和旋转标注文字;
TOL, *TOLERANCE 创建形位公差标注;

5、常用编辑及修改:
CHG, *CHANGE 修改现有对象的特性;
EV, *ELEV *** 指定系统的默认标高和默认厚度;
DR, *DRAWORDER ** 修改图像和其它对象的显示顺序;
M, *MOVE 在指定方向上按指定的距离移动对象;
MA, *MATCHPROP 把某一对象的特性复制给其它若干对象(格式印);
I, *INSERT 将命名块或图形插入到当前图形中;
-I, *-INSERT 将命名块或图形插入到当前图形中
AA, *AREA 计算对象或指定区域的面积和周长;
DIV, *DIVIDE 将点对象或块对象沿对象的长度或周长等间隔的排列(按段来分);
ME, *MEASURE 将点对象或块按指定的间距放置(按距离分);
DI, *DIST 测量两点之间的距离和角度;
ED, *DDEDIT 编辑属性定义;
COL, *COLOR 颜色属性;
C, CP *COPY 拷贝;
FD, *FIND 查找和替换;
ADC, *ADCENTER "查找" 对话框;
E, *ERASE 删除;
RO,RR *ROTATE 绕基点移动对象(旋转);
SC, *SCALE * 按比例缩放对象;
S, *STRETCH * 移动或拉伸对象;
LEN, *LENGTHEN 拉长对象;
EX,EE *EXTEND 延伸对象到另一对象;
TR, *TRIM 用其它对象定义的剪切边修剪对象;
F, *FILLET 给对象的边加圆角;
CC, *CHAMFER 给对象的边加倒角(设距离为0时可做延伸或截断直线用);
BR, *BREAK 打断对象;
X, *EXPLODE 将组合对象分解为对象组件(炸弹);
MI, *MIRROR 镜像;
O, *OFFSET 偏移;
H, BH *BHATCH 边界图案填充;
-H, *HATCH 边界图案填充(手动);
HE, *HATCHEDIT 修改现有的图案填充对象(填充编辑);
REN, *RENAME 修改对象名;
SU, *SUBTRACT 用差集创建组合面域或实体;
REG, *REGION 从现有对象的选择集中创建面域对象;
TH, *THICKNESS 设置当前三维实体的厚度;
TI, *TILEMODE 使"模型"选项卡或最后一个布局选项卡当前化;
W, *WBLOCK 将块对象写入新图形文件;
GN, *ALIGN * 在二维和三维空间中将某对象与其它对象对齐;(对齐)

6、不常用编辑及修改:

SEC, *SECTION 用培切平面和实体截交创建面域;
SET, *SETVAR 列出系统变量并修改变量值;
SL, *SLICE 用平面培切一组实体;
REV, *REVOLVE 绕轴旋转二维对象以创建实体;
RPR, *RPREF 设置渲染系统配置;
REE, *RENDER 创建三维线框或实体模型的具有真实感的渲染图像;
R, *REDRAW 刷新显示当前视图;
RA, *REDRAWALL 刷新显示所有视图
RE, *REGEN 重新生成图形并刷新显示当前视图;
REA, *REGENALL 重新生成图形并刷新所有视图;
PU, *PURGE * 删除图形数据库中没有使用的命名对象,例如块或图层;(可减肥)

MS, *MSPACE 从图纸空间切换到模型空间视图;
PS, *PSPACE 从模型空间视图切换到图纸空间;
MV, *MVIEW 创建浮动视图和打开现有的浮动视图;
PA, *PASTESPEC 插入剪贴板数据并控制数据格式(选择性粘贴);
IAD, *IMAGEADJUST 调整图像亮度、对比度和褪色度;
IAT, *IMAGEATTACH 向当前图形中附着新的图像对像;
ICL, *IMAGECLIP * 为图像对象创建新剪裁边界;
UC, *DDUCS 管理已定义的用户坐标系(同UCSMAN);
UCP, *DDUCSP 管理已定义的用户坐标系(同UCSMAN);
UNI, *UNION 通过并运算创建组合面域或实体;
VP, *DDVPOINT 设置三维观察方向;
-VP, *VPOINT *** 设置图形的三维直观图和查看方向;

WE, *WEDGE 创建三维实体使其倾斜面尖端沿X轴正向;
XA, *XATTACH 将外部参照附着到当前图形中;
XB, *XBIND 将外部参照依赖符号绑定到图形中;
-XB, *-XBIND 在命令行将外部参照依赖符号绑定到图形中;
XC, *XCLIP 定义外部参照或块剪裁边界,并且设置前裁面和后剪裁面;
XR, *XREF 控制图形中的外部参照;
-XR, *-XREF 命令行控制图形中的外部参照;

补充命令:
SD, *SDI 控制CAD运行于单个还是多个图形界面;
U, *UNDO 放弃命令的效果;
RED, *REDO 恢复前一个所放弃执行的效果;
*COPYHIST AutoCAD将文本复制到剪贴板;
*FILEDIA 禁止显示文件对话框(0不显示;1显示);
*ANGBASE 设置相对当前的USC的0度基准角方向;
*ANGDIR 设置相对当前的USC以0度为超点的正角度方向;
*AUNITS 设置角度单位;
*AUPREC 设置所有只读角度单位和可编辑角度单位的小数位位数;
*LUNITS 设置线性单位;
*LUPREC 设置所有只读线性单位和可编辑线性单位的小数位位数;
SKE, *SKETCH 绘制徒手画;
SKT, *SKETCHINC 设置徒手画线段的尺寸;
SKP, *SKPOLY * 确定徒手画线的线型(0为直线,1为多段线);
*FILL 控制多线、线宽、二维填充、所有图案填充和宽多段线的填充;
*FILLMODE 指定多线、宽线、二维填充、所有图案填充(包括实体填充)和宽多段线是否被填充(0,不填充对象;1,填充对象)

*CAL 计算算术和几何表达式的值(一种联机几何计算器);
UCS, *UCSICON * 控制窗口UCS坐标的可见和位置;
*ID * 查询点坐标;
BL *BLIPMODE * 控制点标记的显示;(0关闭点标记模式;1打开点标记模式;)
QT, *QTEXT * 控制文字和属性对象的显示和打印;
*PLINEGEN * 设置如何围绕二维多段线的顶点生成线型图案。这并不适用于具有锥状线段的多段线;
(0,在每个顶点以点划线结束生成多段线;1,围绕多段线顶点生成连续的线型图案;)
*LWDISPLAY * 控制图形中的线宽显示;(0,不显示线宽;1,显示线宽;)
*SELECT * 选择对象集(配合WP来使用;WP窗口多边形选择;
用R可以从选定的对象中排除一部份不要的对象)
*ID 显示位置坐标;
*STATUS 显示图形统计信息、模式及范围;
MSL, *MSLIDE 创建幻灯片;
VSL, *VSLIDE 在当前视口中显示图像幻灯片文件;
CD *CMDDIA 控制PLOT命令和ASE命令的对话框显示;(1,显示对话框)

2006年04月07日



信息来源:黑白网络

软件破解常用汇编指令

cmpa,b //比较a与b
mova,b //把b值送给a值,使a=b
ret//返回主程序
nop//无作用,英文(no operation)简写,意思“do nothing”(机器码90)
 (ultraedit打开编辑exe文件看到90相当汇编语句的nop)
call //调用子程序,子程序以ret结尾
je或jz //相等则跳(机器码是74或84)
jne或jnz //不相等则跳(机器码是75或85)
jmp//无条件跳(机器码是EB)
jb //若小于则跳
ja //若大于则跳
jg //若大于则跳
jge//若大于等于则跳
jl //若小于则跳
pop xxx//xxx出栈
push xxx //xxx压栈

 爆破无敌口诀

 一条(跳)就死,九筒(90)就胡
 (对应上面的2–修改为nop)
 一条(跳)就胡,一饼(EB)伺候
 (对应上面的1–修改为jmp)
 (74) 变(75)
 (84) 变 (85)
大家不懂不要紧,一定要先牢记,以后慢慢的理解。


作者:orchid88 来自:exetools中文社区

本人破解的软件不下30套,平均每套所需时间2个小时(特难的除外)。总结经验如下,供大家参考:
1、先查壳,有壳则脱壳。
2、查明是何种语言编程,如果是vc,建议用ida反编译后导出map文件;如果是dephi,建议用dede反编译后导出Map文件;如果是vb,建议用ida反编译后,用上vb的idc标签可以完全识别vb的函数,再导出map文件。
3、动态分析用od,用Mapconv插件导入上一步导出的map文件,这样在动态跟踪时你就省了许多时间,不用跟踪到系统和编程语言常用函数中去。而且程序功能一目了然。
4、如果是查找字符串,建议再用wasm反编译,用它找对应的字符串调用程序段很方便。

ps:其他人的补充
1.用GODUP插件可以直接应用ida签名了,可以节省转换步骤。
2.
谢了。一语惊醒梦中人,我一直都没想到要转成map文件来用的

另外,不知大侠是否知道如何在OllyDbg中利用微软的 dbg/pdb 文件?
3.是的,我最近也改用godup插件,转换速度比mapconv快多了。
4.你说的工具mapconv哪里能找到?你能写一篇教程吗?用你自己的方法
5.你用过ida吗?里面有个导出map文件的功能。Dede也有导出map文件的功能。你可以用GODUP插件导入到od中。
6.看了老兄的说明,才知道原来Olly Dump 能够导入MAP文件:)

汇编语言和CPU以及内存,端口等硬件知识是连在一起的. 这也是为什么汇编语言没有通用性的原因. 下面简单讲讲基本知识(针对INTEL x86及其兼容机)
  ============================
  x86汇编语言的指令,其操作对象是CPU上的寄存器,系统内存,或者立即数. 有些指令表面上没有操作数, 或者看上去缺少操作数, 其实该指令有内定的操作对象, 比如push指令, 一定是对SS:ESP指定的内存操作, 而cdq的操作对象一定是eax / edx.

  在汇编语言中,寄存器用名字来访问. CPU 寄存器有好几类, 分别有不同的用处:

  1. 通用寄存器:
  EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP(这个虽然通用,但很少被用做除了堆栈指针外的用途)
  
  这些32位可以被用作多种用途,但每一个都有"专长". EAX 是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器. EBX 是"基地址"(base)寄存器, 在内存寻址时存放基地址. ECX 是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器. EDX是…(忘了..哈哈)但它总是被用来放整数除法产生的余数. 这4个寄存器的低16位可以被单独访问,分别用AX,BX,CX和DX. AX又可以单独访问低8位(AL)和高8位(AH), BX,CX,DX也类似. 函数的返回值经常被放在EAX中.
  
  ESI/EDI分别叫做"源/目标索引寄存器"(source/destination index),因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串.

  EBP是"基址指针"(BASE POINTER), 它最经常被用作高级语言函数调用的"框架指针"(frame pointer). 在破解的时候,经常可以看见一个标准的函数起始代码:
  
  push ebp ;保存当前ebp
  mov ebp,esp ;EBP设为当前堆栈指针
  sub esp, xxx ;预留xxx字节给函数临时变量.
  …
  
  这样一来,EBP 构成了该函数的一个框架, 在EBP上方分别是原来的EBP, 返回地址和参数. EBP下方则是临时变量. 函数返回时作 mov esp,ebp/pop ebp/ret 即可.
  
  ESP 专门用作堆栈指针.
  
  2. 段寄存器:
  CS(Code Segment,代码段) 指定当前执行的代码段. EIP (Instruction pointer, 指令指针)则指向该段中一个具体的指令. CS:EIP指向哪个指令, CPU 就执行它. 一般只能用jmp, ret, jnz, call 等指令来改变程序流程,而不能直接对它们赋值.
  DS(DATA SEGMENT, 数据段) 指定一个数据段. 注意:在当前的计算机系统中, 代码和数据没有本质差别, 都是一串二进制数, 区别只在于你如何用它. 例如, CS 制定的段总是被用作代码, 一般不能通过CS指定的地址去修改该段. 然而,你可以为同一个段申请一个数据段描述符"别名"而通过DS来访问/修改. 自修改代码的程序常如此做.
  ES,FS,GS 是辅助的段寄存器, 指定附加的数据段.
  SS(STACK SEGMENT)指定当前堆栈段. ESP 则指出该段中当前的堆栈顶. 所有push/pop 系列指令都只对SS:ESP指出的地址进行操作.
  
  3. 标志寄存器(EFLAGS):

  该寄存器有32位,组合了各个系统标志. EFLAGS一般不作为整体访问, 而只对单一的标志位感兴趣. 常用的标志有:
  
  进位标志C(CARRY), 在加法产生进位或减法有借位时置1, 否则为0.
  零标志Z(ZERO), 若运算结果为0则置1, 否则为0
  符号位S(SIGN), 若运算结果的最高位置1, 则该位也置1.
  溢出标志O(OVERFLOW), 若(带符号)运算结果超出可表示范围, 则置1.
  
  JXX 系列指令就是根据这些标志来决定是否要跳转, 从而实现条件分枝. 要注意,很多JXX 指令是等价的, 对应相同的机器码. 例如, JE 和JZ 是一样的,都是当Z=1是跳转. 只有JMP 是无条件跳转. JXX 指令分为两组, 分别用于无符号操作和带符号操作. JXX 后面的"XX" 有如下字母:
  
  无符号操作: 带符号操作:
  A = "ABOVE", 表示"高于" G = "GREATER", 表示"大于"
  B = "BELOW", 表示"低于" L = "LESS", 表示"小于"
  C = "CARRY", 表示"进位"或"借位" O = "OVERFLOW", 表示"溢出"
  S = "SIGN", 表示"负"
  通用符号:
  E = "EQUAL" 表示"等于", 等价于Z (ZERO)
  N = "NOT" 表示"非", 即标志没有置位. 如JNZ "如果Z没有置位则跳转"
  Z = "ZERO", 与E同.
  
  如果仔细想一想,就会发现 JA = JNBE, JAE = JNB, JBE = JNA, JG = JNLE, JGE= JNL, JL= JNGE, ….
  
  4. 端口

  端口是直接和外部设备通讯的地方。外设接入系统后,系统就会把外设的数据接口映射到特定的端口地址空间,这样,从该端口读入数据就是从外设读入数据,而向外设写入数据就是向端口写入数据。当然这一切都必须遵循外设的工作方式。端口的地址空间与内存地址空间无关,系统总共提供对64K个8位端口的访问,编号0-65535. 相邻的8位端口可以组成成一个16位端口,相邻的16位端口可以组成一个32位端口。端口输入输出由指令IN,OUT,INS和OUTS实现,具体可参考汇编语言书籍。

汇编指令的操作数可以是内存中的数据, 如何让程序从内存中正确取得所需要的数据就是对内存的寻址。

  INTEL 的CPU 可以工作在两种寻址模式:实模式和保护模式。 前者已经过时,就不讲了, WINDOWS 现在是32位保护模式的系统, PE 文件就基本是运行在一个32位线性地址空间, 所以这里就只介绍32位线性空间的寻址方式。

  其实线性地址的概念是很直观的, 就想象一系列字节排成一长队,第一个字节编号为0, 第二个编号位1, 。。。。 一直到4294967295(十六进制FFFFFFFF,这是32位二进制数所能表达的最大值了)。 这已经有4GB的容量! 足够容纳一个程序所有的代码和数据。 当然, 这并不表示你的机器有那么多内存。 物理内存的管理和分配是很复杂的内容, 初学者不必在意, 总之, 从程序本身的角度看, 就好象是在那么大的内存中。

  在INTEL系统中, 内存地址总是由"段选择符:有效地址"的方式给出。段选择符(SELECTOR)存放在某一个段寄存器中, 有效地址则可由不同的方式给出。 段选择符通过检索段描述符确定段的起始地址, 长度(又称段限制), 粒度, 存取权限, 访问性质等。 先不用深究这些, 只要知道段选择符可以确定段的性质就行了。 一旦由选择符确定了段, 有效地址相对于段的基地址开始算。 比如由选择符1A7选择的数据段, 其基地址是400000, 把1A7 装入DS中, 就确定使用该数据段。 DS:0 就指向线性地址400000。 DS:1F5278 就指向线性地址5E5278。 我们在一般情况下, 看不到也不需要看到段的起始地址, 只需要关心在该段中的有效地址就行了。 在32位系统中, 有效地址也是由32位数字表示, 就是说, 只要有一个段就足以涵盖4GB线性地址空间, 为什么还要有不同的段选择符呢? 正如前面所说的, 这是为了对数据进行不同性质的访问。 非法的访问将产生异常中断, 而这正是保护模式的核心内容, 是构造优先级和多任务系统的基础。 这里有涉及到很多深层的东西, 初学者先可不必理会。

  有效地址的计算方式是: 基址+间址*比例因子+偏移量。 这些量都是指段内的相对于段起始地址的量度, 和段的起始地址没有关系。 比如, 基址=100000, 间址=400, 比例因子=4, 偏移量=20000, 则有效地址为:

  100000+400*4+20000=100000+1000+20000=121000。 对应的线性地址是400000+121000=521000。 (注意, 都是十六进制数)。

  基址可以放在任何32位通用寄存器中, 间址也可以放在除ESP外的任何一个通用寄存器中。 比例因子可以是1, 2, 4 或8。 偏移量是立即数。 如: [EBP+EDX*8+200]就是一个有效的有效地址表达式。 当然, 多数情况下用不着这么复杂, 间址,比例因子和偏移量不一定要出现。

  内存的基本单位是字节(BYTE)。 每个字节是8个二进制位, 所以每个字节能表示的最大的数是11111111, 即十进制的255。 一般来说, 用十六进制比较方便, 因为每4个二进制位刚好等于1个十六进制位, 11111111b = 0xFF。 内存中的字节是连续存放的, 两个字节构成一个字(WORD), 两个字构成一个双字(DWORD)。 在INTEL架构中, 采用small endian格式, 即在内存中,高位字节在低位字节后面。 举例说明:十六进制数803E7D0C, 每两位是一个字节, 在内存中的形式是: 0C 7D 3E 80。 在32位寄存器中则是正常形式,如在EAX就是803E7D0C。 当我们的形式地址指向这个数的时候,实际上是指向第一个字节,即0C。 我们可以指定访问长度是字节, 字或者双字。 假设DS:[EDX]指向第一个字节0C:

  mov AL, byte ptr DS:[EDX] ;把字节0C存入AL
  mov AX, word ptr DS:[EDX] ;把字7D0C存入AX
  mov EAX, dword ptr DS:[EDX] ;把双字803E7D0C存入EAX

  在段的属性中,有一个就是缺省访问宽度。如果缺省访问宽度为双字(在32位系统中经常如此),那么要进行字节或字的访问,就必须用byte/word ptr显式地指明。

  缺省段选择:如果指令中只有作为段内偏移的有效地址,而没有指明在哪一个段里的时候,有如下规则:

  如果用ebp和esp作为基址或间址,则认为是在SS确定的段中;
  其他情况,都认为是在DS确定的段中。

  如果想打破这个规则,就必须使用段超越前缀。举例如下:

  mov eax, dword ptr [edx] ;缺省使用DS,把DS:[EDX]指向的双字送入eax
  mov ebx, dword ptr ES:[EDX] ;使用ES:段超越前缀,把ES:[EDX]指向的双字送入ebx

  堆栈:

  堆栈是一种数据结构,严格地应该叫做“栈”。“堆”是另一种类似但不同的结构。SS 和 ESP 是INTEL对栈这种数据结构的硬件支持。push/pop指令是专门针对栈结构的特定操作。SS指定一个段为栈段,ESP则指出当前的栈顶。push xxx 指令作如下操作:

  把ESP的值减去4;
  把xxx存入SS:[ESP]指向的内存单元。

  这样,esp的值减小了4,并且SS:[ESP]指向新压入的xxx。 所以栈是“倒着长”的,从高地址向低地址方向扩展。pop yyy 指令做相反的操作,把SS:[ESP]指向的双字送到yyy指定的寄存器或内存单元,然后把esp的值加上4。这时,认为该值已被弹出,不再在栈上了,因为它虽然还暂时存在在原来的栈顶位置,但下一个push操作就会把它覆盖。因此,在栈段中地址低于esp的内存单元中的数据均被认为是未定义的。

  最后,有一个要注意的事实是,汇编语言是面向机器的,指令和机器码基本上是一一对应的,所以它们的实现取决于硬件。有些看似合理的指令实际上是不存在的,比如:

  mov DS:[edx], ds:[ecx] ;内存单元之间不能直接传送
  mov DS, 1A7 ;段寄存器不能直接由立即数赋值
  mov EIP, 3D4E7 ;不能对指令指针直接操作。
“汇编语言”作为一门语言,对应于高级语言的编译器,我们需要一个“汇编器”来把汇编语言原文件汇编成机器可执行的代码。高级的汇编器如MASM, TASM等等为我们写汇编程序提供了很多类似于高级语言的特征,比如结构化、抽象等。在这样的环境中编写的汇编程序,有很大一部分是面向汇编器的伪指令,已经类同于高级语言。现在的汇编环境已经如此高级,即使全部用汇编语言来编写windows的应用程序也是可行的,但这不是汇编语言的长处。汇编语言的长处在于编写高效且需要对机器硬件精确控制的程序。而且我想这里的人学习汇编的目的多半是为了在破解时看懂反汇编代码,很少有人真的要拿汇编语言编程序吧?(汗……)

  好了,言归正传。大多数汇编语言书都是面向汇编语言编程的,我的帖是面向机器和反汇编的,希望能起到相辅相成的作用。有了前面两篇的基础,汇编语言书上对大多数指令的介绍应该能够看懂、理解了。这里再讲一讲一些常见而操作比较复杂的指令。我这里讲的都是机器的硬指令,不针对任何汇编器。

  无条件转移指令jmp:

  这种跳转指令有三种方式:短(short),近(near)和远(far)。短是指要跳至的目标地址与当前地址前后相差不超过128字节。近是指跳转的目标地址与当前地址在用一个段内,即CS的值不变,只改变EIP的值。远指跳到另一个代码段去执行,CS/EIP都要改变。短和近在编码上有所不同,在汇编指令中一般很少显式指定,只要写 jmp 目标地址,几乎任何汇编器都会根据目标地址的距离采用适当的编码。远转移在32位系统中很少见到,原因前面已经讲过,由于有足够的线性空间,一个程序很少需要两个代码段,就连用到的系统模块也被映射到同一个地址空间。

  jmp的操作数自然是目标地址,这个指令支持直接寻址和间接寻址。间接寻址又可分为寄存器间接寻址和内存间接寻址。举例如下(32位系统):

  jmp 8E347D60 ;直接寻址段内跳转
  jmp EBX ;寄存器间接寻址:只能段内跳转
  jmp dword ptr [EBX] ;内存间接寻址,段内跳转
  jmp dword ptr [00903DEC] ;同上
  jmp fward ptr [00903DF0] ;内存间接寻址,段间跳转

  解释:
  在32位系统中,完整目标地址由16位段选择子和32位偏移量组成。因为寄存器的宽度是32位,因此寄存器间接寻址只能给出32位偏移量,所以只能是段内近转移。在内存间接寻址时,指令后面是方括号内的有效地址,在这个地址上存放跳转的目标地址。比如,在[00903DEC]处有如下数据:7C 82 59 00 A7 01 85 65 9F 01

  内存字节是连续存放的,如何确定取多少作为目标地址呢?dword ptr 指明该有效地址指明的是双字,所以取
  0059827C作段内跳转。反之,fward ptr 指明后面的有效地址是指向48位完全地址,所以取19F:658501A7 做远跳转。

  注意:在保护模式下,如果段间转移涉及优先级的变化,则有一系列复杂的保护检查,现在可不加理会。将来等各位功力提升以后可以自己去学习。

  条件转移指令jxx:只能作段内转移,且只支持直接寻址。

  =========================================
  调用指令CALL:

  Call的寻址方式与jmp基本相同,但为了从子程序返回,该指令在跳转以前会把紧接着它的下一条指令的地址压进堆栈。如果是段内调用(目标地址是32位偏移量),则压入的也只是一个偏移量。如果是段间调用(目标地址是48位全地址),则也压入下一条指令的完全地址。同样,如果段间转移涉及优先级的变化,则有一系列复杂的保护检查。

  与之对应retn/retf指令则从子程序返回。它从堆栈上取得返回地址(是call指令压进去的)并跳到该地址执行。retn取32位偏移量作段内返回,retf取48位全地址作段间返回。retn/f 还可以跟一个立即数作为操作数,该数实际上是从堆栈上传给子程序的参数的个数(以字计)返回后自动把堆栈指针esp加上指定的数*2,从而丢弃堆栈中的参数。这里具体的细节留待下一篇讲述。

  虽然call和ret设计为一起工作,但它们之间没有必然的联系。就是说,如果你直接用push指令向堆栈中压入一个数,然后执行ret,他同样会把你压入的数作为返回地址,而跳到那里去执行。这种非正常的流程转移可以被用作反跟踪手段。

 中断指令INT n

  在保护模式下,这个指令必定会被操作系统截获。在一般的PE程序中,这个指令已经不太见到了,而在DOS时代,中断是调用操作系统和BIOS的重要途径。现在的程序可以文质彬彬地用名字来调用windows功能,如 call user32!getwindowtexta。从程序角度看,INT指令把当前的标志寄存器先压入堆栈,然后把下一条指令的完全地址也压入堆栈,最后根据操作数n来检索“中断描述符表”,试图转移到相应的中断服务程序去执行。通常,中断服务程序都是操作系统的核心代码,必然会涉及到优先级转换和保护性检查、堆栈切换等等,细节可以看一些高级的教程。

  与之相应的中断返回指令IRET做相反的操作。它从堆栈上取得返回地址,并用来设置CS:EIP,然后从堆栈中弹出标志寄存器。注意,堆栈上的标志寄存器值可能已经被中断服务程序所改变,通常是进位标志C, 用来表示功能是否正常完成。同样的,IRET也不一定非要和INT指令对应,你可以自己在堆栈上压入标志和地址,然后执行IRET来实现流程转移。实际上,多任务操作系统常用此伎俩来实现任务转换。

  广义的中断是一个很大的话题,有兴趣可以去查阅系统设计的书籍。

  ============================================
  装入全指针指令LDS,LES,LFS,LGS,LSS

  这些指令有两个操作数。第一个是一个通用寄存器,第二个操作数是一个有效地址。指令从该地址取得48位全指针,将选择符装入相应的段寄存器,而将32位偏移量装入指定的通用寄存器。注意在内存中,指针的存放形式总是32位偏移量在前面,16位选择符在后面。装入指针以后,就可以用DS:[ESI]这样的形式来访问指针指向的数据了。

  ============================================
  字符串操作指令

  这里包括CMPS,SCAS,LODS,STOS,MOVS,INS和OUTS等。这些指令有一个共同的特点,就是没有显式的操作数,而由硬件规定使用DS:[ESI]指向源字符串,用ES:[EDI]指向目的字符串,用AL/AX/EAX做暂存。这是硬件规定的,所以在使用这些指令之前一定要设好相应的指针。
  这里每一个指令都有3种宽度形式,如CMPSB(字节比较)、CMPSW(字比较)、CMPSD(双字比较)等。
  CMPSB:比较源字符串和目标字符串的第一个字符。若相等则Z标志置1。若不等则Z标志置0。指令执行完后,ESI 和EDI都自动加1,指向源/目标串的下一个字符。如果用CMPSW,则比较一个字,ESI/EDI自动加2以指向下一个字。
  如果用CMPSD,则比较一个双字,ESI/EDI自动加4以指向下一个双字。(在这一点上这些指令都一样,不再赘述)
  SCAB/W/D 把AL/AX/EAX中的数值与目标串中的一个字符/字/双字比较。
  LODSB/W/D 把源字符串中的一个字符/字/双字送入AL/AX/EAX
  STOSB/W/D 把AL/AX/EAX中的直送入目标字符串中
  MOVSB/W/D 把源字符串中的字符/字/双字复制到目标字符串
  INSB/W/D 从指定的端口读入字符/字/双字到目标字符串中,端口号码由DX寄存器指定。
  OUTSB/W/D 把源字符串中的字符/字/双字送到指定的端口,端口号码由DX寄存器指定。

  串操作指令经常和重复前缀REP和循环指令LOOP结合使用以完成对整个字符串的操作。而REP前缀和LOOP指令都有硬件规定用ECX做循环计数器。举例:

  LDS ESI,SRC_STR_PTR
  LES EDI,DST_STR_PTR
  MOV ECX,200
  REP MOVSD

  上面的代码从SRC_STR拷贝200个双字到DST_STR. 细节是:REP前缀先检查ECX是否为0,若否则执行一次MOVSD,ECX自动减1,然后执行第二轮检查、执行……直到发现ECX=0便不再执行MOVSD,结束重复而执行下面的指令。


  LDS ESI,SRC_STR_PTR
  MOV ECX,100
  LOOP1:
  LODSW
  …. (deal with value in AX)

  LOOP LOOP1
  …..

  从SRC_STR处理100个字。同样,LOOP指令先判断ECX是否为零,来决定是否循环。每循环一轮ECX自动减1。

  REP和LOOP 都可以加上条件,变成REPZ/REPNZ 和 LOOPZ/LOOPNZ. 这是除了ECX外,还用检查零标志Z. REPZ 和LOOPZ在Z为1时继续循环,否则退出循环,即使ECX不为0。REPNZ/LOOPNZ则相反。
 高级语言程序的汇编解析

  在高级语言中,如C和PASCAL等等,我们不再直接对硬件资源进行操作,而是面向于问题的解决,这主要体现在数据抽象化和程序的结构化。例如我们用变量名来存取数据,而不再关心这个数据究竟在内存的什么地方。这样,对硬件资源的使用方式完全交给了编译器去处理。不过,一些基本的规则还是存在的,而且大多数编译器都遵循一些规范,这使得我们在阅读反汇编代码的时候日子好过一点。这里主要讲讲汇编代码中一些和高级语言对应的地方。

  1. 普通变量。通常声明的变量是存放在内存中的。编译器把变量名和一个内存地址联系起来(这里要注意的是,所谓的“确定的地址”是对编译器而言在编译阶段算出的一个临时的地址。在连接成可执行文件并加载到内存中执行的时候要进行重定位等一系列调整,才生成一个实时的内存地址,不过这并不影响程序的逻辑,所以先不必太在意这些细节,只要知道所有的函数名字和变量名字都对应一个内存的地址就行了),所以变量名在汇编代码中就表现为一个有效地址,就是放在方括号中的操作数。例如,在C文件中声明:

  int my_age;

  这个整型的变量就存在一个特定的内存位置。语句 my_age= 32; 在反汇编代码中可能表现为:

  mov word ptr [007E85DA], 20

  所以在方括号中的有效地址对应的是变量名。又如:

  char my_name[11] = "lianzi2000";

  这样的说明也确定了一个地址,对应于my_name. 假设地址是007E85DC,则内存中[007E85DC]=’l',[007E85DD]=’i', etc. 对my_name的访问也就是对这地址处的数据访问。

  指针变量其本身也同样对应一个地址,因为它本身也是一个变量。如:

  char *your_name;

  这时也确定变量"your_name"对应一个内存地址,假设为007E85F0. 语句your_name=my_name;很可能表现为:

  mov [007E85F0], 007E85DC ;your_name的内容是my_name的地址。

  2. 寄存器变量

  在C和C++中允许说明寄存器变量。register int i; 指明i是寄存器存放的整型变量。通常,编译器都把寄存器变量放在esi和edi中。寄存器是在cpu内部的结构,对它的访问要比内存快得多,所以把频繁使用的变量放在寄存器中可以提高程序执行速度。

  3. 数组

  不管是多少维的数组,在内存中总是把所有的元素都连续存放,所以在内存中总是一维的。例如,int i_array[2][3]; 在内存确定了一个地址,从该地址开始的12个字节用来存贮该数组的元素。所以变量名i_array对应着该数组的起始地址,也即是指向数组的第一个元素。存放的顺序一般是i_array[0][0],[0][1],[0][2],[1][0],[1][1],[1][2] 即最右边的下标变化最快。当需要访问某个元素时,程序就会从多维索引值换算成一维索引,如访问i_array[1][1],换算成内存中的一维索引值就是1*3+1=4.这种换算可能在编译的时候就可以确定,也可能要到运行时才可以确定。无论如何,如果我们把i_array对应的地址装入一个通用寄存器作为基址,则对数组元素的访问就是一个计算有效地址的问题:

  ; i_array[1][1]=0×16

  lea ebx,xxxxxxxx ;i_array 对应的地址装入ebx
  mov edx,04 ;访问i_array[1][1],编译时就已经确定
  mov word ptr [ebx+edx*2], 16 ;

  当然,取决于不同的编译器和程序上下文,具体实现可能不同,但这种基本的形式是确定的。从这里也可以看到比例因子的作用(还记得比例因子的取值为1,2,4或8吗?),因为在目前的系统中简单变量总是占据1,2,4或者8个字节的长度,所以比例因子的存在为在内存中的查表操作提供了极大方便。

  4. 结构和对象

  结构和对象的成员在内存中也都连续存放,但有时为了在字边界或双字边界对齐,可能有些微调整,所以要确定对象的大小应该用sizeof操作符而不应该把成员的大小相加来计算。当我们声明一个结构变量或初始化一个对象时,这个结构变量和对象的名字也对应一个内存地址。举例说明:

  struct tag_info_struct
  {
  int age;
  int sex;
  float height;
  float weight;
  } marry;

  变量marry就对应一个内存地址。在这个地址开始,有足够多的字节(sizeof(marry))容纳所有的成员。每一个成员则对应一个相对于这个地址的偏移量。这里假设此结构中所有的成员都连续存放,则age的相对地址为0,sex为2, height 为4,weight为8。

  ; marry.sex=0;

  lea ebx,xxxxxxxx ;marry 对应的内存地址
  mov word ptr [ebx+2], 0
  ……

  对象的情况基本相同。注意成员函数具体的实现在代码段中,在对象中存放的是一个指向该函数的指针。

 5. 函数调用

  一个函数在被定义时,也确定一个内存地址对应于函数名字。如:

  long comb(int m, int n)
  {
  long temp;
  …..

  return temp;
  }

  这样,函数comb就对应一个内存地址。对它的调用表现为:

  CALL xxxxxxxx ;comb对应的地址。这个函数需要两个整型参数,就通过堆栈来传递:

  ;lresult=comb(2,3);

  push 3
  push 2
  call xxxxxxxx
  mov dword ptr [yyyyyyyy], eax ;yyyyyyyy是长整型变量lresult的地址

  这里请注意两点。第一,在C语言中,参数的压栈顺序是和参数顺序相反的,即后面的参数先压栈,所以先执行push 3. 第二,在我们讨论的32位系统中,如果不指明参数类型,缺省的情况就是压入32位双字。因此,两个push指令总共压入了两个双字,即8个字节的数据。然后执行call指令。call 指令又把返回地址,即下一条指令(mov dword ptr….)的32位地址压入,然后跳转到xxxxxxxx去执行。

  在comb子程序入口处(xxxxxxxx),堆栈的状态是这样的:

  03000000 (请回忆small endian 格式)
  02000000
  yyyyyyyy <–ESP 指向返回地址

  前面讲过,子程序的标准起始代码是这样的:

  push ebp ;保存原先的ebp
  mov ebp, esp;建立框架指针
  sub esp, XXX;给临时变量预留空间
  …..

  执行push ebp之后,堆栈如下:

  03000000
  02000000
  yyyyyyyy
  old ebp <—- esp 指向原来的ebp

  执行mov ebp,esp之后,ebp 和esp 都指向原来的ebp. 然后sub esp, xxx 给临时变量留空间。这里,只有一个临时变量temp,是一个长整数,需要4个字节,所以xxx=4。这样就建立了这个子程序的框架:

  03000000
  02000000
  yyyyyyyy
  old ebp <—- 当前ebp指向这里
  temp

  所以子程序可以用[ebp+8]取得第一参数(m),用[ebp+C]来取得第二参数(n),以此类推。临时变量则都在ebp下面,如这里的temp就对应于[ebp-4].

  子程序执行到最后,要返回temp的值:

  mov eax,[ebp-04]
  然后执行相反的操作以撤销框架:

  mov esp,ebp ;这时esp 和ebp都指向old ebp,临时变量已经被撤销
  pop ebp ;撤销框架指针,恢复原ebp.

  这是esp指向返回地址。紧接的retn指令返回主程序:

  retn 4

  该指令从堆栈弹出返回地址装入EIP,从而返回到主程序去执行call后面的指令。同时调整esp(esp=esp+4*2),从而撤销参数,使堆栈恢复到调用子程序以前的状态,这就是堆栈的平衡。调用子程序前后总是应该维持堆栈的平衡。从这里也可以看到,临时变量temp已经随着子程序的返回而消失,所以试图返回一个指向临时变量的指针是非法的。

  为了更好地支持高级语言,INTEL还提供了指令Enter 和Leave 来自动完成框架的建立和撤销。Enter 接受两个操作数,第一个指明给临时变量预留的字节数,第二个是子程序嵌套调用层数,一般都为0。enter xxx,0 相当于:

  push ebp
  mov ebp,esp
  sub esp,xxx

  leave 则相当于:

  mov esp,ebp
  pop ebp

  =============================================================
  好啦,我的学习心得讲完了,谢谢各位的抬举。教程是不敢当的,因为我也是个大菜鸟。如果这些东东能使你们的学习轻松一些,进步快一些,本菜鸟就很开心了。



2006年04月05日

【破解作者】 clide2000[DFCG][OCN]
【使用工具】 OD1.10;C32Asm
【破解平台】 win2000
【软件名称】 Exe Password
【下载地址】
http://www.salfeld.com/prg/exepw04.exe
【软件简介】 一个可以给EXE文件加密码的工具
【软件大小】 1.15M
【加壳方式】 无壳
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
——————————————————————————–
【破解内容】


一个偶然机会看到了这个软件,发现她是一个标准的重启验证类的程序,很适合初学者做练习。
我先来说说,重启验证类软件大致的验证过程。
1、运行软件输入注册信息,点注册后。一般软件会提示你重新运行软件,以便验证注册信息的正确性(如FlashGet);
也有的只在你输入正确的注册信息时才有这个提示,不然会告诉你输入的注册信息有问题(此软件就属这类)

2、要破解这种软件,首先是判断一下她把注册信息存在哪里(因为她重启验证时要用)。大致有两种存放方式,第一种是放在注册表里;第二种是放在文件里。(我们可以在输入注册信息,点击确定前,利用监视类软件来查看一下,如FileMon和RegShot等)

3、知道她的注册信息的存放地点后,就可以选则相应的API断点,来调试了

访问注册表类常用API
RegOpenKeyA 打开一个现有的注册表项
RegOpenKeyExA 打开一个现有的注册表项
RegCreateKeyA 在指定的项下创建或打开一个项
RegCreateKeyExA 在指定项下创建新项的更复杂的方式
RegDeleteKeyA 删除现有项下方一个指定的子项
RegDeleteValueA 删除指定项下方的一个值
RegQueryValueA 获取一个项的设置值
RegQueryValueExA 获取一个项的设置值
RegSetValueA 设置指定项或子项的值
RegSetValueExA 设置指定项的值
RegCloseKey 关闭系统注册表中的一个项(或键)

访问文件类常用API
CreateFileA 打开和创建文件、管道、邮槽、通信服务、设备以及控制台
OpenFile 这个函数能执行大量不同的文件操作
ReadFile 从文件中读出数据
ReadFileEx 与ReadFile相似,只是它只能用于异步读操作,并包含了一个完整的回调


好了,下面我们开工。
第一步,让软件保存我们输入的注册信息,并判断出其保存位置
1、首先用PEID检查,无壳。
2、运行软件,输入注册信息,用户名:clide 注册码:12345678

结果出现“Please enter a name with at least 6 characters!"的错误提示,意思是说用户名须大于6位。好,用C32Asm载入此程序,在字符串信息里找到关于"Please enter a name with at least 6 characters!"这个的调用
结果如下:
Please enter a name with at least 6 characters!
::005511D2->MOV EAX,551508
3、下面我们关闭软件,并用OD载入,然后Ctrl+G,输入上面的调用地址5511D2,回车,来到5511D2一行,并向上看看,找到跳转处,注意加****的这行



00551196 . E8 B933EBFF CALL ExePW.00404554
0055119B . 83F8 06 CMP EAX,6 *******这里判断输入的用户名的倍数是否大于6
0055119E . 7F 4F JG SHORT ExePW.005511EF 诺大于,这里会跳。(上次输入clide时,这里就没跳)
005511A0 . 833D CC775600>CMP DWORD PTR DS:[5677CC],0
005511A7 . 75 15 JNZ SHORT ExePW.005511BE
005511A9 . 6A 00 PUSH 0 ; /Arg1 = 00000000
005511AB . 66:8B0D 80135>MOV CX,WORD PTR DS:[551380] ; |
005511B2 . 33D2 XOR EDX,EDX ; |
005511B4 . B8 CC145500 MOV EAX,ExePW.005514CC ; |ASCII "Geben Sie mindestens einen 6-stelligen Namen ein !"
005511B9 . E8 964AEEFF CALL ExePW.00435C54 ; \ExePW.00435C54
005511BE > 833D CC775600>CMP DWORD PTR DS:[5677CC],1
005511C5 . 75 15 JNZ SHORT ExePW.005511DC
005511C7 . 6A 00 PUSH 0 ; /Arg1 = 00000000
005511C9 . 66:8B0D 80135>MOV CX,WORD PTR DS:[551380] ; |
005511D0 . 33D2 XOR EDX,EDX ; |
005511D2 . B8 08155500 MOV EAX,ExePW.00551508 ; |ASCII "Please enter a name with at least 6 characters!"
005511D7 . E8 784AEEFF CALL ExePW.00435C54 ; \ExePW.00435C54
005511DC > 8B83 6C030000 MOV EAX,DWORD PTR DS:[EBX+36C]
005511E2 . 8B10 MOV EDX,DWORD PTR DS:[EAX]
005511E4 . FF92 C4000000 CALL DWORD PTR DS:[EDX+C4]
005511EA . E9 68010000 JMP ExePW.00551357
005511EF > 8D55 F4 LEA EDX,DWORD PTR SS:[EBP-C]
005511F2 . 8B83 70030000 MOV EAX,DWORD PTR DS:[EBX+370]
005511F8 . E8 1BB1EFFF CALL ExePW.0044C318


好,这次我们直接在0055119E JG SHORT ExePW.005511EF这句目标地址下断,在005511EF这行按F2下断,然后F9运行软件

这次我们输入信息时,用户名:clide2000 注册码:12345678 输入完毕后,点击注册按钮
会中断在005511EF,此时,我们用F8一步步走下去,会发现0055121A JE ExePW.0055130D这句会跳转,而且是直接跳向的出错窗口

005511EF > \8D55 F4 LEA EDX,DWORD PTR SS:[EBP-C]
005511F2 . 8B83 70030000 MOV EAX,DWORD PTR DS:[EBX+370]
005511F8 . E8 1BB1EFFF CALL ExePW.0044C318
005511FD . 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
00551200 . 50 PUSH EAX
00551201 . 8D55 F0 LEA EDX,DWORD PTR SS:[EBP-10]
00551204 . 8B83 6C030000 MOV EAX,DWORD PTR DS:[EBX+36C]
0055120A . E8 09B1EFFF CALL ExePW.0044C318
0055120F . 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
00551212 . 5A POP EDX
00551213 . E8 8CA9FFFF CALL ExePW.0054BBA4
00551218 . 84C0 TEST AL,AL
0055121A . 0F84 ED000000 JE ExePW.0055130D
00551220 . 33C0 XOR EAX,EAX
00551222 . 55 PUSH EBP
00551223 . 68 EF125500 PUSH ExePW.005512EF
00551228 . 64:FF30 PUSH DWORD PTR FS:[EAX]
0055122B . 64:8920 MOV DWORD PTR FS:[EAX],ESP
0055122E . B2 01 MOV DL,1
00551230 . A1 9CB44300 MOV EAX,DWORD PTR DS:[43B49C]
00551235 . E8 62A3EEFF CALL ExePW.0043B59C
0055123A . 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
0055123D . BA 02000080 MOV EDX,80000002
00551242 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00551245 . E8 2EA4EEFF CALL ExePW.0043B678
0055124A . B1 01 MOV CL,1
0055124C . BA 40155500 MOV EDX,ExePW.00551540 ; ASCII "Software\Salfeld\Exelock"
00551251 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00551254 . E8 87A4EEFF CALL ExePW.0043B6E0
00551259 . 8D55 EC LEA EDX,DWORD PTR SS:[EBP-14]
0055125C . 8B83 6C030000 MOV EAX,DWORD PTR DS:[EBX+36C]
00551262 . E8 B1B0EFFF CALL ExePW.0044C318
00551267 . 8B4D EC MOV ECX,DWORD PTR SS:[EBP-14]
0055126A . BA 64155500 MOV EDX,ExePW.00551564 ; ASCII "User"
0055126F . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00551272 . E8 9DA9EEFF CALL ExePW.0043BC14
00551277 . 8D55 E8 LEA EDX,DWORD PTR SS:[EBP-18]
0055127A . 8B83 70030000 MOV EAX,DWORD PTR DS:[EBX+370]
00551280 . E8 93B0EFFF CALL ExePW.0044C318
00551285 . 8B4D E8 MOV ECX,DWORD PTR SS:[EBP-18]
00551288 . BA 74155500 MOV EDX,ExePW.00551574 ; ASCII "ID"
0055128D . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00551290 . E8 7FA9EEFF CALL ExePW.0043BC14
00551295 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00551298 . E8 6722EBFF CALL ExePW.00403504
0055129D . 833D CC775600>CMP DWORD PTR DS:[5677CC],0
005512A4 . 75 15 JNZ SHORT ExePW.005512BB
005512A6 . 6A 00 PUSH 0 ; /Arg1 = 00000000
005512A8 . 66:8B0D 80135>MOV CX,WORD PTR DS:[551380] ; |
005512AF . B2 02 MOV DL,2 ; |
005512B1 . B8 80155500 MOV EAX,ExePW.00551580 ; |ASCII "Programm wurde erfolgreich in Vollversion verwandelt.
Bitte Programm neu starten."
005512B6 . E8 9949EEFF CALL ExePW.00435C54 ; \ExePW.00435C54
005512BB > 833D CC775600>CMP DWORD PTR DS:[5677CC],1
005512C2 . 75 15 JNZ SHORT ExePW.005512D9
005512C4 . 6A 00 PUSH 0 ; /Arg1 = 00000000
005512C6 . 66:8B0D 80135>MOV CX,WORD PTR DS:[551380] ; |
005512CD . B2 02 MOV DL,2 ; |
005512CF . B8 DC155500 MOV EAX,ExePW.005515DC ; |ASCII "Programm was successfully registered.
Please restart this program now."
005512D4 . E8 7B49EEFF CALL ExePW.00435C54 ; \ExePW.00435C54
005512D9 > A1 D4375600 MOV EAX,DWORD PTR DS:[5637D4]
005512DE . 8B00 MOV EAX,DWORD PTR DS:[EAX]
005512E0 . E8 F7AEF1FF CALL ExePW.0046C1DC
005512E5 . 33C0 XOR EAX,EAX
005512E7 . 5A POP EDX
005512E8 . 59 POP ECX
005512E9 . 59 POP ECX
005512EA . 64:8910 MOV DWORD PTR FS:[EAX],EDX
005512ED . EB 68 JMP SHORT ExePW.00551357
005512EF .^ E9 F026EBFF JMP ExePW.004039E4
005512F4 . B8 2C165500 MOV EAX,ExePW.0055162C ; ASCII "Error writing licence information to registry.
Please contact developer:
support@salfeld.com"
005512F9 . E8 4E4AEEFF CALL ExePW.00435D4C
005512FE . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00551301 . E8 FE21EBFF CALL ExePW.00403504
00551306 . E8 412AEBFF CALL ExePW.00403D4C
0055130B . EB 4A JMP SHORT ExePW.00551357
0055130D > 833D CC775600>CMP DWORD PTR DS:[5677CC],0
00551314 . 75 15 JNZ SHORT ExePW.0055132B
00551316 . 6A 00 PUSH 0 ; /Arg1 = 00000000
00551318 . 66:8B0D 80135>MOV CX,WORD PTR DS:[551380] ; |
0055131F . 33D2 XOR EDX,EDX ; |
00551321 . B8 94165500 MOV EAX,ExePW.00551694 ; |ASCII "Die eingegebene Seriennummer ist falsch."
00551326 . E8 2949EEFF CALL ExePW.00435C54 ; \ExePW.00435C54
0055132B > 833D CC775600>CMP DWORD PTR DS:[5677CC],1
00551332 . 75 15 JNZ SHORT ExePW.00551349
00551334 . 6A 00 PUSH 0 ; /Arg1 = 00000000
00551336 . 66:8B0D 80135>MOV CX,WORD PTR DS:[551380] ; |
0055133D . 33D2 XOR EDX,EDX ; |
0055133F . B8 C8165500 MOV EAX,ExePW.005516C8 ; |ASCII "Sorry, wrong serial number."
00551344 . E8 0B49EEFF CALL ExePW.00435C54 ; \ExePW.00435C54
00551349 > 8B83 6C030000 MOV EAX,DWORD PTR DS:[EBX+36C]
0055134F . 8B10 MOV EDX,DWORD PTR DS:[EAX]
00551351 . FF92 C4000000 CALL DWORD PTR DS:[EDX+C4]
00551357 > 33C0 XOR EAX,EAX
00551359 . 5A POP EDX
0055135A . 59 POP ECX
0055135B . 59 POP ECX
0055135C . 64:8910 MOV DWORD PTR FS:[EAX],EDX
0055135F . 68 79135500 PUSH ExePW.00551379
00551364 > 8D45 E8 LEA EAX,DWORD PTR SS:[EBP-18]
00551367 . BA 05000000 MOV EDX,5
0055136C . E8 472FEBFF CALL ExePW.004042B8
00551371 . C3 RETN


好,现在我们在软件的错误提示窗口Sorry, wrong serial number.里点击OK后。再次点击注册按钮,以便再次中断在005511EF
这次,当我们走到0055121A JE ExePW.0055130D,把它nop掉,不让她跳转(在这行上按空格,直接在新窗口里输入NOP即可)。
然后,我们F8继续往下走.

当我们看到下面的提示后,可以断定她已经把我们输入的注册信息放进注册表了(所以也省去用监视工具的麻烦了)

; ASCII "Software\Salfeld\Exelock"
; ASCII "User"
; ASCII "ID"

而执行到|ASCII "Programm was successfully registered.
Please restart this program now."这里时,程序提示我们要重新运行,当我们在软件介面点OK后,反回到OD中,直接按F9,程序已自动退出了。



第二步,根据上面分析得到的结果,确定API断点
好了,既然我们已经知道软件把注册信息放在注册表里,那我们就用RegOpenKeyExA 打开一个现有的注册表项 来试试吧。
具体操作:
1、Ctrl+F2使OD重新加载该软件
2、在命令行下bp RegOpenKeyExA,并回车(注册字母的大小)
3、F9运行,此时注意观察堆栈的提示,以确定在什么时候读取保存的注册信息了
当按下F9后,第一次中断时堆栈的内容如下:

0012F8E8 00405E03 /CALL to RegOpenKeyExA from ExePW.00405DFE
0012F8EC 80000001 |hKey = HKEY_CURRENT_USER
0012F8F0 00405FF4 |Subkey = "Software\Borland\Locales" ;看这里,这里要访问的路径
0012F8F4 00000000 |Reserved = 0
0012F8F8 000F0019 |Access = KEY_QUERY_VALUE|KEY_ENUMERATE_SUB_KEYS|KEY_NOTIFY|F0000
0012F8FC 0012FA20 \pHandle = 0012FA20

4、我们继续一下一下的按F9,当Sukey="Software\Salfeld\Exelock"时停下(因为此时离读取注册信息已不远了)

即看到堆栈出现下面的内容时,就要停止按F9了
0012F17C 0043B875 /CALL to RegOpenKeyExA from ExePW.0043B870
0012F180 80000002 |hKey = HKEY_LOCAL_MACHINE
0012F184 0054D9E4 |Subkey = "Software\Salfeld\Exelock"
0012F188 00000000 |Reserved = 0
0012F18C 00020019 |Access = KEY_READ
0012F190 0012F1AC \pHandle = 0012F1AC

5、现在我们在命令行里下BC RegOpenKeyExA来清除断点,然后Ctrl+f9返回到(需要返回到程序的领空):
0043B875 |. 85C0 TEST EAX,EAX
0043B877 |. 0F9445 FF SETE BYTE PTR SS:[EBP-1]
0043B87B |. 807D FF 00 CMP BYTE PTR SS:[EBP-1],0
0043B87F |. 74 3C JE SHORT ExePW.0043B8BD
0043B881 |. C746 18 19000>MOV DWORD PTR DS:[ESI+18],2001>
0043B888 |. 837E 04 00 CMP DWORD PTR DS:[ESI+4],0
0043B88C |. 0F95C0 SETNE AL

6、再次Ctrl+f9,这次返回到:
0043B9A5 . 8A45 FF MOV AL,BYTE PTR SS:[EBP-1]
0043B9A8 . 5E POP ESI
0043B9A9 . 5B POP EBX
0043B9AA . 8BE5 MOV ESP,EBP
0043B9AC . 5D POP EBP
0043B9AD . C3 RETN
7、当再次Ctrl+f9时,会返回到0054D19B这一行:
0054D18E . BA E4D95400 MOV EDX,ExePW.0054D9E4 ; ASCII "Software\Salfeld\Exelock"
0054D193 . 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
0054D196 . E8 69E6EEFF CALL ExePW.0043B804
0054D19B . 8D4D E4 LEA ECX,DWORD PTR SS:[EBP-1C]
0054D19E . BA 08DA5400 MOV EDX,ExePW.0054DA08 ; ASCII "User"
0054D1A3 . 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
0054D1A6 . E8 95EAEEFF CALL ExePW.0043BC40
0054D1AB . 8D4D E0 LEA ECX,DWORD PTR SS:[EBP-20]
0054D1AE . BA 18DA5400 MOV EDX,ExePW.0054DA18 ; ASCII "ID"
0054D1B3 . 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
0054D1B6 . E8 85EAEEFF CALL ExePW.0043BC40

8、现在开始我们要仔细分析了(但到底按多少次Ctrl+f9才能返回程序领空,这个我就说不太清楚了,我自己觉昨只能靠经难了。记得原来用SoftIce时,有当前所处的进程的提示可以参考,但在OD里我没找到。诺有其它方法,希望多多指教)

让我们来仔细看看加#############的部分吧
0054D19B . 8D4D E4 LEA ECX,DWORD PTR SS:[EBP-1C]
0054D19E . BA 08DA5400 MOV EDX,ExePW.0054DA08 ; ASCII "User"
0054D1A3 . 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
0054D1A6 . E8 95EAEEFF CALL ExePW.0043BC40
0054D1AB . 8D4D E0 LEA ECX,DWORD PTR SS:[EBP-20]
0054D1AE . BA 18DA5400 MOV EDX,ExePW.0054DA18 ; ASCII "ID"
0054D1B3 . 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
0054D1B6 . E8 85EAEEFF CALL ExePW.0043BC40
0054D1BB . 8B55 E0 MOV EDX,DWORD PTR SS:[EBP-20]
0054D1BE . B8 DC775600 MOV EAX,ExePW.005677DC
0054D1C3 . E8 2071EBFF CALL ExePW.004042E8
0054D1C8 . 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
0054D1CB . E8 3463EBFF CALL ExePW.00403504
0054D1D0 . 33C0 XOR EAX,EAX
0054D1D2 . 5A POP EDX
0054D1D3 . 59 POP ECX
0054D1D4 . 59 POP ECX
0054D1D5 . 64:8910 MOV DWORD PTR FS:[EAX],EDX
0054D1D8 . EB 12 JMP SHORT ExePW.0054D1EC
0054D1DA .^ E9 0568EBFF JMP ExePW.004039E4
0054D1DF . 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
0054D1E2 . E8 1D63EBFF CALL ExePW.00403504
0054D1E7 . E8 606BEBFF CALL ExePW.00403D4C
0054D1EC > E8 EB600000 CALL ExePW.005532DC
0054D1F1 . 3C 01 CMP AL,1
0054D1F3 . 75 68 JNZ SHORT ExePW.0054D25D
0054D1F5 . 833D CC775600>CMP DWORD PTR DS:[5677CC],0
0054D1FC . 75 28 JNZ SHORT ExePW.0054D226
0054D1FE . 8D45 EC LEA EAX,DWORD PTR SS:[EBP-14] ################################
0054D201 . BA 24DA5400 MOV EDX,ExePW.0054DA24 ; ASCII "Unregistrierte Testversion"
0054D206 . E8 2171EBFF CALL ExePW.0040432C
0054D20B . 8D45 DC LEA EAX,DWORD PTR SS:[EBP-24]
0054D20E . 8B4D EC MOV ECX,DWORD PTR SS:[EBP-14]
0054D211 . BA 48DA5400 MOV EDX,ExePW.0054DA48 ; ASCII "EXE Passwort / "
0054D216 . E8 8573EBFF CALL ExePW.004045A0
0054D21B . 8B55 DC MOV EDX,DWORD PTR SS:[EBP-24]
0054D21E . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0054D221 . E8 22F1EFFF CALL ExePW.0044C348
0054D226 > 833D CC775600>CMP DWORD PTR DS:[5677CC],1
0054D22D . 0F85 A6000000 JNZ ExePW.0054D2D9
0054D233 . 8D45 EC LEA EAX,DWORD PTR SS:[EBP-14] ##############################
0054D236 . BA 60DA5400 MOV EDX,ExePW.0054DA60 ; ASCII "Unregistered Trial Version"
0054D23B . E8 EC70EBFF CALL ExePW.0040432C
0054D240 . 8D45 D8 LEA EAX,DWORD PTR SS:[EBP-28]
0054D243 . 8B4D EC MOV ECX,DWORD PTR SS:[EBP-14]
0054D246 . BA 84DA5400 MOV EDX,ExePW.0054DA84 ; ASCII "EXE Password / "
0054D24B . E8 5073EBFF CALL ExePW.004045A0
0054D250 . 8B55 D8 MOV EDX,DWORD PTR SS:[EBP-28]



我们从加################的ASCII提示部分可以猜测到,这部分是在软件未注册时才会执行到的地方,为验证我们的猜测是正确的,可在程序执行到0054D1F3 JNZ SHORT ExePW.0054D25D时使其强行跳转看看
结果如我们所料,软件启动已经显示是注册版了。


——————————————————————————–
【破解总结】
爆破修改:
方法一:
0055121A JE ExePW.0055130D 改成 NOP
0054D1F3 JNZ SHORT ExePW.0054D25D 改成 JMP
做上面两处修改后就可以了
其实,只要把0054D1F3 JNZ 改成JMP就已经是注册版了,但问题是诺此时注册表里没有注册信息。软件里也不有用户名的。
诺想要用任意注册名都可以注册,需要跟进0054D1EC > E8 EB600000 CALL ExePW.005532DC
在里面,你会看到一个很熟悉的跳转:
00553357 . 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
0055335A . 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
0055335D . E8 4288FFFF CALL ExePW.0054BBA4
00553362 . 84C0 TEST AL,AL
00553364 . 74 15 JE SHORT ExePW.0055337B ; 就是这里
00553366 . C645 FF 00 MOV BYTE PTR SS:[EBP-1],0

方法二:
0055121A JE ExePW.0055130D 改成 NOP
00553364 JE SHORT ExePW.0055337B 改成 NOP
这样就可以在注册时输入任意用户名和密码注册了(但记得用户名位数要大于6位啊,这里没我们可没有改过)

关于重启时验证的软件,主要是确定注册信息的保存位置,然后再确定对就的API断点调试就可以了

OllyDbg知识专题

 

作者:未知    文章来源:本站原创    点击数:     更新时间:2005-9-1    

 

一点一滴的积累,也就会了.

之所以选择ollydbg

1.
我的oswinXP,无法使用trw2000,softice装了多次均未成功,还蓝屏死机多次.郁闷.

2.
友好的gui界面,不像softice.可以边干活边听歌,不像softice,把整个os都挂起了.多用两次,连时间都不知道了.

3.
强大的内存查看功能,再不用什么-d,而且跳转方便,!一目了然.

4.
强大的右键菜单功能

ollydbg
的界面:

菜单:

文件:
    1.
其中包括该菜单的下部有上次打开的纪录,该纪录保存有上次未清除的断点.
    2.
附加.对付那些Anti-Debug程序.先运行程序,再运行od,文件–>附加.
查看:
    1.
执行模块(Alt+E),查看程序使用的动态链接库
    2.
查看断点.Alt+B
调试:
    1.
运行(F9)加载程序后,运行!
    2.
暂停(F12)
    3.
单步进入(F7)遇见CALL进入!进入该子程序.
    4.
单步跳过(F8)遇见CALL不进去!
    5.
执行到返回(ALT+F9)就是执行到该子程的返回语句

ollydbg
16进制编辑功能.类似与hiew,hex workshop

查看–>文件

二进制文件编辑功能.查看–>文件,打开的文件是二进制显示.选中要改变的机器指令,空格,修改,右击–>保存.

ollydbg
的四个区域

左上角是cpu窗口,分别是地址,机器码,汇编代码,注释;注释添加方便,而且还能即时显示函数的调用结果,返回值.
右上角是寄存器窗口,但不仅仅反映寄存器的状况,还有好多东东;双击即可改变Eflag的值,对于寄存器,指令执行后发生改变的寄存器会用红色显示.
cpu
窗口下面还有一个小窗口,显示当前操作改变的寄存器状态.  不错;
左下角是内存窗口.可以ascii或者unicode两种方式显示内存信息;
右下角的是当前堆栈情况,还有注释啊.

F3
选择打开程序.

使用

F9
执行程序.

下断点:

1.
对函数下下断点

在代码区右击–>搜索–>当前模块中的名称(ctrl+N),在跳出来的对话框中选择需要下的断点函数.->右击->查找导入参考(enter),F2下断点.如果有多个地方调用了该函数就这样操作。

2.
在需要的地方下断点  F2

添加注释:

在代码区第四列,右击–>注释

查看内存地址

右击内存地址列–>前往–>输入要查看的内存地址

在函数lstrlen的注释的上方,有一个变量string,当执行到该函数的时候,string后面会出现lstrlen函数的参数字符串.在实际使用中一般是输入的字符串.(很好用哦)

类似的还有lstrcmp,上面有string1,string2能够显示将要比较的两个字符串.

另外,一般在执行getwindowtext等函数后,右边寄存器列,eax会显示函数的返回值,即取到的内容.同时内存中也会有显示.

在反汇编中选中一条命令,如果其中有用到内存中的地址,右击–>在转存中跟随–>直接常数
此时内存地址会显示指令中引用到的内存字符

拷贝功能十分强大.直接选择要拷贝的内容.右击–>复制–>文件or剪贴板

ollydbg
的条件断点可以按寄存器,存储器,消息(必须是消息的数字,如wm_command就是111)等等设断,非常强大,一旦设了之后记录到文件中,下次restart程序还能用,不用拿笔记,很方便。

显示跳转路进:
选项–>调试设置–>cpu–>显示跳转的方向,显示跳转的路径,如果跳转没有实现则显示灰色路径。在cpu窗口中,机器码的前面显示">"符号.同时,cpu窗口下的小缝中会显示跳转路径,从何跳转而来.右击–>前往一般都是条件跳转,上面的内容就是比较的地方啦。:)

跟踪功能:
选项–>调试跟踪–>跟踪:设置运行跟踪的缓存大小.越大越好.
调试–>打开或清除运行跟踪
然后我们就可以用CTRL+F11CTRL+F12开启跟踪进入跟踪跳过了。当我们暂停程序的时候,可以用小键盘上的“+”“-”“*”来控制跟踪功能了。
其中,“跟踪进入和运行类似,但是记录所有指令以及寄存器变化。并且会自动进入所有的CALL中。
跟踪跳过跟踪进入类似,但是不进入CALL
“+”
用来显示跟踪缓冲区中的下一条指令
“-”
用来显示跟踪缓冲区中的上一条指令
“*”
用来发返回当前指令

OD显示MFC42.DLL中的函数
打开调试–>选择导入库–>添加–>选择MFC43.LIB加入.重新载入MFC程序,就可以看到call后面的api函数了.

动态暂停以messagebox为例)
先运行目标程序,再运行od,选择文件–>附加.在目标程序运行出现对话框时,切换至od,F12暂停.

字符串参考:
在汇编代码区,右击–>搜索–>字符参考

更改二进制文件:

方法1.查看–>文件,打开文件,找到欲修改的偏移,使用机器码修改,然后右击保存文件.缺点是需要使用其他软件来获取偏移地址.

方法2.直接在反汇编代码区更改,这时可以使用汇编代码更改,不用记机器码.完了.右击–>复制到可执行文件–>保存文件.很是方便哪!

关于虚拟地址和偏移地址:
ollydbg
果然强大,太强大了,在欲修改的指令处右击–>复制到可执行文件,弹出窗口中光标所在行即是欲修改的指令所在的偏移地址,右击–>汇编,直接修改汇编指令,不用记机器码,又不用虚拟地址到偏移地址的转换.改完后保存文件.爽丫!
olldbg
下怎么下消息断点?

如在softice 中下 BMSG 0084 WM_DESTROY,在olldbg下该怎么做?

不如下断 SendMessagePostMessage,程序中的消息不一定都经过消息循环。

Ollydbg
下消息断点的一个方法

原文:
SoftIce can trace application messages. And Olly?
by FuZzYBiT

SoftIce can trace application messages. And Olly?
And so does OllyDbg. That’s a very “hidden feature”. I guess it is sooo useful.
1. Open program
2. Names window [CTRL+N in CPU Window]
3. Find User32.TranslateMessage API
4. right click/FindReferences
5. conditional breakpoint [SHIFT+F4]
6. expression: MSG
7. Log function arguments: Always
If you cannot find it, try right click SEARCH FOR-> ALL INTERMODULAR CALLS.
But if I want to trap a specific message like WM_COMMAND?
To Log Only WM_COMMAND
Do it in this fashion:
1. Open program
2. Names window [CTRL+N in CPU Window]
3. Find User32.TranslateMessage API
4. right click/FindReferences
5. conditional breakpoint [SHIFT+F4]
6. Condtion box: MSG==WM_COMMAND
7. Log function arguments: On Condition
If you can’t find User32.TranslateMessage API, do the same as above.

翻译:

SoftIce
能够跟踪应用程序的消息,那么OllyDbg呢?
by FuZzYBiT

OllyDbg
也是可以的,那是一个非常"隐蔽的功能"。它是如此的有用。
1.
打开程序
2.
名字窗口[ CPU窗口中按CTRL+N ]
3.
查找 User32.TranslateMessage API
4.
右击/FindReferences(查找参考)
5.
下条件断点 [SHIFT+F4]
6.
表达式: MSG
7.
记录函数参数:永远

如果你不能找到它,试试右击鼠标,然后搜索全部模块中的名称。
但是如果我想要捕捉一个特定的消息如WM_COMMAND?
只对WM_COMMAND记录
用这个方法做:
1.
打开一个程序
2.
名字窗口[ CPU窗口中按CTRL+N ]
3.
查找 User32.TranslateMessage API
4.
右击/FindReferences(查找参考)
5.
下条件断点 [SHIFT+F4]
6.
条件框:MSG==WM_COMMAND
7.
记录函数参数: 条件满足时
如果你不能找到User32.TranslateMessage API,象上面那样做。
以下命令适用于 OllyDbg 的命令行插件 Cmdline.dll(显示于程序的插件菜单中)
聆风听雨整理
===============================================================
命令行插件支持的命令

CALC
判断表达式

WATCH
添加监视表达式

AT
在指定地址进行反汇编

FOLLOW
跟随命令

ORIG
反汇编于 EIP

DUMP
在指定地址进行转存

DA
转存为反汇编代码

DB
使用十六进制字节格式转存

DC
使用 ASCII 格式转存

DD
转存在堆栈格式

DU
转存在 UNICODE 格式

DW
使用十六进制字词格式转存

STK
前往堆栈中的地址

AS
AS + 地址 + 字符串)
在指定地址进行汇编

BP
进行条件中断(有条件的断点)

BPX
中断在全部调用 (Call

BPD
清除全部调用中的断点

BC
清除断点

MR
内存断点于访问时

MW
内存断点于写入时

MD
清除内存断点

HR
访问时进行硬件中断

HW
写入时进行硬件中断

HE
执行时进行硬件中断

HD
清除硬件断点

STOP
停止运行程序调试

PAUSE
暂停执行程序调试

RUN
运行程序进行调试

GE
运行和通过例外

SI
单步进入 Call

SO
步过 Call

TI
跟踪进入直到地址

TO
跟踪步过直到地址

TC
跟踪进入直到满足条件

TOC
跟踪步过直到满足条件

TR
运行直到返回

TU
运行直到用户代码

LOG
查看记录窗口

MOD
查看模块窗口

MEM
查看内存窗口

CPU
查看 CPU 窗口

CS
查看 Call 堆栈

BRK
查看断点窗口

OPT
打开选项设置窗口

EXIT
退出 OllyDbg

QUIT
退出 OllyDbg

OPEN
打开一个可执行文件

CLOSE
关闭可执行文件

RST
重新运行当前程序

HELP
查看 API 函数的帮助

OllyDbg
应用方法大全请补充!

所有文章均为散落在DFCG论坛各处或其他网络文集的经典。
雪很冷搜集整理于学习笔记或与朋友讨论之中


Ollydbg
中断方法


  Quote:
Originally posted by dong at 2004-6-1 10:29 PM:
我问个问题
od中怎么下断点呢??
现在有的程序一点注册就没反映了
这样的怎么下断点呢??
能介绍下什么情况下什么断点吗?  
在转存中下硬件访问->Word"断点,下断之后,怎么取消!
9398944(
老菜鸟) 11:09:59
alt+D  
H  然后删除


这个没有万能的方法,只能视具体情况而定,就我的经验而言:
第一步,反汇编找有用信息,有时候虽然点击注册按钮后,没有任何反映,但软件也许包含了可用的信息,比如未注册已注册等等之类的,都可用做断点的。
第二步,如果反汇编也找不到有用信息,如果用OD可以下HMEMECPY断点,在每个调用的函数上下断,虽然这个法子太笨,但我试过,几乎有70%以上的机会可找到断点,找到断点后再慢慢跟吧!这只是个人的看法,关键只要找到断点,有什么办法都无所谓。
在命令行下bpx hmemcpy断点,然后回车,在每个调用的函数上下断。
有的程序甚至无法用API中断,可以在OD载入程序后上下翻动反汇编窗口查看字符串参考下断,在反汇编窗口里直接找到的,右键查找那里找不到


转发Ollydbg 中断方法浅探-各种断点常识知识

Ollydbg
中断方法浅探
                                   ――
国庆节小礼

Ollydbg
是一个新的32位的汇编层调试软件。适应于windows98me2000xp2003操作系统。由于他具有图形窗口界面,所以操作方便、直观,是cracker的好工具。
由于Ollydbg没有了TRW2000的万能断点,所以许多的新手感觉到用Ollydbg断点不好找。现在我来的说说Ollydbg下中断的几种方法。本人是个菜鸟,水平有限,可能不能完整的写出来,也可能存在错误。请大家指正。
我所表述的是Ollydbg v1.09d中文版,其他版本和英文版下自己参考。

第一 寻常断点
Ollydbg
中一般下中断的方法,就是在程序的地址处用鼠标选择这一行。然后按F2键,这时被选择的那一行的地址会变成别的颜色,就表示这个地址处下了中断。然后运行程序时只有到这个地址处就会被Ollydbg中断。
这个方法用的比较多,所以把他称作寻常断点。
如果有命令行插件,就可以在命令窗口中输入BPX xxxxxxxx 下断点。
优点:只要自己怀疑是重要的代码处都可以下这种下断点,不受条件的限制,所以方便实用。
缺点:如果不知道代码功能下断点具有盲目性。

第二 API断点
Ollydbg
中一般下API中断的方法,有二种。
1.  
在代码窗口中点鼠标右键,出现功能菜单。在[搜索]选择项下有〔当前模块的名称〕和〔全部模块的名称〕俩项,选择其中的一项就打开了程序调用API的窗口,在这个窗口中选择你要跟踪的API函数名。双击这个函数就能到程序的调用地址处。然后用F2下中断。也可以在API窗口中选择需要跟踪的函数点鼠标右键出现功能菜单,选择〔在每个参考设置断点〕。同样下了断点。                                      
快捷方式:Ctrl+N
2.  
在命令行窗口中输入BPX  API函数名或者BP  API函数名 后回车。这时出现了所有调用这个函数的地址的窗口,在这个窗口中可以看到调用这个API函数的地址已改变了颜色。说明下好了断点。
说明一下:BPX一般中断在程序调用API的地址处。BP会中断在API的写入地址处。二这有所不同,根据需要选择。
  
优点:这种方法下的断点是针对每一个API函数的,所以具有明确的目的。
  
缺点:关键的API函数不容易找到。所以有时下的断点没有作用。

  
第三  内存断点(跟踪关键数据的断点)
   Ollydbg
中的内存断点相当于TRW中的bpm 断点。
下断点的方法是:在程序运行中断时选择界面中的转存窗口,用光标选择内存中的一段关键数据(颜色会改变),然后右击鼠标出现功能菜单。选择〔断点〕项,其中有二个选择〔内存访问〕和〔内存写入〕。
〔内存访问〕断点是程序运行时要调用被选择的内存数据时就会被Ollydbg中断,根据这个特点在破解跟踪时只要在关键数据内存中下中断就可以知道程序在什么地方和什么时候用到了跟踪的数据。对于一些复杂算法和流程变态的算法跟踪有很大的帮助。从破解上讲,一个注册码的生成一定是由一些关键数据或者原始数据计算来的。所以在内存中一定要用到这些关键数据。那么〔内存访问〕断点就是最好的中断方法。
〔内存写入〕断点是程序运行时向被选择的内存地址写入数据时就会被Ollydbg中断。根据这个特点在破解时可以跟踪一个关键数据是什么时候生成的,生成的代码段在那个地方。所以一个关键的数据如果不知道他的由来就可以用〔内存访问〕断点查找计算的核心。
内存中断的下断点还有另外的一种方法:程序运行时如果知道关键的数据,比如我们输入的试验码、程序生成的序列号等。这时在内存中一定存在这些数据。用Alt+M打开内存窗口,在这个窗口中搜索知道的关键数据。用光标选择这些数据同样下内存中断,这种方法更容易找的关键的数据。
优点:断点是直接面向关键数据的,所以比较容易到核心部分。
缺点:内存断点重新运行后会消失,干扰比较多。

第四  硬件断点(跟踪关键标志的断点)
硬件断点是Olldbg所特有的断点,他不会因为重新运行就销毁,只要不删除。跟踪这个程序时就有效。但他在98系统下会不起作用。
硬件断点是根据关键标志回逆到关键代码的好方法。下中断的方法和内存断点的方法相同,有三个方式〔硬件访问〕、〔硬件写入〕、〔硬件执行〕。一般用前2个。他也同样有内存断点的特性,所以可以用内存断点的地方也可以用硬件断点。这里介绍利用他来跟踪注册标志的使用方法,一般软件的注册都用到了标志比较。即在内存地址中有一个标志,在判断是不是注册时比较标志的值。不同的值表示不同的注册状态。这个标志的地址一般比较固定。根据这个特点可以下硬件断点来跟踪标志位是什么地方被标志的。
方法:在转存窗口中选择到标志存放的内存地址处,然后选择标志值。下〔硬件写入〕中断(根据标志的字节下不同的长度)。重新运行程序你会发现Ollydbg会不断的中断在这个标志的内存地址处。在功能菜单的〔调试〕选项下选择〔硬件断点〕就打开了硬件断点的窗口,在这个窗口中选择〔跟踪〕,这时转存窗口就会来到被下中断的内存地址处。运行程序跟踪内存地址中的值就会知道被赋标志的代码,跟踪到计算的核心。〔硬件访问〕的使用可以知道程序在运行时多少地方用到了这个注册标志。对于破解复杂效验的程序十分的有效。
直接在命令栏里下bh ****硬件断点

以上只是我的总结,本想每个方法用一段例子,无奈时间有限,请大家原谅了。
当然,还是许多的下中断的方法,本人水平有限,不能一一尽述。只当抛砖引玉,请大侠们赐教。


                                    Fxyang
                            
属于中国破解组织[OCN][BCG][FCG]
                                       2003-10-1

欢迎!我高兴地为你推出命令行插件的初始版本,功能很有限但非常适用。它的源代码是自由的,因此你可以添加任意的命令和修改现存的功能。插件所使用的 OllyDbg 新函数在PDK 1.08中有详细的描述。 注意该插件不能工作在1.08及以前版本的 OllyDbg中。

命令行插件的快捷组合键:Alt+F1。目前,它支持如下的命令:

表达式  

CALC 表达式     计算表达式的值

? 表达式        同上

表达式 (第一个字符不能是字母)   同上

WATCH 表达式    添加监视

W 表达式        同上

反汇编器        

AT 表达式       在反汇编中跟随

FOLLOW 表达式   同上

ORIG    前往实际的 EIP

*       同上

转存和堆栈      

D 表达式        在转存中跟随

DUMP 表达式     同上

DA [表达式]     转存为汇编格式

DB [表达式]     转存为十六进制(hex)字节格式

DC [表达式]     作为ASCII 文本转存

DD [表达式]     作为地址(堆栈格式)转存

DU [表达式]     作为 UNICODE 文本转存

DW [表达式]     转存为十六进制(hex)字格式

STK 表达式      在堆栈中跟随

汇编    

A 表达式 [,命令]        在地址处汇编

标号和注释      

L 表达式, 标号  为地址指派符号标号

C 表达式, 注释  在地址处作注释

断点命令        

BP 表达式 [,条件]       在地址处设置 INT3 断点

BPX 标号        在当前模块内部的每个调用外部标号处设置断点

BC 表达式       删除地址处的断点

MR 表达式1 [,表达式2]   设置访问范围的内存断点

MW 表达式1 [,表达式2]   设置写入范围的内存断点

MD      移除内存断点

HR 表达式       在访问地址处设置一个字节的硬件断点

HW 表达式       在写入地址处设置一个字节的的硬件断点

HE 表达式       在执行地址处设置硬件断点

HD [表达式]     移除地址处的硬件断点

跟踪命令        

STOP    暂停执行

PAUSE   同上

RUN     运行程序

G [表达式]      运行到地址处

GE [表达式]     跳过意外的句柄并运行到地址处

S       单步进入

SI      同上

SO      单步跳过

T [表达式]      跟踪进入到地址处

TI [表达式]     同上

TO [表达式]     跟踪跳过到地址处

TC 条件 跟踪进入到条件处

TOC 条件        跟踪跳过到条件处

TR      执行到返回

TU      执行到用户代码

OllyDbg 窗口    

LOG     查看日志窗口

MOD     查看可执行模块

MEM     查看内存窗口

CPU     查看 CPU 窗口

CS      查看调用堆栈

BRK     查看断点窗口

OPT     编辑选项

杂项命令        

EXIT    关闭 OllyDbg

QUIT    同上

OPEN [文件名]   打开待调试的可执行文件

CLOSE   关闭调试的程序

RST     重新载入当前程序

HELP    显示本帮助

HELP OllyDbg    显示 OllyDbg 帮助

HELP API函数帮助完整文件名      显示 API 函数帮助

命令不区分大小写, 中括号中的参数是可选的。表达式可以包含常量, 寄存器和内存参考并支持所有标准的算术和逻辑操作符。默认情况下,所有常量都是十六进制的数。要标记为十进制的常量,紧接着使用十进制标明。例如:

?2+2 ?计算该表达式的值;

?AT [EAX+10] ?在地址EAX+0×10处开始的双字长度内存的内容反汇编;

?BP KERNEL32.GetProcAddress ?设置 API 函数断点。注意:你仅可以在基于NT 系统的系统 DLL 上设置断点;

?BPX GetProcAddress ?在当前所选模块中的每个调用外部函数 GetProcAddress 处设置断点;

?BP 412010,EAX==WM_CLOSE – 0×412010 处设置条件断点。当 EAX 的值等于WM_CLOSE 时程序暂停。

你可以在 OllyDbg 帮助中找到 OllyDbg  支持的完整的表达式描述。

译者注:由于本人的“E”文水平有限,加之对该插件和与之相关的ollydbg 软件以及其他知识的理解深度不足,译文难免在很多地方产生歧义甚至在语义上根本不通顺,鉴此,欢迎各位专业人士积极修正。汉化:张小平 网络浪子工作室

如何添加新命令:

要添加新命令,首先你必须在数组 cmdlist[] 里注册它。数组的元素是结构类型的 t_command. 第一个元素是大写字母的命令,第二个元素描述它的操作数。当前版本的插件只支持三种类型的操作数:

A ? address 中使用值的地址表达式 address. 插件检查为它已分配内存的指针。

a ?等同于 A 但可选。如果未指定表达式,address 被置为0

V ?value 中任意类型的表达式。如果你期望整数表达式,检查 value.dtype DEC_DWORD 并使用 value.u 的内容。

v ?等同于 V 但可选。如果未指定表达式,value.dtype DEC_UNKNOWN value.u 0

S – string 中的 ASCII 串,可能为空。

第三个元素是将被跳过命令过程的常量,第四个是执行命令的过程地址:

typedef int t_exefunc(char *answer,ulong parm);

如果可识别命令的所有操作数被正确解析和评估,插件调用该过程。首先是变元,answer,是长256个字节的串指针。命令被执行后它的内容会被显示在命令行窗口中。第二个变元是从 cmdlsit[] 取出的参数。如果函数的返回值为 0,说明命令正确执行并将其添加到历史列表中。


ollydbg1.10
汉化版有些地方意思翻译得不准确

例如调试选项中的"sfx"中的停止在自释放解释器的入口这句话的翻译根本就是错的。原文是Stop at entry of self-extractor,原文意思为“OllyDbg doesn’t attempt to trace real entry.”就是“Ollydbg不试图跟踪真实入口。还有一些类似的翻译也是错的。容易引起误解,建议大家还是用英文原版,不懂的看帮助文件。
请教:怎么在OLLYDBG中保存当前正在调试的程序?
在代码区修改程序后,点右键-》复制到可执行文件-》选择部分,在弹出的窗口里点右键-》保存文件。起个文件名吧。
OllyDbg
常用快捷热键
聆风听雨整理
===============================================================
打开一个新的可执行程序 (F3)

重新运行当前调试的程序 (Ctrl+F2)

当前调试的程序 (Alt+F2)

运行选定的程序进行调试 (F9)

暂时停止被调试程序的执行 (F12)

单步进入被调试程序的 Call (F7)

步过被调试程序的 Call (F8)

跟入被调试程序的 Call (Ctrl+F11)

跟踪时跳过被调试程序的 Call (Ctrl+F12)

执行直到返回 (Ctrl+F9)

显示记录窗口 (Alt+L)

显示模块窗口 (Alt+E)

显示内存窗口 (Alt+M)

显示 CPU 窗口 (Alt+C)

显示补丁窗口 (Ctrl+P)

显示呼叫堆栈 (Alt+K)

显示断点窗口 (Alt+B)

打开调试选项窗口 (Alt+O)
我想知道在OD中如何下地址断点
比如bpx 5022e2
是不是在命令行中?有其他办法没?
命令行在98下不能用


ctrl+g
输入地址,F2下断
请问用ollydbg如何跟踪被跟踪进程的子进程

我在跟踪一个程序的时候,它用CreatProgressA产生了一个子进程,然后关闭父进程,请问我如何在子进程的入口处下断?请高手指教!
指令为:
00454476   50               PUSH EAX
00454477   6A 00            PUSH 0
00454479   E8 C218FBFF      CALL kernel32.CreateProcessA

00454479
处堆栈内容如下:
0012FD40   00000000  |ModuleFileName = NULL
0012FD44   00956B94  |CommandLine = "C:\QXJDGL\QXJDGL.DLL 2"
0012FD48   00000000  |pProcessSecurity = NULL
0012FD4C   00000000  |pThreadSecurity = NULL
0012FD50   00000000  |InheritHandles = FALSE
0012FD54   00000020  |CreationFlags = NORMAL_PRIORITY_CLASS
0012FD58   00000000  |pEnvironment = NULL
0012FD5C   00000000  |CurrentDir = NULL
0012FD60   0012FD84  |pStartupInfo = 0012FD84
0012FD64   0012FD74  \pProcessInfo = 0012FD74

飞叶流枫回答:
C:\QXJDGL\QXJDGL.DLL 2
,这个程序是一个EXE程序,你可以改入口点为INT 3,也就是CCh,OD设为最终异常处理程序。当程序启动的时候会产生一个INT 3非法操作,你点调试就可以中断在QXJDGL.DLL中了。

OllyDbg实用技巧六则

标题: OllyDbg实用技巧六则

作者:  dOSKEY lEE

关键词: OllyDbgOD、技巧

1
、让跳转路径显示出来

  
打开Options\Debugging Option。弹出Debugging Option对话框,选择CPU页,选定“Show direction to jumps”“Show jump path”“Show grayed path if jump is not taken”。如此以来在  Dis***embler窗口就会显示跳转的路径了。

2
、让OD显示MFC42.DLL中的函数

  
如果程序是用MFC进行的动态编译,那么在OD中将只能显示MFC42.DLL中的函数为:

00410E40  |.  E8 43000000  CALL    <JMP.&MFC42.#1576> 1576
是函数在MFC42.DLL中的序号。打开Debug\Select import libraries,单击弹出的对话框中“Add”,在弹出的打开文件对话框中选择“MFC42.LIB”并打开,重新载入MFC程序,你就可以看见函数名称变为:

00410E40  |.  E8 43000000  CALL    <JMP.&MFC42.#1576_?AfxWinMain@@Y>

IDA
中分析出了来的东西一样了!呵呵,以后不用等待IDA细嚼慢咽也可以轻松搞定MFC程序了。其他的DLL类似,如果有序号,可以在VCLIB目录中找到相关的.LIB文件,加到OD中便可。如果你没有“MFC42.DLL”,你可以的到看学论坛的下载区找,我已经上传到那里了。

3
、让OD轻松躲过“ANTI-DEBUG”
  
  
很多“ANTI-DEBUG”的程序都是在程序开始时来检查是否安装调试器的。用这种特性我们可以轻松的用OD“Attach”绕过检查部分。如“X语言,如果你哟内TRW2K/S-ICE/OD 直接加载它的话,程序回警告你安装了调试器并结束。但是我们在“X语言开启后再运行OD,并用“Attach”系上它就就可以了,轻松通过检查。而且在OD系上它后仍然可以用CTRL+A进行分析。如此一来,快哉!:)

4
、轻松对付调用“MessageBoxA”以及类似的模态对话框的程序
    
  
很多人都认为OD不好拦截“MessageBoxA”这类API函数。其实我们有个很简单的办法将API拦截下来,并且快速找到比较地点/主算法地点。首先用OD加载目标程序,如果不能加载,用上面的方法“Attach”目标程序。然后,F9运行目标程序,并且有意让目标程序显示“ MessageBox”,然后切换到OD中,F12暂停,如

0041201F  |>  53            PUSH    EBX                    ; /Style
00412020  |.  57            PUSH    EDI                    ; |Title
00412021  |.  FF75 08       PUSH    [ARG.1]                ; |Text
00412024  |.  FF75 F4       PUSH    [LOCAL.3]              ; |hOwner
00412027  |.  FF15 A8534100 CALL    DWORD PTR DS:[4153A8]  ; \MessageBoxA
0041202D  |.  85F6          TEST    ESI, ESI              ;
停在此处
0041202F  |.  8BF8          MOV    EDI, EAX
00412031  |.  74 05         JE      SHORT 1551-CRA.00412038

F8
单步一下,切换到“MessageBox”中,确认,被OD中断。我们可以看见上面的代码41201F处有一个,说明可以从某段代码跳转到此处,我们选择41201F这一行,在“Information”栏看见一句“JUMP FROM 412003”,右键单击,选择“GO TO JUMP FROM 412003”。回到412003,一般都是条件跳转,上面的内容就是比较的地方啦。:)

5
、使用ODTRACK功能
    
   OD
拥有强大的TRACK功能,在分析算法时十分有用。首先我们要设定ODTRACK缓冲区大小,选择Option\Debugging Option,在弹出的对话框中选择TRACK页,“Size of run track buffer(byte/record)”,缓冲区大小,当然约大约好。其他的设置在我以前的OLLYDBG.INI中都已经设置好了。然后,开启目标程序,在DEBUG中选择“Open or clear run track”。然后我们就可以用CTRL+F11CTRL+F12开启“Track into”“Track over”了。当我们暂停程序的时候,可以用小键盘上的“+”“-”“*”来控制TRACK功能了。

“Track into”
和运行类似,但是记录所有指令以及寄存器变化。并且会自动进入所有的CALL中。
“Track over”
“Track into”类似,但是不进入CALL
“+”
用来显示TRACK缓冲区中的下一条指令
“-”
用来显示TRACK缓冲区中的上一条指令
“*”
用来发返回当前指令

6
、不是技巧的技巧
  
当你遇到花指令的时候一定会很头痛。但是如果你用OD进行分析的时候就会轻松得多。OD会自动标识出无效指令,即花指令。如果OD没有正确识别,你还可以用CTRL+↑/↓来单个 字节的移动。可以很有效的识别出花指令的所在。

 



Ollydbg是一个新的32位的汇编层调试软件。适应于windows98、me、2000、xp和2003操作系统。由于他具有图形窗口界面,所以操作方便、直观,是cracker的好工具。
由于Ollydbg没有了TRW2000的万能断点,所以许多的新手感觉到用Ollydbg断点不好找。现在我来的说说Ollydbg下中断的几种方法。本人是个菜鸟,水平有限,可能不能完整的写出来,也可能存在错误。请大家指正。
我所表述的是Ollydbg v1.10中文版,其他版本和英文版下自己参考。

第一 寻常断点
Ollydbg中一般下中断的方法,就是在程序的地址处用鼠标选择这一行。然后按F2键,这时被选择的那一行的地址会变成别的颜色,就表示这个地址处下了中断。然后运行程序时只有到这个地址处就会被Ollydbg中断。
这个方法用的比较多,所以把他称作寻常断点。
如果有命令行插件,就可以在命令窗口中输入BPX xxxxxxxx 下断点。
优点:只要自己怀疑是重要的代码处都可以下这种下断点,不受条件的限制,所以方便实用。
缺点:如果不知道代码功能下断点具有盲目性。

第二 API断点
Ollydbg中一般下API中断的方法,有二种。
1. 在代码窗口中点鼠标右键,出现功能菜单。在[搜索]选择项下有〔当前模块的名称〕和〔全部模块的名称〕俩项,选择其中的一项就打开了程序调用API的窗口,在这个窗口中选择你要跟踪的API函数名。双击这个函数就能到程序的调用地址处。然后用F2下中断。也可以在API窗口中选择需要跟踪的函数点鼠标右键出现功能菜单,选择〔在每个参考设置断点〕。同样下了断点。
快捷方式:Ctrl+N

2. 在命令行窗口中输入BPX API函数名或者BP API函数名 后回车。这时出现了所有调用这个函数的地址的窗口,在这个窗口中可以看到调用这个API函数的地址已改变了颜色。说明下好了断点。
说明一下:BPX一般中断在程序调用API的地址处。BP会中断在API的写入地址处。二这有所不同,根据需要选择。
优点:这种方法下的断点是针对每一个API函数的,所以具有明确的目的。
缺点:关键的API函数不容易找到。所以有时下的断点没有作用。

第三 内存断点(跟踪关键数据的断点)
Ollydbg中的内存断点相当于TRW中的bpm 断点。
下断点的方法是:在程序运行中断时选择界面中的转存窗口,用光标选择内存中的一段关键数据(颜色会改变),然后右击鼠标出现功能菜单。选择〔断点〕项,其中有二个选择〔内存访问〕和〔内存写入〕。
〔内存访问〕断点是程序运行时要调用被选择的内存数据时就会被Ollydbg中断,根据这个特点在破解跟踪时只要在关键数据内存中下中断就可以知道程序在什么地方和什么时候用到了跟踪的数据。对于一些复杂算法和流程变态的算法跟踪有很大的帮助。从破解上讲,一个注册码的生成一定是由一些关键数据或者原始数据计算来的。所以在内存中一定要用到这些关键数据。那么〔内存访问〕断点就是最好的中断方法。
〔内存写入〕断点是程序运行时向被选择的内存地址写入数据时就会被Ollydbg中断。根据这个特点在破解时可以跟踪一个关键数据是什么时候生成的,生成的代码段在那个地方。所以一个关键的数据如果不知道他的由来就可以用〔内存访问〕断点查找计算的核心。
内存中断的下断点还有另外的一种方法:程序运行时如果知道关键的数据,比如我们输入的试验码、程序生成的序列号等。这时在内存中一定存在这些数据。用Alt+M打开内存窗口,在这个窗口中搜索知道的关键数据。用光标选择这些数据同样下内存中断,这种方法更容易找的关键的数据。
优点:断点是直接面向关键数据的,所以比较容易到核心部分。
缺点:内存断点重新运行后会消失,干扰比较多。

第四 硬件断点(跟踪关键标志的断点)
硬件断点是Olldbg所特有的断点,他不会因为重新运行就销毁,只要不删除。跟踪这个程序时就有效。但他在98系统下会不起作用。
硬件断点是根据关键标志回逆到关键代码的好方法。下中断的方法和内存断点的方法相同,有三个方式〔硬件访问〕、〔硬件写入〕、〔硬件执行〕。一般用前2个。他也同样有内存断点的特性,所以可以用内存断点的地方也可以用硬件断点。这里介绍利用他来跟踪注册标志的使用方法,一般软件的注册都用到了标志比较。即在内存地址中有一个标志,在判断是不是注册时比较标志的值。不同的值表示不同的注册状态。这个标志的地址一般比较固定。根据这个特点可以下硬件断点来跟踪标志位是什么地方被标志的。
方法:在转存窗口中选择到标志存放的内存地址处,然后选择标志值。下〔硬件写入〕中断(根据标志的字节下不同的长度)。重新运行程序你会发现Ollydbg会不断的中断在这个标志的内存地址处。在功能菜单的〔调试〕选项下选择〔硬件断点〕就打开了硬件断点的窗口,在这个窗口中选择〔跟踪〕,这时转存窗口就会来到被下中断的内存地址处。运行程序跟踪内存地址中的值就会知道被赋标志的代码,跟踪到计算的核心。〔硬件访问〕的使用可以知道程序在运行时多少地方用到了这个注册标志。对于破解复杂效验的程序十分的有效。
直接在命令栏里下bh ****硬件断点

<>
Q:
哪些人可以学习破解?
A:
任何会启动电脑并运行软件同时又想学习破解的人。我说的全是实话,如果你既不会启动电脑又不会运行软件,那么我教你一个更高深的吧破解电脑,呵呵,很简单,到大街上随便抡个板砖什么的,回去慢慢破解吧 (记得关电源)
Q:
有没有什么办法可以使我快速入门并成为高手?
A:
有。但你得是个MM(PPL无所谓),然后找个离你家最近的破解达人,什么也不用做,眨个眼放个电之类的会吧(现在连初中的小女生都会这个),然后就成了,呵呵,想破什么的话,让高手帮忙吧,到时说成是自己破的就成了 MM问为什么?因为那些高手大都奇丑无比,呵呵,有了头脑就没了长相,男的也是这样,而且越是高手,长的就是越丑。据说一次市里到CCG考察奶牛们的出乳情况,看到大哥Sun某的时候,说了句这奶牛个儿这么小啊,中午大家吃涮锅” (众大哥:大家准备好家伙,我们一会儿要去械斗)。呵呵,玩笑开到这里,其实我说这么多,只是想告诉你,学习破解跟其它技术一样,请你不要试图投机取巧,要想学,就脚踏实地,多看教程多动手实践积累经验,不要经常POSE那种弱智问题我不懂XX,请问我能学破解吗?,答案是不能,你问的同时,不也正在学吗?想知道重要吗?那我告诉你好了,凡是看雪教程上要求掌握的,你全要掌握,这还不算,要想成为高手就必须精通,如果你不想一直只停留在入门阶段的话。不要想偷机取巧,谁一开始也不是什么都会的,但你只要花一些时间和一小部分精力,那么没有什么你学不会的,知识是要积累的,你知道自己不会却不去学,而在那儿问重不重要,人家会觉的你这个人并不想认真学破解,而是报有侥幸心理在浪费时间,请不要做浪费时间的人。不要刚开始学就想马上成为高手,没有高手,你没必要立下超越的目标,只把学知识放在首位就够了,欲速则不达,请不要做急于求成的人。
Q:
学破解对我来说有什么好处?
A:
这个问题应该你自己来回答,呵呵,你为什么要学?我想免费使用共享软件那多少也算是个目的,但我希望你不要只报这种目的(目前国内共享软件业还有待发展)。我只是想说给那些只是因为一时冲动才学习破解的人,请将你们当初的冲动继续维持下去,你需要明白,学习破解的目的不只在于破解软件这个词,也许后来你会变为软件分析,随着学习时间的增加,对你的编程水平,相信会有相当大的提高。学习别人好的思想,并化为已用 就我个人来说,学习破解可以把我的汇编的基础给打好,呵呵,俺对操作系统这玩意儿感兴趣,到时候还想写出来个玩玩儿呢,所以汇编这关必须要过….
Q:
我很笨,那些大虾的教程我大都看不明白,我能学会吗?
A:
永远不要说你笨,你只是学的比人家晚而已,太高深的看不懂,那你就捡能看懂的看,别人能入门,你也能,不得要领只是暂时,大虾与你,也许差的就是一两年时间的问题。
第二章汇编语言 (修订版)

稍微有点儿计算机知识的朋友一定知道,计算机是只识别01的,最初那会儿,要写程序,就要用01来写,呵呵,Cool吧!
所以曾经有过的对程序员的崇拜,可能就源自那个时候吧 后来,人们发现用01来写程序,太不爽了,不但写起来不上手,
而且回过头来看的话,应该很难再看明白了,总之出于这些原因,就有了汇编语言。汇编语言用一些助记符来代替01
多种组合,也就是各个指令,这样的话,从一定程度上来说,方便了许多(一头老牛:方便太多了)(一只菜鸟:一点儿
也不方便,完全看不懂)。但是,汇编也同样不方便,同样写起来不爽,而且后期维护同样不方便,再加上人们慢慢地需
要写一些更大的程序,在这样的情况下,高级语言就被人发明了出来,就是我们今天用的BasicpascalCC++等等等等,
这些语言的出现,一下了使程序的开发难度大大减低了,以前用汇编要很长时间才能开发出来的程序,现在只需要很短的时间
且很轻松的就可以搞定了,特别是最近几年,可视化编程的大肆普及,使程序员的神秘感一下子摔了下来,Coder这样的词现在
都满天飞了。最惨的就是汇编,一夜之间变成了低级语言、下流的语言、吃完大蒜不刷牙的民工、开车加完油不给钱的地痞、
在公共汽车上吐口水的冰岛人等等等等 (汇编:呜呜呜我不活了)。
但是汇编还是有它先天的优势的,因为其与CPU内部的指令一一对应,所以在一些特殊的场合,必须由汇编来实现,比如访问硬件
的端口、写病毒…. 而且生成的可执行文件效率巨高,且生成的可执行文件贼小,写小程序是很爽的,呵呵,而且用汇编写注册机,
是件很轻松的事,你不用再为怎样还原为你所熟悉的语言而为难。说了这么多,还是切入主题吧(昏倒观众若干):
既然计算机只识别01,那么,所有存储在计算机上的文件,也都是以二进制的形式存放的,当然也包括可执行文件了。
所以,你只要找一个十六进制编辑器比如Ultra Edit什么的,就可直接打开并查看可执行文件了,呵呵,如果你能看懂的话
你会发现,此时看到的,全是些十六进制数值(每4位二进制数可转换为一位十六进制数),这就是可执行文件的具体内容,
当然,其中就包括可执行文件的代码了。呵呵,此时,你是不是觉得看这些东西,有些那个?
这些东西看起来就像有字天书,没人能靠这玩意儿来进行分析,于是乎。就有了相应的软件,可以将这些十六进制数值
转换为相应的汇编代码,这样的话,我们就可以对别人的软件进行分析了。这就是所谓的逆向分析了。
呵呵,聪明的你现在一定在想,如果找到软件计算注册码的部分,并对其进行分析,弄懂它的计算方法,那么你不就不用
通过¥的方式来进行软件注册了吗?当然,你也可以将此计算过程还原为任意一个你所熟悉的编程语言,那么,编译后的
这个程序,就叫做注册机,它的功能就是计算某一特定软件的注册码。(呵呵,是不是经常在软件中看到此类说明?\"禁止
制作和提供该软件的注册机及破解程序;禁止对本软件进行反向工程,如反汇编、反编译等\" 作者这样做,心情我们是
可以理解的,毕竟人家花了那么多心思在自己的软件上,所以,我不希望你仅仅是因为交不起注册费的原因来学习破解。
总的说来,上边儿的介绍有点儿太理想化了,上面提到的分析方法,就是所谓的静态分析,此类分析常用的工具有W32DASM
IDA
HIEW等。静态分析,顾名思义,就是只通过查看软件的反汇编代码来对软件进行分析。一般如果只是想暴破软件,只进
行静态分析就够了。但要想真正的弄清注册算法,一般还是要进行动态分析的,即能过调试器来一边执行程序一边进行分析。
具体内容,我会在《破解原理》和《调试器入门》中详细说明,呵呵,毕竟现在都以经有点儿跑题了。我废话说了这么多,
其实就是想告诉你汇编的重要性,我不要求你精通,但最少你也得能看懂吧,要不,还谈什么分析?虽然有哥们儿一点儿
汇编都不懂就上路了,甚至还破掉了几个软件,但是,这样是不是惨了点儿?难不成你想暴破软件暴破一辈子? 其实你完
全不用惧怕汇编的,看上去怪吓人的,其实跟你平时背那些控件的属性方法差不多,MFC那么多你都搞的定,汇编命令才
有多少?而且,汇编不光只是在Crack软件时有用,在好多地方也都有用,且用处巨大,所以我觉得,把汇编拿下,是件
义不容辞的事: 你只要相信它并不难就好了。
(以下为第二次修改时加入)
先给你讲一下CPU的组成吧:
CPU
的任务就是执行存放在存储器里的指令序列。为此,除要完成算术逻辑操作外,还需要担负CPU和存储器以及I/O之间的
数据传送任务。早期的CPU芯片只包括运算器和控制器两大部分。到了近几年,为了使存储器速度能更好地与运算器的速度相
匹配,又在芯片中引入了高速缓冲存储器(知道为什么P4P4赛扬贵那么多吗?)。(当!一个硬物飞了过来,话外音:
;;
所以它是直接操作硬件的,你以为这是用J你讲这些做什么,我们又不要设计CPU)你急什么嘛,由于汇编比较低级 
VB
呢,想什么时候用变量随手就可以拿来用,你不掌握好CPU内部的一些工作分配情况,到时怎么来看汇编代码啊。(当!
又一声,重要还不快点儿说)除了高速缓冲存储器之外的组成,大体上可以分为3个部分:
1.
算术逻辑部件ALUarithmetic logic unit)用来进行算术和逻辑运算。这部分与我们的关系不太大,我们没必要管它。
2.
控制逻辑。同样与我们的关系不大。
3.
这个才是最最重要的。工作寄存器,它在计算机中起着重要的作用,每一个寄存器相当于运算器中的一个存储单元,
但它的存取速度却贼快贼快,比存储器要快很多了。它用来存放计算过程中所需要的或所得到的各种信息,包括操作数地址、
操作数及运算的中间结果等。下面我们专门的介绍这些寄存器。在介绍之前,有必要说点儿基础性的知识。知道什么是32位吧,
就是说寄存器是32位的,晕~~等于没说。在CPU中,一个二进制位被看作是一位,八位就是一个字节,在内存中,就是以字节
为单位来在存储信息的,每一个字节单元给以一唯一的存储器地址,称为物理地址,到时候访问相应的内存,就是通过这个地址。
八个二进制位都能表达些什么呢?可以表达所有的ASCII码,也就是说一个内存单元可以存储一个英文字符或数字什么的,而中文
要用Unicode码来表示,也就是说两个内存单元,才能装一个汉字。十六位就是两个字节这不难理解吧,当然啦,那有了十六位,
就肯定有三十二位六十四位什么的,三十二位叫做双字,六十四位就叫做四字。今天我们所使的CPU,相信全是32位的了,除非你
用的是286或更早的话。自然而然,CPU中的寄存器,也就是32位的了,也就是说一个寄存器,可以装下3201(这其中不包括
段寄存器)。大体上来说,你需要掌握的寄存器,有十六个,我一个一个给介绍给你: 首先,介绍通用寄存器。
一共八个,分别是EAXEBXECXEDXESPEBPEDIESI 其中,EAX—EDX这四个寄存器又可称为数据寄存器,
你除了直接访问外,还可分别对其高十六位和低十六位(还计的我说它们是32位的吗?)进行访问。它们的低十六位就是把它们
前边儿的E去掉,即EAX的低十六位就是AX。而且它们的低十六位又可以分别进行八位访问,也就是说,AX还可以再进行分解,
AX还可分为AH(高八位)AL(低八位)。其它三个寄存器请自行推断。这样的话,你就可以应付各种情况,如果你想操作的是
一个八位数据,那么可以用 MOV AL (八位数据)MOV AH (八位数据),如果你要操作的是一个十六位数据,可以用MOV AX
(
十六位数据)三十二位的话,就用MOV EAX (三十二位数据)也许我这样说,你还是会不明白,没关系,慢慢来,我给你大概画张图吧,
虽然不怎么漂亮:
───────────────────────
│ │ │ │
│ │ │ │
高十六位 EAX AH AX AL │
│ │ │ │
│ │ │ │
───────────────────────
(
我倒啊这个图为啥老是不能正常显示?我都重画三遍了)
明白了吗?不明白没有关系,你就按你自己的理解能力,能理解多少,就理解多少。 这四个寄存器,主要就是用来
暂时存放计算过程中所用的操作数、结果或其它信息。 ESPEBPEDIESI这四个呢,就只能用字来访问,它们
的主要用途就是在存储器寻址时,提供偏移地址。因此,它们可以称为指针或变址寄存器。话说回来,从386以后,
所有的寄存器都可以用来存储内存地址。(这里给你讲一个小知识,你在破解的时候是不是看到过[EBX]这样的形式呢?
这就是说此时EBX中装的是一个内存地址,而真正要访问的,就是那那个内存单元中所存储的值)。 在这几个寄存器中,
ESP
称为堆栈指针寄存。堆栈是一个很重要的概念,它是以后进先出方式工作的一个存储区,它必须存在于堆栈段中,
因而其段地址存放于SS寄存器中。它只有一个出入口,所以只有一个堆栈指针寄存器。ESP的内容在任何时候都指向当前的栈顶。
我这样说你可能会觉的还是不明白,那我举个例子吧,知道民工盖房吧,假设有两个民工,一个民工(以下简称民工A)要向地
上铺砖,另一个民工(以下简称民工B)给民工A递砖,民工A趴在地上,手边是民工B从远处搬来的板砖,他拿起来就用,民工
B
从远处搬来后,就还放在那一堆砖上,这样,民工A拿着用后,民工B随既就又补了上去,这就是后进先出。你在脑子里
想象一下这个这程。有没有想明白,民工A永远是从最上边开始拿砖。堆栈就是这样,它的基址开始于一个高地址,然后
每当有数据入栈,它就向低地址的方向进行存储。相应的入栈指令是PUSH。每当有数据入栈,ESP就跟着改变,总之,
它永远指向最后一个压入栈的数据。之后,如果要用压入堆栈的数据,就用出栈指令将其取出。相应的指令是POP
POP
指令执行后,ESP会加上相应的数据位数。 特别是现在到了Win32系统下面,堆栈的作用更是不可忽视,API所用的数据,
均是靠堆栈来传送的,即先将要传送的数据压入堆栈,然后CALLAPI函数,API函数会在函数体内用出栈指令将相应的数据出栈。
然后进行操作。以后你就会知道这点的重要性了。许多明码比较的软件,一般都是在关键CALL前,将真假两个注册码压入栈。然后
CALL内出栈后进行比较。所以,只要找到个关键CALL,就能在压栈指令处,下d命令来查看真正的注册码。具体内容会在
后面详细介绍,另外还有EBP,它称为基址指针寄存器,它们都可以与堆栈段寄存器SS联用来确定堆栈中的某一存储单元的地址,
ESP
用来指示段顶的偏移地址,而EBP可作为堆栈区中的一个基地址以便访问堆栈中的信息。ESI(源变址寄存器)和EDI
(目的变址寄存器)一般与数据段寄存器DS联用,用来确定数据段中某一存储单元的地址。这两个变址寄存器有自动增量和自动减量
的功能,可以很方便地用于变址。在串处理指令中,ESIEDI作为隐含的源变址和目的变址寄存器时,ESIDS联用,EDI和附加段
ES
联用,分别达到在数据段和附加段中寻址的目的。目前暂时不明白不要紧。接下来,介绍一下专用寄存器,呵呵,有没有被这个
名字吓倒?看起来怪专业的。 所谓的专用寄存器,有两个,一个是EIP,一个是FLAGS 我们先来说这个EIP,可以说,EIP算是
所有寄存器中最重要的一个了。它的意思就是指令指针寄存器,它用来存放代码段中的偏移地址。在程序运行的过程中,它始终
指向下一条指令的首地址。它与段寄存器CS联用确定下一条指令的物理地址。当这一地址送到存储器后,控制器可以取得下一条
要执行的指令,而控制器一旦取得这条指令就马上修改EIP的内容,使它始终指向下一条指令的首地址。可见,计算机就是用EIP
寄存器来控制指令序列的执行流程的。 那些跳转指令,就是通过修改EIP的值来达到相应的目的的。 再接着我们说一下这个
FLAGS
,标志寄存器,又称PSW(program status word),即程序状态寄存器。这一个是存放条件标志码、控制标志和系统标志的寄存器。
其实我们根本不需要太多的去了解它,你目前只需知道它的工作原理就成了,我举个例子吧:
Cmp EAX,EBX ;
EAXEBX相减
JNZ 00470395 ;
不相等的话,就跳到这里;
这两条指令很简单,就是用EAX寄存器装的数减去EBX寄存器中装的数。来比较这两个数是不是相等,当Cmp指令执行过后,就会
FLAGSZFzero flag)零标志位上置相应值,如果结果为0,也就是他们两个相等的话,ZF1,否则置0。其它还有OF(溢出
标志)SF(符号标志)CF(进位标志)AF(辅助进位标志)PF(奇偶标志)等。 这些你目前没必要了解那么清楚,会用相应的
转移指令就行了。 最后要介绍的就是段寄存器了这部分寄存器一共六个,分别是CS代码段,DS数据段,ES附加段,SS堆栈段,
FS
以及GS这两个还是附加段。其实现在到了Win32环境下,段寄存器以经不如DOS时代那样重要了。 所以,我们知道就行了。
啰嗦了这么多,相信你对CPU以经有了个大概的了解了吧。什么?还是什么也不明白?呵呵,那也不要灰心,请相信这是我的错,
是我没有讲清楚而已,你可以去参考一些书籍。我始终觉的,你案头有一本讲汇编的书是非常非常有必要的,我这边儿是清华版的
80×86汇编语言程序设计》沈美明主编,46元。 我们接下来就再讲一讲一些常用的汇编指令吧。(由于考虑到目前以经有了
相应的帖子,所以,我只是从汇编指令中,挑出一些最常用,需要掌握的,更多内容,还请参见书本。) CMP A,B 比较
A
B其中AB可以是寄存器或内存地址,也可同时是两个寄存器,但不能同都是内存地址。这个指令太长见了,许多
明码比较的软件,就用这个指令。 MOV A,B B的值送给A其中,AB可是寄存器或内存地址,也可同时是两个寄存器,
但不能同都是内存地址。 Xor a,a异或操作,主要是用来将a清空 LEA装入地址,例如LEA DXstring 将字符的地址装入DX寄存器
PUSH
压栈
POP
出栈
ADD
加法指令 格式:ADD DSTSRC 执行的操作:(DST)<-(SRC)+(DST)
SUB
减法指令 格式UB DSTSRC 执行的操作:(DST)<-(DST)-(SRC)
MUL
无符号乘法指令 格式: MUL SRC 执行的操作:字节操作(AX)<-(AL)*(SRC);字操作(DX,AX)<-(AX)*(SRC)
双字操作:(EDX,EAX)<-(EAX)*(SRC)
DIV
无符号除法指令 格式IV SRC 执行的操作:字节操作:16们被除数在AX中,8位除数为源操作数,结果的8位商在AL中,
8
位余数在AH中。表示为: (AL)<-(AX)/(SRC)的商,(AH)<-(AX)/(SRC)的余数。字操作:32位被除数在DX,AX中。
其中DX为高位字,16位除数为源操作数,结果的16位商在AX中,16位余数在DX中。表示为:(AX)<-(DX,AX)/(SRC)的商,
(DX)<-(DX,AX)/(SRC)
的余数。 双字操作:64位的被除数在EDX,EAX中。其中EDX为高位双字;32位除数为源操作数,
结果的32位商在EAX中,32位余数在EDX中。表示为:
(EAX)<-(EDX,EAX)/(SRC)
的商,(EDX)<-(EDX,EAX)/(SRC)的余数。
NOP
无作用,可以用来抹去相应的语句,这样的话,嘿嘿嘿
CALL
调用子程序,你可以把它当作高级语言中的过程来理解。
控制转移指令:
JE
JZ 若相等则跳
JNE
JNZ 若不相等则跳
JMP
无条件跳
JB
若小于则跳
JA
若大于则跳
JG
若大于则跳
JGE
若大于等于则跳
JL
若小于则跳
JLE
若小于等于则跳
总的来说,以上几个,都是比较常见的,需要掌握,但需要掌握的绝不止这几个,其它的指令希望你能在私下里再了解一下,
可以找相应的教程来看。 刚才忘了,现在再把数制转换也给贴上:
首先说二进制转换为十进制的问题:
各位二进制数码乘以与其对应的权之和即为该二进制相对应的十进制数。例如:
10100=2
4次方+22次方,也就是十进制数20
11000=2
4次方+23次方,也就是十进制数24
接着说一下十进制数转换为二进制数的方法:
这样的方法到底有多少,我也不清楚,我只讲最简单的一个-除法:
把要转换的十进制数的整数部分不断除以2,并记下余数,直到商为0为止。
:N=34D(说明一下,你可能在某些数字的后边看到过加有一个字母,这个字母便是用来表示数制的,十进制数用D,二进制数用B
八进制数用O,十六进制数用H)
34/2=17 (a0=0)
17/2=8 (a1=1)
8/2=4 (a2=0)
4/2
:N=34D(说明一下,你可能在某些数字的后边看到过加有一个字母,这个字母便是用来表示数制的,十进制数用D
二进制数用B,八进制数用O,十六进制数用H)
34/2=17 (a0=0)
17/2=8 (a1=1)
8/2=4 (a2=0)
4/2=2 (a3=0)
2/2=1 (a4=0)
1/2=0 (a5=1)
所以N=34D=100010B
对于被转换的十进制数的小数部分则应不断乘以2,并记下其整数部分,直到结果的小数部分为0为止。
十六进制数与二进制数、十进制数之间的转换:
总的来说,十六进制数与二进数之间的转换,应该算是很简单的了,你只需把与之相对应的数值进行转换就成了。 十六进制数的
基数是16,共有16个数码,它们是0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F。其中A表示十进制中的10,其余类推。它们与二进制和
十进制数的关系如下:
0H=0D=0000B,1H=1D=0001B,2H=2D=0010B,3H=3D=0011B,4H=4D=0100B,5H=5D=0101B,6H=6D=0110B,7H=7D=0111B,
8H=8D=1000B,9H=9D=1001B,AH=10D=1010B,BH=11D=1011B,CH=12D=1100B,DH=13D=1101B,EH=14D=1110B,
FH=15D=1111B
所以,二进制与十六进制之间要进行转换的话,只要把它们由低到高每四位组成一级,直接用十六进制来表示就可以了:
: 1000 1010 0011 0101
8 A 3 5
十六进制转二进制则用只需将每一位用四位二进制数来表示就成了:
: A B 1 0
1010 1011 0001 0000
最后是十六进制数与十进制数之间的互相转换
十六进制数转十进制数
各位十六进制数与其对应权值的乘积之和即为与此十六进制数相对应的十进制数。
:N=BF3CH
=11*16
3次方+15*162次方+3*161次方+12*160次方
=11*4096+15*256+3*16+12*1
=48956D
十进制转十六进制
我还是只讲最简单的除法:
把要转换的十进制数的整数值部分不断除以16,并记下余数,直到商为0为止。
N=48956D
48956/16=3059 (a0=12)
3059/16=191 (a1=3)
191/16=11 (a2=15)
11/16=0 (a3=11)
所以N=48956D=BF3CH
通过以上的介绍,我不知道你到底看懂没有,如果有的话,请你去看一下书本,把我没讲到的地方和讲过了的地方都仔细地看几遍。
如果你根本就没有看懂,那么你就更需要去看书了,不要因为这就丧失掉学习的信心。你认真地把前边儿的CPU介绍看完,弄清楚
寄存器的概念,再把后边汇编指令拿下,就可以上路了。你认真学,认真背的话,会发现其实并没你想像中的那么难。
一星期的时间,就可大概掌握了,但只是掌握而已,最起码可以看懂汇编代码了。要真想学好的话,就连后边儿的也
一同看了吧,再写一些小程序来练练手。当然想精通汇编,那可不是一天两天一月两月的事,但你只要有恒心,有什么
搞不定的?CPU也是人做的,指令只是其中的一部分而已,人家能做出CPU,你还怕连使用都学不会?

课后FAQ
Q:
我以前学过8086/8088,并且也在DOS下写过程序,能行吗?
A:
绝对能行,相对8086/8088,现在的CPU在基本指令方面,也没有添加多少新的指令。你只需了解一下各寄存器的变化以及补充
一下Windows程序的知识就成了。而且,既然你用汇编在DOS下写过程序,那么对Debug等调试器,肯定已经很上手了,所以你有
先天的优势。
Q:
汇编对我来说不成问题,可我为什么总是不上手呢?
A:
呵呵,这样的老鸟倒还有不少,他们把汇编用的相当熟练,但是,只是因为经验的原因,所以才觉的不上手的,许多人当初
不也都这样吗?最起码我就是,见了CALL就跟进,呵呵,倒跟了不少API,所以对于这部分高手,你只需多练练手以及掌握一些分析
的技巧就成了。
Q:
我没学过编程,能学汇编吗?
A:
总的来说,也行。不过希望汇编的学习,不会使你丢掉学习其它高级语言的信心。

答网友问
Q:
寄存器可以随便用么,有没有什么限制?写个程序的时候那些变量什么的可以放在任意的寄存器么?
A:
呵呵,我现在就来回答楼上朋友的问题。
寄存器有它的使用机制,及各个寄存器都有着明确的分工。
如小翠儿 如数据寄存器(EAX-EDX),它们都是通用寄存器,及在软件中,任何数据都可存放于此。但是除此之外,它们又都可以
用于各自的专用目的。
例如:
EAX
可以作为累加器来使用,所以它是算术运算的主要寄存器。在乘除法等指令中指定用来存放操作数。比如在乘法中,
你可以用ALAXEAX来装被乘数,而AXDX:AXEAXEDX:EAX则用来装最后的积。
EBX
一般在计算存储器地址时,它经常用作基址寄存器。
ECX
则常用来保存计数值,如在移位指令它用来装位移量、循环和串处理指令中作隐含的计数器。
最后就剩下EDX了,一般在作双字长运算时把DXAX组在一起存放一个双字长数(你还记的什么是双字长吧,举个例子,
比如说有一个数二进制数据01101000110101000100100111010001,你要把它寄存起来,就可以把0110100011010100(即高十六位)
放在DX中,把0100100111010001(即低十六位)放在AX中,这个数表示为DX:AX)当然完全可以用一个EDX就把这个数给装下。
所以,还可以用EDX:EAX来装一个64位数据,这个你会推断出来吧。
ESPEBPEDIESI,我上边儿以经大概介绍的
差不多了,所以这里不说它们了。 当然还有其它的一些限制,因为我们只是要看程序的汇编代码(人家写好了的,肯定不会犯错误吧)
而不是要去写,所以可以不必掌握。有性趣的话,去看相关书籍。
另外再说一下你的最后一个问题写个程序的时候那些变量什么的可以放在任意的寄存器么?这句话我不明白你要问的是什么。我想
你可能是把一些关点给搞错了,变量这词通常都是出现在高级语言中的,而你用高级语言写程序的话,完全不用理解那些寄存器什么的,
这些都跟高级语言没什么关系。但是最终,高级语言也还是把你写的程序转换为对寄存器、内部存储器的操作。
第三章—Windows程序


这一章我都不知道该如何写了,呵呵~~
毕竟,Win32是一个非常深奥的系统,目前还容不得我这种小辈在这儿说三道四,不过,我既然是要写给那些入门阶段的朋友们看的,又不是写给那些搞程序设计老鸟看的,所以,我也犯不着怕被人背后指着骂 本章的名字就叫《Windows程序》而不是《Windows程序设计》所以,我只是讲一些关于Windows程序运作的原理:
Windows
为什么叫Windows,相信所有用过的朋友都可以明白,那桌面上一个一个的窗口,就是它名字的由来。也就是这一个又一个窗口的出现,使计算机的使用一下子简单了巨多。几年前接触过电脑的朋友一定知道DOS吧,不知道的话,去问加解密工具下载版的版主老哥,让他跟你解释 你还记的DOS下那黑乎乎的窗口吧,没见过的哥们儿可以在开始菜单中找出来看看。DOS通过一系列的命令来进行相应的操作,如进入一个目录,删除一个目录等等等等。那种工作方式就叫做命令提示符方式,也即命令行。
现在国内不懂电脑的人还老爱说要想学电脑,必须要英语过关。(就是这个,吓跑了多少仅仅是想学习一些基本操作的朋友)可能也就是源自DOS的原因吧。
后来,随着硬件的支持以及技术上的提高,当然还有为了使电脑更方便的服务与人,慢慢的就有了所谓的视图操作系统,从此,你不用再记忆那些大堆的指令了,而且操作上,也有了相大的提高,可以说操作系统发展到今天的份儿上,操作已经够简单了,去看看那些在网吧里一把鼻涕的小孩子们吧
当然,就像当年DOS之于命令提示行一样,今天的Windows仍和当年一样,占据着大部分的用户群。
(场外:一观众扔来一烂柿饼,你是唐僧啊,这么多废话)
马上转入正题,Windows之所以好用,除了不用背N多的命令外,一个原因就是因为它本身提供了大量的标准Windows GUI函数。所以对于用户,面对的是同一套标准的窗口,对这些窗口的操作都是一样的,所以使用不同的应用程序时无须重新学习操作。不用像当年在DOS下面那样一安装新程序,就要马上看帮助,看说明。
Windows GUI函数,只不过是微软提供给程序开发人员的APIApplication Programming Interface 应用编程接口)中的一小部分而以。Windows API是一大组功能强大的函数,它们本身驻扎在 Windows 中供人们随时调用。这些函数的大部分被包含在几个动态链接库(DLL)中,譬如:kernel32.dll user32.dll gdi32.dll Kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作等等。
你可能多多少少听说过API函数,如果你不太清楚到底是怎么一回事的话,我尽量给你解释的清楚一点。
不知道你有没有想过,Windows中的那一个又一个窗口是怎么画出来的呢?呵呵,你可能用VBDelphi编过程序,你有没有想过你写的程序中的那些窗口是怎么形成的?是控件变成的。倒呵呵,相信你当初学VBDelphi的时候,所看的书上一定对可视化编程环境大肆赞扬了一番吧,是不是也提到过比VC++怎么怎么方便?怎么怎么不用再为生成程序的界面而花费大量无用时间了等等。
(台下上来一东北民工:小子,你找抽啊,还讲不讲了)
马上开说,其实我只是想告诉你,所有你用的Windows下的程序,都是通过调用一个又一个的Windows API来执行相应任务的,没有API,你的程序什么也做不了。用VBDelphi以及MFC的朋友也许会说我根本没有调用什么API啊!其实这些API都是由你所用的开发环境自动进行相应的转换的。比如说你用Delphi新建一程序,什么也不用动就直接按F9来运行它,是不是出现一个空白的窗体?这就是个标准的Windows程序,它有Windows程序所具有的一切特征,如最大化按钮、最小化按钮、关闭按钮你可以通过鼠标来移动它。
但是如果你想用VC++MASM32来写这样一个程序,那么你有两种方法,在VC++中,你可以用MFC或直接调用API,而在MASM32中,你就只有直接调用API这一种方法。所谓直接调用API,就是指所有的操作都通过最原始的API来完成。通过直接调用API来生成这样一个程序,你必须要先注册窗口类(除非您使用 Windows 预定义的窗口类,如 MessageBox dialog box);然后产生窗口;然后在桌面显示窗口(除非您不想立即显示它) 然后刷新窗口客户区;
麻烦吧,如果你想真正的让这个程序能正常地运行下来,还要再加入以下步骤:
1.
你要得到您应用程序的句柄。2.窗体显示后就进入无限的获取窗口消息的循环。3. 如果有消息到达,由负责该窗口的窗口回调函数处理。4. 如果用户关闭窗口,进行退出处理。
上面这此步骤,都需要调用相应的API来完成。比如说得到程序的句柄用GetModuleHandle注册窗口类用RegisterClassRegisterClassEx;注册后,还要用CreateWindowEx函数来生成相应窗口,而后用ShowWindow来显示它,之后还会用UpdateWindow 来更新客户区等等等等。这些还都不算呢,如果你真通过直接调用API去写一个稍大一点儿的程序的话,你会发现那是一个多么不令人愉快的事情。
上面说的这些,只不过是API中的一小小小小小小小小小小….部分,这才几个,真正的API有成百上千个,包括对系统各个方面进行的操作。没有API,你的程序什么也干不了。比如说你的程序中有一个Edit控件,VB中应该叫做Text控件吧,你想将用户输入到里面的信息放到一个变量中去,那么Delphi中可以用Str:=Edit1.text来实现。VB中应该是Str=Text1.Text;但是如果你用API,想要得到Edit输入框里的文本内容,就要调用GetDlgItemIntEdit中输入的值当做数值来用)GetDlgItemTextGetDlgItemTextAEdit中输入的值当做字符串来用)。而上面我说的VBDelphi得到编辑框中输入的内容的方法,最终在编译成可执行文件的时候,也会由编译器自动对其进行相应的转换。你只要明白一件事就好了,那就是你所用的程序,无时无刻都在调用着系统中的各种各样的API函数。
其实Windows中的API,就相当于当年DOS系统中的系统功能调用,及中断21。只不过在数量上和功能上,都是DOS系统功能调用所不及的。
如果你还是看不明白,那我不怪你,可能是我讲的不清楚,所以,还是给你推荐老牛写的书吧。力推《Windows程序设计》,看过之后你会内力大增的,那时候你所知道的知识就不止是API而以了。
其实话说回来,我这篇文章不是教你编程的,所以关于Windows程序的原理,没有必要说那么多,我之所以跟你讲API,是想让你知道Windows程序的运行机制。免的到时候用调试器下断点的时候问什么是API。(众人(十分愤怒地)冲上台来:拉下去PK!把我们当什么了!
(我再次来到台上,镜头切向脸的一侧,来个特写。只见上面有若干处大小不同的伤口)可能还有些重点的地方我没有提到,欢迎指正。如果你有什么不明白的地方,欢迎跟贴提问。只要别太那个,比如说你能把所有的API给我列出来让我回去背背好吗?
附上几个常用的API函数吧。相信你此时因该以经对API有个大概的了解了。
MessageBox
显示一信息对话框
MessageBoxEx
显示一信息对话框
MessageBoxIndirect
显示一定制信息对话框
(以上这三个,可以用来中断那些错误提示,比如说你注册码输入错误了,程序就可能通过这几个函数中的一个,来提示你错误)
GetDlgItemInt
得指定输入框整数值
GetDlgItemText
得指定输入框输入字符串
GetDlgItemTextA
得指定输入框输入字符串
(软件可以用这三个来得到用户输入的注册码)
GetLocalTime
得当前本地时间
GetSystemTime
得当前系统时间
(软件可以用这两个来判断软件是否过期)
RegQueryvalueA
获取一个项的设置值
RegQueryvalueExA
获取一个项的设置值
RegSetvalueA
设置指定项或子项的值
RegSetvalueExA
设置指定项的值
(如果软件用注册表存储注册信息的话,那么这几个也许会有用)
上面讲的,只是几个平时比较常见的,更多请参见看雪以前的教程或Windows开发人员手册。
最后,我们还要隆重介绍一个重量级函数,你可能不知道API是什么,但你只要用过调试器,就一定知道它的名字。你可以不知道美国现任的总统是谁,但是你一定要知道这个函数。我虽然知道现任美国总统是鲍威尔 但我同时也知道这个函数是谁。
它就是—-吴孟达!(导演:NG)重新说。它就是hmemcpy
这个函数是干什么的?
它是一个非常简单的函数。只完成一项非常非常基本的任务,就是把数据从一个地方复制到另一个地方。应用程序本身并不调用它,理由很简单,它很低级(汇编:谁敢说跟我一样?)。但是大部分API函数却非常频繁地调用它。所以,它也叫万能函数。平时你可能都不知道有这么个东西,但是断起程序来却非常管用。但目前到了2KXp下,却没有这个函数了,与之相应的是一个叫memcpy的函数,虽然功能与其相同,但是基本上已经是个废人了 总知,你用memcpy根本就断不下什么来。所以,这么一个好使的函数只能在98下使用了。这就像美国的总统一样,再好使也只能使八年,不好使的就别说了。说不定明年就把他踢飞
别的我也不多说什么了,这章你就知道API是什么就成了。
如果你觉的有什么不妥的地方或有什么问题,并且想文明一点地表代出来的话,就请在回复。如果想野蛮一点的话,就拿鸡蛋往你显示器上丢吧
第四章调试器及相关工具入门


在写这章之前,我看了一下看雪以往的教程。本来想参考一下,可忽然发现,写这样的一章,是一件非常愚蠢的事情,因为我觉的关于这些工具的使用教程。看雪教程中已经写的够详细的了,我并不认为你会看不懂。所以我不想做浪费时间的人,本章就此搁浅。
推荐看《Crack Tutorial 2001》,推荐看《看雪论坛精华一、二、三、四》,推荐看《加密与解密--软件保护技术及完全解决方案》,推荐看一切与之有关的教程。
本章补遗:
要想上路,你最少应该熟练掌握以下工具:
SoftICE
:目前公认最好的跟踪调试工具。(由于我使用的分辩率的关系,从没有用过它)
Trw2000
国人骄傲,其中有我最喜欢的pmodule命令。(河南老乡,殷墟旧人)
W32Dasm8.93
或其它任意版本:反汇编的极品工具。
Hiew
或者Ultra Edit或者其它:十六进制工具。爆破时使用,DOS下使用HiewWindows下使用Ultra EditWinHexHex Workshop等,我个人喜欢用Ultra Edit
侦测文件类型工具:比如TYPgtwFileInfo等。这是一个能侦测你的软件是被哪一种「壳」给加密了。
PROCDUMP
与其它N多的脱壳软件。
EXESCOPE
:拥有执行文件(EXE, DLL)的解析与显示功能;提取资源到外部文件 ;资源的重新写入;记录文件的记录及其再编辑(成批编辑)等功能。是汉化软件的常用工具,当然破解软件时也很有用。
其它许多……(等你入了门后再学也不迟)
(作者注:以上工具的使用方法,大都可在看雪以有的教程中找到,故不愿复之)第五章破解原理
从本章开始,我们来一步一步学习Crack软件(80%读者昏死过去,且不省人世另有20%在寻找附近可以用来打人的东西)
不可不说一下学习破解的三个阶段:
初级,修改程序,ultraedit等工具修改exe文件,称暴力破解,简称爆破
中级,追出软件的注册码
高级,写出注册机
先说这爆破。所谓爆破,就是指通过修改可执行文件的源文件,来达到相应的目的。你不明白?呵呵,举个例子好了,比如说某共享软件,它比较用户输入的注册码,如果用户输入的,跟它通过用户名(或其它)算出来的注册码相等的话(也就是说用户输入的注册码正确了),那么它就会跳到注册成功的地方去,否则就跳到出错的地方去。
明白过来了吧,我们只要找到这个跳转指令,把它修改为我们需要的造型,这样,我们是不是就可以为所欲为了?(某软件双手放在胸口,你要干嘛?)
常见的修改方法有两种,我给你举例说明:
no.1
在某软件中,这样来进行注册:
00451239 CALL 00405E02 (
关键CALL,用来判断用户输入的注册码是否正确)
0045123D JZ 004572E6 (!!!<–
此为关键跳转,如果用户输入的注册码正确,就跳向成功处,即004572E6)
0045XXXX YYYYYYYYYY
XXXXXXXX YYYYYYYYYY
XXXXXXXX YYYYYYYYYY
XXXXXXXX
执行到此处,就提示用户注册失败
提示用户注册码不正确等相关信息

004572E6 … <–(
注册成功处!!!)
提示用户注册成功等相关信息
呵呵,看明白了吗?没有的话,我来给你讲一下。在软件执行到00451239处的时候,CALL0045E02处来进行注册码判断。接着回来后就来一个跳转语句,即如果用户输入的注册码正确就跳到004572E6处,跳到此处,就算是注册成功了。如果用户输入的注册码不正确的话,那么就不会在0045123D处进行跳转,而一直执行下去。在下面等它的,是注册失败部分。
想明白了吗?嘿嘿没错,我们只要把那个关键跳转JZ给改为JNZ(如果用户输入的注册码错误,就注册成功,输入正确则注册失败)。当然你也可以将JNZ修改为Jmp,这样的话,你输入的注册码无论正确与否。都可以注册成功。
no.2
我们再来讲一下另外的一种情况:
00451239 CALL 00405E02 (
关键CALL,用来判断用户输入的注册码是否正确)
0045123D JNZ 004572E6 (!!!<–
此为关键跳转,如果用户输入的注册码不正确,就跳向失败处,即004572E6)
0045XXXX YYYYYYYYYY
XXXXXXXX YYYYYYYYYY
XXXXXXXX YYYYYYYYYY
XXXXXXXX
执行到此处,就提示用户注册成功
提示用户注册成功等相关信息

004572E6 … <–(
注册失败处!!!)
提示用户注册码不正确等相关信息
这次我相信,并且深信不疑。你一定明白了。我还是不明白
你一定看出跟第一种情况不同的地方了吧。没错!它与第一种不同的,就是第一种情况是如果注册码正确,就跳到注册成功处,如果没有跳走,就会执行到失败处。而这一种情况则是如果注册码不正确,就跳到注册失败处,否则将执行到注册成功处。
这种情况的修改,除了把JNZ改为JZ外,还可以将其改为NopNop这个指令没有任何意义,将该条指令修改为Nop后,便可随意输入注册码来进行注册了。
原理以经给你讲了,下面我们再来讲一下具体的修改办法吧。(我假设你以经明白了我所说的工具的使用方法)
先说一下虚拟地址和偏移量转换的问题,在SoftICEW32Dasm下显示的地址值是所谓的内存地址(memory offset),或称之为虚拟地址(Virual AddressVA)。而十六进制工具里,如:HiewHex Workshop等显示的地址就是文件地址,称之为偏移量(File offset) 或物理地址(RAW offset)
所以当我们要通过那些十六进制工具来对可执行文件中的相应指令进行修改的话,先要找到它的File offset。我们没有必要去使用那些专门的转换工具,在W32Dasm中就有这个功能,比如说你W32Dasm中来到0045123D处,在W32Dasm界面下方的状态栏中?
004572E6 … <–(
注册失败处!!!)
提示用户注册码不正确等相关信息
这次我相信,并且深信不疑。你一定明白了。我还是不明白
你一定看出跟第一种情况不同的地方了吧。没错!它与第一种不同的,就是第一种情况是如果注册码正确,就跳到注册成功处,如果没有跳走,就会执行到失败处。而这一种情况则是如果注册码不正确,就跳到注册失败处,否则将执行到注册成功处。
这种情况的修改,除了把JNZ改为JZ外,还可以将其改为NopNop这个指令没有任何意义,将该条指令修改为Nop后,便可随意输入注册码来进行注册了。
原理以经给你讲了,下面我们再来讲一下具体的修改办法吧。(我假设你以经明白了我所说的工具的使用方法)
先说一下虚拟地址和偏移量转换的问题,在SoftICEW32Dasm下显示的地址值是所谓的内存地址(memory offset),或称之为虚拟地址(Virual AddressVA)。而十六进制工具里,如:HiewHex Workshop等显示的地址就是文件地址,称之为偏移量(File offset) 或物理地址(RAW offset)
所以当我们要通过那些十六进制工具来对可执行文件中的相应指令进行修改的话,先要找到它的File offset。我们没有必要去使用那些专门的转换工具,在W32Dasm中就有这个功能,比如说你W32Dasm中来到0045123D处,在W32Dasm界面下方的状态栏中就会出现该条指令的虚拟地址和偏移地址,即@:0045123D @offset 0005063Dh 后面的这个0005063Dh就是相应的偏移地址。我们得到该地址后,便可用UltraEdit等十六进制工具来对可执行文件进行修改了。比如使用UltraEdit,你先用UltraEdit打开该可执行文件,然后按Ctrl+G,接着输入你得到的偏移地址,就可以来到其相应的机器码处。
再给你讲一下机器码,所谓的机器码。就是你看到的那些个十六进制数据了。还记的它们与汇编指令是一一对应的吗?
以下这几个是爆破时要用到的,其它的如果感兴趣,可自行查看相关资料:
JZ=74;JNZ=75;JMP=EB;Nop=90
爆破的时候,只要对以上机器码进行相应的修改就行了,比如第一种情况的时候,可以将74修改为EB,即将JZ修改为JMP。而第二种情况,责需将75修改为90,即将JNZ修改为Nop
由于本章只讲原理,具体一点的。如怎样找到关键跳转等,我们在下一章中再讲。(一个砖头飞了上来!嘿嘿,这次被俺接到了)
上边讲了爆破的原理,你需要明白的是。爆破只是你学习Crack的开始,是很简单的手段。刚入门的时候可以玩玩儿,但希望你不要就此不前!
(嘿嘿,再说了。人家的软件中不是都说了嘛,不准对其进行逆向修改。你动了人家的身子,怎么能不买帐呢?
偶就不喜欢爆破,做不出注册机也要找出注册码。否则我就不会去注册这个软件,既然想不掏钱,就要靠你自己的本事。(等以后我有钱了,会考虑去注册那些优秀的共享软件的 )。所以,从某种意义上来说,我是一个正人君子
其实要找到注册码并不是一件多么难的事,我是指你所针对的软件不太那个的时候 不过你无需惧怕。
刚才我们说爆破的时候不提到过关键CALL吗?一般情况下,这个关键CALL就是对两个注册码(一个是软件自身通过你的注册名或机器什么的计算出来的正确的注册码,令一个就是你输入的错误的注册码)进行比较。我前边提到过,CALL之前一般会把所用到的数据先放到一个地方,CALL过去的时候再从这些地方把先前放入的数据取出来,进行相应的处理。这个关键CALL也是这样,在CALL之前,一般会把那两个注册码放到堆栈或某个寄存器中。嘿嘿,我们只要在调试器中,单步执行到该CALL,在未进去之前通过CALL之前的指令判断其将正确的和不正确的注册码放到哪里了。然后再用相应指令进行查看就成了,我说过不难的。
下面列出两个最常见的情况(可参考相关教程):
no.1
mov eax [ ]
这里可以是地址,也可以是其它寄存器
mov edx [ ]
同上,该条指令也可以是pop edx
call 00??????
关键call
test eax eax
jz(jnz)
jne(je) 关键跳转
看明白了吧,在关键CALL之前,软件会把两个注册码分别放入eaxedx中,你只要在CALL处下d eaxd edx就能看到正确的注册码了。
no.2
mov eax [ ]
这里可以是地址,也可以是其它寄存器
mov edx [ ]
同上,该条指令也可以是pop edx
call 00??????
关键call
jne(je)
关键跳转
以上两种情况最为常见,而那些个不太常见的情况,我们这里就不再提了。到下下一章的时候,我会给你讲相关方法的
关于查找软件注册码的部分,就到这里。具体内容,下下一章咱们再说。(不是说了吗?我以经可以接到你的砖头了,干嘛还要丢呢? )
最后,再来说最后的所谓的高级阶段,如果你相信自己。并且热爱Crack,那么你一定会熬到这个阶段的,只是时间因人而异。
其实分析软件的算法,是有好多技巧在里面的。呵呵,最起码我刚开始的时候就摸不着头脑,那么多CALL,每个看起来,都很重要,都追一遍?结果连好多API都被追了进去。等你自己真正用心分析了一个软件的算法,并写出了注册机后。你就会明白其中的道理了,我们下下下一章再说。(大哥,你不是吧,连你家太阳能都丢过来了
第五章爆破软件


爆破其实很简单,最起码比你能一下把你家的牙膏给全挤出来要容易多了。你只要先到大街上买几根雷管,然后放到你的显示器上再点着就OK(不难吧,记的点着后跑远点儿)
爆破的原理我也说过了,相信你很容易就能理解了。我们今天就具体讲一下如何找到那个关键跳转以及如何才能买到即便宜又好用的雷管
爆破一个软件一般只需要很少的几个步骤,首先先看一下其有无加壳,有的话是用何工具加的壳,知道了以后用相应的工具将其脱掉或进行手工脱壳,参考以有教程。接着我们就可以对脱过壳之后的软件来开刀了。你有两种选择,用W32Dasm或调试器,一般如果你遇上的是那种很菜的软件的话,用W32Dasm就可以搞定了。如果遇上的不是那种比较菜的,就买股票吧,因为股票是你如胶似漆的妻子!当!快醒醒啊哦,一般如果你遇上的不是那种很菜的软件的话,就用调试器吧。先来说W32Dasm:我们首先用W32Dasm来进行反汇编(废话!)之后在串式参考中找到错误提示信息或可能是正确的提示信息双击鼠标左键来到相应的地址处。在W32Dasm的主窗口中分析相应汇编代码,找出关键跳转和关键call。绿色光条停在关键跳转,W32Dasm主窗口底部找到关键跳转的偏移地址(实际修改地址)。用ultraedit找到偏移地址(实际修改地址)修改机器码(或放上一根雷管),保存(点火)!而用调试器也同样简单,等会儿会详细说明。
道理废话了那么多,来实例动手说明吧:
首先讲解用W32Dasm来进行爆破:
【软件名称】中华压缩(ChinaZip
【软件版本】7.0
【文件大小】1041KB
【适用平台】Win9x/Me/NT/2000
【软件简介】ChinaZip(中华压缩)是一款压缩、解压各种压缩文档的工具软件,它支持包括ZIP格式文件在内的各种常见压缩格式如:ARJCABGZIPJARLHATARZOOARCLZHPak等等。
软件的出处是电脑报2001年的合订本配套光盘,7.0时的保护做的很那个,目前最新版应该好多了
好的,我们开始吧,首先第一步是你得把它装上(引来野狼N头),之后先随便找个字符串填上去注册一下,会看到一个错误对话框,提示\"注册码不正确,无法注册\"。接着我们用FI来看一下它用的是什么壳。ASPack 2.001caspr出场。脱过壳后我们用W32Dasm花上半分钟或半小时的时间来对它进行反汇编。我们以经反汇编完毕。之后在串式参考中(字符串数据参考)中找刚才你看到的那个错误提示,找到之后双击几次,发现其只有一处调用。我们会来到004F0E64处,我把具体代码给贴上(请你从代码的最下边开始看):
:004F4DD1 E84EE1F3FF call 00432F24
:004F4DD6 8B55F0 mov edx, dword ptr [ebp-10]
:004F4DD9 8D4DF4 lea ecx, dword ptr [ebp-0C]
:004F4DDC 8BC3 mov eax, ebx
:004F4DDE E8C9010000 call 004F4FAC
:004F4DE3 8B55F4 mov edx, dword ptr [ebp-0C]
:004F4DE6 58 pop eax
:004F4DE7 E830F3F0FF call 0040411C
:004F4DEC 7576 jne 004F4E64 <–
这个就是传说中的男人,Stop!这个就是传说中的关键跳转
:004F4DEE B201 mov dl, 01
:004F4DF0 A158254500 mov eax, dword ptr [00452558]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F4D86(C)
|
:004F4DF5 E85ED8F5FF call 00452658
:004F4DFA 8945FC mov dword ptr [ebp-04], eax
:004F4DFD 33C0 xor eax, eax
:004F4DFF 55 push ebp
:004F4E00 685D4E4F00 push 004F4E5D
:004F4E05 64FF30 push dword ptr fseax]
:004F4E08 648920 mov dword ptr fseax], esp
:004F4E0B B101 mov cl, 01

* Possible StringData Ref from Code Obj ->\"Software\\XDZHAN\\ChinaZip\"
|
:004F4E0D BAA84E4F00 mov edx, 004F4EA8
:004F4E12 8B45FC mov eax, dword ptr [ebp-04]
:004F4E15 E822DAF5FF call 0045283C

* Possible StringData Ref from Code Obj ->\"Real Programmers Use Pascal!\"
|
:004F4E1A B9CC4E4F00 mov ecx, 004F4ECC

* Possible StringData Ref from Code Obj ->\"Key\"
|
:004F4E1F BAF44E4F00 mov edx, 004F4EF4
:004F4E24 8B45FC mov eax, dword ptr [ebp-04]
:004F4E27 E854DEF5FF call 00452C80

* Possible StringData Ref from Code Obj ->\"
软件注册成功,谢谢您的支持!\" <–我们向上看会在这里发现注册成功后的正确信息。正确信息处向上找第一个跳转就是我们要找的关键跳转。
|
:004F4E2C B8004F4F00 mov eax, 004F4F00
:004F4E31 E8563DF6FF call 00458B8C
:004F4E36 A16C305000 mov eax, dword ptr [0050306C]
:004F4E3B 8B00 mov eax, dword ptr [eax]

* Possible StringData Ref from Code Obj ->\"
中华压缩(ChinaZip)-注册版\"
|
:004F4E3D BA244F4F00 mov edx, 004F4F24
:004F4E42 E80DE1F3FF call 00432F54
:004F4E47 33C0 xor eax, eax
:004F4E49 5A pop edx
:004F4E4A 59 pop ecx
:004F4E4B 59 pop ecx
:004F4E4C 648910 mov dword ptr fseax], edx
:004F4E4F 686E4E4F00 push 004F4E6E

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F4E62(U)
|
:004F4E54 8B45FC mov eax, dword ptr [ebp-04]
:004F4E57 E868E2F0FF call 004030C4
:004F4E5C C3 ret


:004F4E5D E9C2E9F0FF jmp 00403824
:004F4E62 EBF0 jmp 004F4E54

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F4DEC(C)
|

* Possible StringData Ref from Code Obj ->\"
注册码不正确,无法注册!\" <–这个就是出错的信息了,那正确信息也就在附近,上下看看。
|
:004F4E64 B8484F4F00 mov eax, 004F4F48 <–
双击来到这里
:004F4E69 E81E3DF6FF call 00458B8C
:004F4E6E 33C0 xor eax, eax
:004F4E70 5A pop edx
:004F4E71 59 pop ecx
:004F4E72 59 pop ecx
:004F4E73 648910 mov dword ptr fseax], edx
:004F4E76 689B4E4F00 push 004F4E9B
你可能有点不明白,为什么我说它就是关键跳转呢?还记的在破解原理中我举的例子吗?
我再给你讲一遍好了,通常我们会遇到两种关键跳转,我分别举例说明:
(1)
je (jne,jz,jnz) 19870219
…….. XXXXXXXXXX
…….. XXXXXXXXXX
……..
软件注册正确的相关信息


19870219
软件的出错信息
…….
…….
也就是说这第一种情况是先判断注册码是否正确,如果不正确就跳到19870219处,正确的话就不跳转,一直执行下去,直至注册正确处。
对于这种情况,我们要找的关键跳转,就是正确信息上面的第一个跳转。我们可能对其作相应修改或将其给nop掉就万事OK了。
(2)
je (jne,jz,jnz) 19870219
…….. XXXXXXXXXX
…….. XXXXXXXXXX
……..
软件的出错信息


19870219
软件注册正确的相关信息
…….
…….
而这第二种情况就是先判断注册码正确与否,如果正确就跳到19870219处,不正确的话就不跳转,一直执行下去,直至出错处。
对于这种情况,我们要找的关键跳转就是出错信息上面的第一个跳转。将其做相应修改或改为jmp后我们就可以为所欲为了
呵呵,道理也都给你讲明白了,我们来改一下试试吧。我们在W32Dasm中选中关键跳转,在右下角的状态栏中看到相应的偏移地址为000F41EC。好的,我们用UltraEdit来打开它。Ctrl+G,接着输入0xF41EC,回车后便会跳到相应的位置。相应的机器码是75(jne),我们将其改为74(jz)后存盘退出。
好了,运行一下看看,我们来随便输入一个注册码注册一下试试。呵呵,注册成功!
W32Dasm我们就讲到这里,呵呵,很简单的,你下去之后自己找些保护简单的软件上上手吧。
我们接着来讲用调试器来进行爆破。
如果你真的试图用W32Dasm去爆破几个软件的话,用不了多少时间你就会发现一些问题。比如说有的软件你用W32Dasm反汇编后串式参考根本就不能用。或者串式参考中没有出错或正确的信息。还有就是有的软件就算你通过串式参考来到了相应的地方,刚想去找关键跳转你就会发现眼前的东西比你想像中的要乱的多虽然你有可能通过认真仔细地找,仍会找到,但我不认为那是一件聪明的事情。毕竟,有一些动静是只有在程序执行期间才能看出来的。好的,如果你用W32Dasm遇到了找不到关键跳转的软件,就去用调试器吧!(你用调试器前可先用W32Dasm打开一遍看个先,如果很容易就让你找到了。那就没必要了)
在开始之前我们有必要讲一下用调试器来爆破的步骤(我知道你一定会用调试器的 ):首先,我们当然还是要把你要Crack的软件给装上(我挡我挡我挡,不要乱丢东西嘛!)然后来到输入注册码的地方,仍旧随便输入一个,接着不要按确定,待我们把调试器叫出来先。还记的我前面跟你讲的API的事情吗?软件要得到你输入的注册码,就一定会调用某个API函数来达到目的。我们就在调试器中用相应的API来做断点,这样的话,只要一有程序调用这个API,就会被调试器给拦截下来。
GetDlgItemInt
GetDlgItemTextGetDlgItemTextA这三个函数可能会有用。但是如果你用的是98,那为什么不用hmemcpy呢?那真的是一个不错的主意。当我们下完断点后就返回到你要注册的那个软件中,点确定这类的按钮。如果被调试器给断了下来,就说明你刚才下的断点有用,如果没有被断下来,就换个断点试试。接下来我们在调试器中来取消刚才你下的那个断点,我们以TRW2000为例(SoftICE与其操作大体相同)取消断点用bc *指令。然后我们就输入pmodule指令来返回到程序的领空(而在SoftICE中由于没有相应指令,呵呵,狂按F12吧)。现在我们把话题岔开一下,什么是领空呢?举个例子吧,你的程序要得到你输入的那个注册码,就会去调用相应的函数。比如调用GetDlgItemTextA,而GetDlgItemTextA本身又会去调用Hmemcpy这个函数,而这些函数都是存在于系统中的某个DLL文件中的。那么当这个程序调用相应的API函数的话,程序的领空就会转到这个相应的DLL文件中去执行这个API函数。(你就这样理解就行了)我前边也说过了,Hmemcpy这个函数应用程序本身并不直接调用,而是由其它的API函数来调用。那么,你就可以理解为你的程序调用了一个API函数,调用的同时程序的领空会转到这个API所在的DLL文件里,而这个API又调用了Hmemcpy函数,那么此时领空就会又转到了Hmemcpy所在的DLL文件中,之后当Hmemcpy执行完毕,就会返回到调用它的API的领空中去,而当这个API执行完毕的后就会返回到调用它的应用程序的领空中去。比如说我们用Hmemcpy这个函数来当断点,当我们输入完注册码按确定后,程序就会去调用某个API来得到你输入的那些数据,而这某个API”又会去调用Hmemcpy,所以程序就被断到了。当然此时程序的领空也就不会在应用程序中了,但是当我们输入过pmodule指令之后我们就可以反回到应用程序本身的领空中去了。这样的话你看到的就是应用程序自身的代码了,而不是API的!好了,我接着刚才的说(到哪儿了来着?)当我们返回到程序自身的领空中去后就一直狂按F12吧,F12的作用是一直执行程序,直到遇上ret等指令。也就是一大坨一大坨地来执行程序^_^你一直按F12,直到程序出现注册错误对话框。然后记下刚才你按的次数,接着从头做起,这一次按F12的次数是你刚才按的次数-1,也就是说比上一次要少按一次。而后按键由F12换至F10(怎么没有F4?),还是一路狂按,直到软件提示出错,这次记下你按F10的次数。好的,再从头来一遍,我们再次按F10的时候,要一步一步慢慢来,一般你按F10的次数离你上次按的次数相差五六步的时候,一般就会看见一个CALL,接着是一个跳转指令。你一步一步地来,看过了这个跳转指令之后会不会跳走,如果跳走了,那一般你不会再过两三步就应该出错了。当然也有可能是你没有跳走,而过了两三步就出错了。这个应该不难理解,因为基本上它和我前边跟你介绍过的是一个道理。然而另外一种情况是你一路按F10下来,到了最后会发现根本没什么跳转指令,呵呵,别害怕,这个很常见的。遇上这种情况,我们只要把F10的次数变换为上次按F10的次数-1,这样的话你一般就会停在一个CALL处,而这个CALL,就是程序中的关键CALL,我们之后要吃点儿苦,要按F8追进去分析它,程序注册的成功与失败,就在这个CALL中,也就是说我们要修改的关键跳转,也在这个CALL中。呵呵,其实也很好理解的,就是把我上边说的那些个判断什么地放到了一个CALL里面。我们按F8追进去之后便仍旧按F10来一步一步执行,过不了多长时间你就会发现关键跳转了,找关键跳转的方法跟我前边说的一样,即按F10的次数跟上一次差五六步的时候慢下来,就会看到了。
你应该明白,程序是很灵活的东西,并没有那么多公式化的东西在里边,大概的分析方法就是这个样子,一切都要靠你自己去掌握,别人跟你讲,也只是讲一个分析的方法而以,我相信随着你以后经验的提高,你慢慢地就能应付各种情况了。
现在,我们再用调试器来对CHINAZIP这个软件进行分析,希望你能够掌握这个并不难的方法。
首先,你要把刚才爆破过了的再改回来,或直接重装一遍。之后我们打开它,任意输入注册码,接着按Ctrl+N呼出TRW,下断点hmemcpy。下过后按F5退出(它就是不用F4,我也没办法^_^)然后我们点击确定。好的,程序被断了下来:
KERNEL?HMEMCPY
0147:9e62 push bp
0147:9e63 mov bp,sp
0147:9e65 push ds
0147:9e66 push edi
0147:9e68 push esi
0147:9e6a cld
0147:9e6b mov ecx,[bp+06]
0147:9e6f jcxz 9ee9
……
以下N多代码省略……
我们输入bc *来取消断点,然后用pmodule来返回到程序的领空:
0167:00436d13 mov [ebx+0c],eax
0167:00436d16 mov eax,[ebx]
0167:00436d18 cmp eax,byte +0c
0167:00436d1b jnz 00436d38
0167:00436d1d mov edx,[ebx+08]
0167:00436d20 push edx
0167:00436d21 mov ecx,[ebx+04]
0167:00436d24 mov edx,eax
0167:00436d26 mov eax,esi
0167:00436d28 call 00432b24
……N
多代码仍旧省略……
7F12另加1F10来到0167:004f4dc4处,我们接着一下一下来按F10,大概按了10多下,就可以看到004f4dec处有一个跳转,我们执行到004f4dec处后果然跳走了。会跳到004f4e64处,我们跳过去之后按不了三下,程序就提示出错了。呵呵,明白过来了吧,004f4dec处的那个跳转jnz 004f4e64就是关键跳转,嘿嘿,找到了之后不用我说了吧
0167:004f4dc4 mov eax,[ebp-08]
0167:004f4dc7 push eax
0167:004f4dc8 lea edx,[ebp-10]
0167:004f4dcb mov eax,[ebx+02e0]
0167:004f4dd1 call 00432f24
0167:004f4dd6 mov edx,[ebp-10]
0167:004f4dd9 lea ecx,[ebp-0c]
0167:004f4ddc mov eax,ebx
0167:004f4dde call 004f4fac
0167:004f4de3 mov edx,[ebp-0c]
0167:004f4de6 pop eax
0167:004f4de7 call 0040411c
0167:004f4dec jnz 004f4e64 <–
关键跳转!!
0167:004f4dee mov dl,01
0167:004f4df0 mov eax,[00452558]
0167:004f4df5 call 00452658
0167:004f4dfa mov [ebp-04],eax
0167:004f4dfd xor eax,eax
0167:004f4dff push ebp
0167:004f4e00 push dword 004f4e5d
0167:004f4e05 push dword [fs:eax]
0167:004f4e08 mov [fs:eax],esp
0167:004f4e0b mov cl,01
0167:004f4e0d mov edx,004f4ea8

再来给你举另一个例子:
【软件名称】天网防火墙
【软件版本】2.46 Beta
【文件大小】1289KB
【适用平台】Win9x/Me/NT/2000
【软件简介】天网防火墙个人版是一套给个人电脑使用的网络安全程序,它可以帮你抵挡网络入侵和攻击,防止信息泄露,并可与我们的网站相配合,根据可疑的攻击信息,来找到攻击者。同时天网防火墙个人版把网络分为本地网和互联网,可以针对来自不同网络的信息,来设置不同的安全方案,它适合于在拨号上网的用户,也适合通过网络共享软件上网的用户。
该软件仍旧是我从电脑报2001年合订本的配套光盘中找的,软件的注册码可以到其网站免费获得
我们还是要先把它装上(某民工:你小子敢再说一句废话试试!^_^)之后我们用FI看一下它有没有加壳,呵呵,BC++编译,没有加壳,爽!运行它,在注册对话框中随便输入点什么,比如说这星期又出了几部新电影,都叫什么名字等等
好的,我们接下来请TRW2000出场。先胡乱输入两个字符串,比如第一个输入英雄的导演是?第二个输入可能是赵本山
接下来就按Ctrl+NTRW2K叫出来,下bpx hmemcpy,之后按F5退出。
接着可以按确定就成了,程序会被TRW2K断掉,我们紧接着输入bc *以及pmodule
下面可以开始按F12了,一共按8下程序就会报错,我们第二次就按7下然后开始按F10,按70F10程序就又报错了(呵呵,一定要有耐心哦)。
好的,我把反汇编后的代码给你贴出来:
0167:0041c617 lea edx,[ebp-04] <–7
F12后按一下F10来到这里
0167:0041c61a mov ecx,[0052ae7c]
0167:0041c620 mov eax,[ecx]
0167:0041c622 mov eax,[eax+0318]
0167:0041c628 add eax,byte +2c
0167:0041c62b call 00517740
0167:0041c630 dec dword [ebp-20]
0167:0041c633 lea eax,[ebp-04]
0167:0041c636 mov edx,02
0167:0041c63b call 00517710
0167:0041c640 mov word [ebp-2c],14
0167:0041c646 lea eax,[ebp-08]
0167:0041c649 call 00401d60
0167:0041c64e mov edx,eax
0167:0041c650 inc dword [ebp-20]
0167:0041c653 mov ecx,[ebp-40]
0167:0041c656 mov eax,[ecx+02e0]
0167:0041c65c call 004b9f14
0167:0041c661 lea edx,[ebp-08]
0167:0041c664 mov ecx,[0052ae7c]
0167:0041c66a mov eax,[ecx]
0167:0041c66c mov eax,[eax+0318]
0167:0041c672 add eax,byte +30
0167:0041c675 call 00517740
0167:0041c67a dec dword [ebp-20]
0167:0041c67d lea eax,[ebp-08]
0167:0041c680 mov edx,02
0167:0041c685 call 00517710
0167:0041c68a lea eax,[ebp-10]
0167:0041c68d call 00401d60
0167:0041c692 mov edx,eax
0167:0041c694 inc dword [ebp-20]
0167:0041c697 mov ecx,[ebp-40]
0167:0041c69a mov eax,[ecx+02e0]
0167:0041c6a0 call 004b9f14
0167:0041c6a5 lea edx,[ebp-10]
0167:0041c6a8 push dword [edx]
0167:0041c6aa mov word [ebp-2c],20
0167:0041c6b0 lea eax,[ebp-0c]
0167:0041c6b3 call 00401d60
0167:0041c6b8 mov edx,eax
0167:0041c6ba inc dword [ebp-20]
0167:0041c6bd mov ecx,[ebp-40]
0167:0041c6c0 mov eax,[ecx+02d4]
0167:0041c6c6 call 004b9f14
0167:0041c6cb lea edx,[ebp-0c]
0167:0041c6ce mov edx,[edx]
0167:0041c6d0 mov eax,[0052ae7c]
0167:0041c6d5 mov eax,[eax]
0167:0041c6d7 pop ecx
0167:0041c6d8 call 0040525c
0167:0041c6dd mov [ebp-45],al
0167:0041c6e0 dec dword [ebp-20]
0167:0041c6e3 lea eax,[ebp-10]
0167:0041c6e6 mov edx,02
0167:0041c6eb call 00517710
0167:0041c6f0 dec dword [ebp-20]
0167:0041c6f3 lea eax,[ebp-0c]
0167:0041c6f6 mov edx,02
0167:0041c6fb call 00517710
0167:0041c700 cmp byte [ebp-45],00
0167:0041c704 jz 0041c750 <–
按了60多下F10后会在这里发现一个跳转,嘿嘿,就是它了!!!
0167:0041c706 mov ecx,[0052ae7c]
0167:0041c70c mov eax,[ecx]
0167:0041c70e mov eax,[eax+0318]
0167:0041c714 call 00411fd0
0167:0041c719 mov word [ebp-2c],2c
0167:0041c71f mov edx,00521b50
0167:0041c724 lea eax,[ebp-14]
0167:0041c727 call 005175b0
0167:0041c72c inc dword [ebp-20]
0167:0041c72f mov eax,[eax]
0167:0041c731 call 004b41b0
0167:0041c736 dec dword [ebp-20]
0167:0041c739 lea eax,[ebp-14]
0167:0041c73c mov edx,02
0167:0041c741 call 00517710
0167:0041c746 mov eax,[ebp-40]
0167:0041c749 call 004a81d0
0167:0041c74e jmp short 0041c77d
0167:0041c750 mov word [ebp-2c],38
0167:0041c756 mov edx,00521b6b
0167:0041c75b lea eax,[ebp-18]
0167:0041c75e call 005175b0
0167:0041c763 inc dword [ebp-20]
找到了关键跳转之后就别闲着了,呵呵,放雷管吧!(你可以用W32Dasm打开这个文件,然后按Shift+F12,之后输入0041c704,这样就可以在右下角看到相应的偏移地址了)
小技巧:在TRW中,如果你觉的某处可能是关键跳转的话,可以用r fl z这个指令来进行测试,该指令可使以成立的条件取反,比如说本来JZ XXXXXXXX成立,可以跳走了,用r fl z指令后该条指令就不成立了,即就不会跳走了。以上也是,你可以在0041c704处输入r fl z,呵呵,再执行几步看看,是不是成功了?还有就是如果你只是想达到注册软件的目的,且该软件只在注册的时候验证一次的话,用这个方法就可以代替雷管了!
呵呵,最后还是要说一句,爆破只是一些雕虫小技。刚入门时玩几次就够了,切莫就此不前
后话:你可能慢慢就会发现,有一些软件其实并没有你想象中那么简单,你甚至连找到它的关键跳转都找不到。这很正常,你要做的便是多动手多练习,慢慢你就会明白过来的。我今天之所以给你举这两个例子,就是因为它们两个都比较简单,且能说明重点,给你讲那些比较那个的软件的爆破,反而会让你看的一头雾水

第六章-寻找软件的注册码


我们来寻找软件真正的注册码!
寻找软件的注册码就像你小时玩的躲猫猫一样,简单又有趣,虽然后来你会不这样觉的
好的,我们开始。
我不知道你有没有明白我前面在原理中讲的那些东西,如果没明白,我就再说一遍
软件通过你输入的用户名或者机器码什么的生成一个正确的注册码来与你输入的注册码进行比较,如果两个相同,也就是说你输入的注册码是正确的话,那软件就会完成注册。如果你输入的不正确,嘿嘿,当然就不会注册成功。
好的,现在你已经知道软件会有一个比较两个注册码的过程,这就是关键所在。一般如果你遇到的是那种明码比较的软件,这会是一件非常另人愉快的事情的
软件会先计算出正确的注册码然后再与你输入的那个进行比较,也就是说正确的注册码会被软件自己算出来!嘿嘿,搜身你会吗?虽然法律以及道德不允许我们去搜身,但
我接着说,虽然现在的软件已经比以前要厉害上许多,但,那种用明码比较的,还是大有人在的。所谓明码比较,就是说软件先算出正确的注册码,然后放到内存或你家的沙发下面,之后再得到你输入的那个注册码,接着就比较了。呵呵,好理解吧,我们只要找到那个比较的地方,看一下软件把注册码放到内存的哪里了,再到相应的内存处瞧一瞧,就万事OK了!
还记的对你说过的那些常见的(也是最菜的)比较吗?我捡其中最简单的一个来给你再解释一下:
mov eax [ ]
这里可以是地址,也可以是其它寄存器 该条指令也可以是mov eax [ ]
mov edx [ ]
同上 通常这两个地址就储存着重要信息 该指令也可以是 pop edx
call 00??????
关键call
jz(jnz)
jne(je) 关键跳转
第一条mov eax [ ]指令是将一个内存地址或另外一个寄存器(该寄存器中装的是内存地址)装入eax中。第二条指令与其相同,是将一个内存地址或另外一个寄存器中的内存地址装入edx中。而这两条指令是干什么的呢?嘿嘿嘿嘿
这两条指令就是用来存放真假两个注册码的地址的,也就是说eaxedx这两个寄存器中此时一个装的是正确的注册码的内存地址,一个是你输入的那个错误的注册码的内存地址。软件在比较注册码前将两个注册码的内存地址分别装入到两个寄存器中,然后就是关键Call出场。在这个关键Call中对注册码进行比较时,软件会从相应的寄存器中取出两个注册码来比较,接着出来就是一个关键跳转,通过上面Call中的比较结果来做相应的跳转
你应该已经想到什么了吧!没错,我们只要找到软件的关键Call,然后在关键Call处来查看相应的内存地址就可以找到正确的注册码了 而这一切,都可以通过调试器来完成。从某种意义上来说,如果你能自己一个人把你家的微波炉修好,那你就绝对会用调试器 我们在调试器中,只要一步一步执行到关键Call处,然后用d eaxd edx就可以查看两个地址中放的两个注册码,如果你发现其中的一个是你自己刚才输入的,那么另一条就是正确的
而所谓的内存注册机呢?我这里就不再多说了,它的原理就是自动在软件注册的时候中断到相应的地方,并显示相应内存处的值,当然它是需要配置的此类软件有CRACKCODE2000和注册机编写器keymake,具体用法你可以参考软件的联机帮助^_^
我们剩下的问题就是如何来找个这关键Call了,基本上来说你就用前边给你讲爆破时的那种方法就可以了,很简单的
但是就像你家后门的玻璃可能永远擦不干净一样,我们家后门的玻璃也从来没擦干净过 导演:NG!重说,就像所有事情都有例外一样,有些软件的关键Call会比较难找一点,但如果你掌握了适当的方法,同样也会很好找的
我们就来玩玩吧:
首先,我们还来用CHINAZIP这个软件上上手^_^
它已经是我们的老朋友了,所以就不用再介绍它了吧
好的,我们先装上它(嘿嘿,偶就是喜欢说废话,你打偶偶也要说^_^)接着我们点帮助-注册,输入Nameuunb[CCG],Code:19870219
然后请出我们的老伙计TRW2000,bpx hmemcpy F5点确定被拦:
KERNEL?HMEMCPY
0147:9e62 push bp
0147:9e63 mov bp,sp
0147:9e65 push ds
0147:9e66 push edi
0147:9e68 push esi
0147:9e6a cld
0147:9e6b mov ecx,[bp+06]
0147:9e6f jcxz 9ee9
省略N多代码
输入bc *,删除断点。pmodule ,直接跳到程序领空:
0167:00436d13 mov [ebx+0c],eax
0167:00436d16 mov eax,[ebx]
0167:00436d18 cmp eax,byte +0c
0167:00436d1b jnz 00436d38
0167:00436d1d mov edx,[ebx+08]
0167:00436d20 push edx
0167:00436d21 mov ecx,[ebx+04]
0167:00436d24 mov edx,eax
0167:00436d26 mov eax,esi
0167:00436d28 call 00432b24
省略N多代码
8F12就会提示出错,我们第二次就按7 接着我们再来按F10,按16下就会报错,好的,我们再来:这一次我们按F10的时候,就按我前边说过的方法,到与上次按的次数相差五六次的时候就慢下来。好的,我们按十来下的时候就慢下来仔细瞅瞅,呵呵,一下子就看到004f4dec处的那个跳转以及它上面的关键CALL 我们按F10单步执行到004f4de7(即关键CALL)后下指令d edx就可看到真正的注册码,而d eax则可以看到我刚才输入的19870219 代码给你:
0167:004f4dc4 mov eax,[ebp-08] <—7
F121F10就来到这里(此时ebp-08处放的是刚才输入的注册码19870219)
0167:004f4dc7 push eax <—
EAX压栈;
0167:004f4dc8 lea edx,[ebp-10]
0167:004f4dcb mov eax,[ebx+02e0]
0167:004f4dd1 call 00432f24 <—
CALL用来得到用户输入的用户名,其实就是某个API函数,嘿嘿,好奇的话可以追进去看看
0167:004f4dd6 mov edx,[ebp-10] <—
将得到的用户名放入EDX;
0167:004f4dd9 lea ecx,[ebp-0c]
0167:004f4ddc mov eax,ebx
0167:004f4dde call 004f4fac <—
CALL用来计算出真正的注册码;
0167:004f4de3 mov edx,[ebp-0c] <—
将计算出的真.注册码放入EDX,在下条指令时可用D EDX查看;
0167:004f4de6 pop eax <—
先前压入的注册码出栈;
0167:004f4de7 call 0040411c <—
CALL用来比较两个注册码,罪魁祸首啊!;
0167:004f4dec jnz 004f4e64 <—
不相等则跳,跳必死,暴破将75改为74EB,当然90也行;
0167:004f4dee mov dl,01
0167:004f4df0 mov eax,[00452558]
0167:004f4df5 call 00452658
0167:004f4dfa mov [ebp-04],eax
0167:004f4dfd xor eax,eax
0167:004f4dff push ebp
0167:004f4e00 push dword 004f4e5d
0167:004f4e05 push dword [fs:eax]
0167:004f4e08 mov [fs:eax],esp
0167:004f4e0b mov cl,01
0167:004f4e0d mov edx,004f4ea8
0167:004f4e12 mov eax,[ebp-04]
0167:004f4e15 call 0045283c
0167:004f4e1a mov ecx,004f4ecc
0167:004f4e1f mov edx,004f4ef4
0167:004f4e24 mov eax,[ebp-04]
0167:004f4e27 call 00452c80
0167:004f4e2c mov eax,004f4f00
0167:004f4e31 call 00458b8c
0167:004f4e36 mov eax,[0050306c]
0167:004f4e3b mov eax,[eax]
0167:004f4e3d mov edx,004f4f24
0167:004f4e42 call 00432f54
0167:004f4e47 xor eax,eax
0167:004f4e49 pop edx
0167:004f4e4a pop ecx
0167:004f4e4b pop ecx
0167:004f4e4c mov [fs:eax],edx
0167:004f4e4f push dword 004f4e6e
0167:004f4e54 mov eax,[ebp-04]
0167:004f4e57 call 004030c4
0167:004f4e5c ret
0167:004f4e5d jmp 00403824
0167:004f4e62 jmp short 004f4e54
0167:004f4e64 mov eax,004f4f48 <—
由上面的0167:004f4dec处跳来,挂!;
0167:004f4e69 call 00458b8c
0167:004f4e6e xor eax,eax
整理:
Nameuunb[CCG]
CodeCCG5296
可以真接在TRW2000中下断点bpx 004f4de6,中断后用D EDX来查看真.注册码。
另附:CRACKCODE2000CRACKCODE.INI
[Options]
CommandLine=CHINAZIP.exe
Mode=2
First_Break_Address=4f4de7
First_Break_Address_Code=E8
First_Break_Address_Code_Lenth=5
Second_Break_Address=404123
Second_Break_Address_Code_Lenth=2
Save_Code_Address=EDX
呵呵,是不是很简单?我说过了嘛,其实并不难的
我不知道你有没有发现,其实上面的软件的关键CALL还是很好找的,相信你用W32Dasm就中以找出来,那为什么不用呢?对于那些比较简单的软件,何必非请出调试器呢?
给你贴个用W32Dasm找关键CALL:
【软件名称】e族百变桌面
【软件版本】4.0
【文件大小】1316KB
【适用平台】Win9x/Me/NT/2000
【软件简介】提供25种变换桌面的方式,让你的桌面焕然一新。操作简单,无需费力学习。支持多种Internet流行图片格式。将壁纸文件打包,方便存储、转发。将壁纸包展开,还原图片文件。
嘿嘿,我也懒的去折腾我的小猫了,咱们就还用电脑报2001年合订本配套光盘上的软件吧 (2002年的偶没有买)
首先装上它(嘿嘿,你习惯了?为什么不丢东西了? ^_^)运行一下该软件先,该软件自动生成了相应的机器码,并停留在注册项上,输入注册码19870219,点确定,!
fi检查,该软件为Delphi编译,没加壳。
W32DASM打开该执行文件,参考-串式参考,在最下边,见到了刚才弹出的\"注册码不正确,请联系作者\"
用鼠标双击,发现只有一处调用,在00488E97,接着在串式参考对话框中在\"注册码不正确,请联系作者\"处向上找,找到\"感谢您支持国产软件,祝您好运\"(说的我都不好意思了)
用鼠标双击,仍旧只有一处调用,在00488DF7:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00488DCD(U)
|
:00488DD9 8B45FC mov eax, dword ptr [ebp-04]
:00488DDC 8B8020040000 mov eax, dword ptr [eax+00000420]
:00488DE2 35280BB61E xor eax, 1EB60B28
:00488DE7 3B45F8 cmp eax, dword ptr [ebp-08] <—
关键比较,? EAX来查看软件正确的注册码;
:00488DEA 0F85A0000000 jne 00488E90 <—
关键跳转,不相等就跳,跳必挂!
:00488DF0 6A40 push 00000040

* Possible StringData Ref from Code Obj ->\"
注册成功\"
|
:00488DF2 68D48E4800 push 00488ED4

* Possible StringData Ref from Code Obj ->\"
感谢您支持国产软件,祝您好运!\"
|
:00488DF7 68E08E4800 push 00488EE0 <—
双击串式参考便跳到此行,我们向上找第一个跳转处就是关键跳转,关键跳转上面就是关键比较;
:00488DFC 8B45FC mov eax, dword ptr [ebp-04]
:00488DFF E81CD2FBFF call 00446020
:00488E04 50 push eax
省略代码若干
向上看,00488DEA处有一跳转,不相等便跳到00488E90处,跳必挂!还记的00488E97处的出错对话框吧! 罪魁祸首啊!
在向上一行,看00488DE7:cmp eax, dword ptr [ebp-08],此为关键比较。可用? EAX查看软件正确的注册码。
整理:
打开该软件,在注册码处输入19870219,打开TRW2000,下断点bpx 00488DE7,点注册被拦。输入? EAX得到软件正确的注册码。
机器码:533226313
注册码:25061473
用注册机编写器keymake编写该软件的注册机:
点其它-另类注册机(F8),软件名称输入ePaper.exe,注册码选寄存器方式 EAX 十进制。
添加断点,中断地址:00488DE7,中断次数:1,第一字节:3B,指令长度:3
生成注册机后完工,万事OK!

嘿嘿,现在是不是觉的找软件的注册码越来越像小时候玩的躲猫猫了? 可惜偶小时候没有青梅竹马那种类型的伙伴
好的,我们这次讲个有点儿名气的软件,WinZIP8.1,这个软件相信大家都用过吧,反正偶是喜欢用RAR,不过也多少用过几天这玩意儿
如果你没听说过,那看介绍好了
【软件名称】WinZIP
【软件版本】8.1 Beta 2
【文件大小】1757KB
【适用平台】Win9x/Me/NT/2000
【软件简介】一个强大并且易用的压缩实用程序,支持ZIPCABTARGZIPMIME,以及更多格式的压缩文件。其特点是紧密地与Windows资源管理器拖放集成,不用离开资源管理器而进行压缩、解压缩。
不用我说了吧,出处仍旧是电脑报2001年合订本的配套光盘
我之所以先择它,是因为觉得它的关键CALL没有前边那两个那样好找(其实也就那样了^_^)极具代表性,而且通过它可以让你感受一下Ollydbg这个魅力比你家的荼几还大的调试器
这里之所以提到Ollydbg,是觉的它真是一个非常非常棒的调试器强烈建议你多玩几次…(MP3好听吗? ^_^)
我们来吧,首先当然还是要装上它(左闪术,右闪术),然后用Ollydbg来载入,此时界面会被分成四个部分,左上方是软件反汇编后的代码,右上方是寄存器开会的地方,左下方是内存区,右下方显示的则是堆栈的信息。
我们来下断点,按Alt+F4,之后选USER32,然后再鼠标右键–>搜索–>当前模块中的名称,然后在那一大堆函数中找到GetDlgItemTextA,按F2来下断点,它会提示你错误,并说无法设置中断点,是不是很过瘾?(呜呜呜大哥,我错了,再也不敢了…)
呵呵,这个我也不知道什么原因,明明是用了这个函数嘛,就是不让断,其实我对Ollydbg也不是太那个(关键是讨厌它的下断方式)看来还是用我们的万能断点吧,输入注册名Suunb[CCG],输入注册码19870219,然后用TRW2000下断bpx hmemcpy,断到之后,pmodule返回领空后一次F12就会出错,看来所有的东东就在这里了
我们用TRW2000再断一下,返回领空之后记着第一条指令的地址0040bd5f,呜呜呜上条指令明明是调用GetDlgItemTextA,为什么在Ollydbg中不让下呢?
没关系,我们记下这个地址后仍旧用Ollydbg来加载程序,之后在反汇编窗口中找到0040bd5f处,然后按下F2来下断(会变为红色),下断之后便按F9来运行程序,接着输入注册名Suunb[CCG],注册码19870219后按确定,程序会被Ollydbg给断到:
0040BD5F |. 57 PUSH EDI
0040BD60 |. E8 F34A0500 CALL WINZIP32.00460858
0040BD65 |. 57 PUSH EDI ; /Arg1

第七章注册码是怎样炼成的

你应该明白的是,并不是所有的软件作者都像你想象并希望的那笨 没有人愿意自己的软件被别人在调试器中用一条d指令就能找到正确的注册码要是那样的话还出来搞什么?
前边儿我们讲的查找软件注册码的方法是有针对性的,必须保证的是该软件使用的是明码比较,这样的话,我们只需找对地方,一个d指令就成了。那既然有明码比较这个词,就不难猜出还有相应的非明码比较非明码比较也比较容易理解,就是软件比较两个注册码的方法不同而以,并不是计算出正确的注册码后就与用户输入的进行比较,它可能会采用每计算出一位就与注码中的相应位比较一次,一但发现与用户输入的不同,就提示出错等等等等
遇到这样的软件,我们其实也可以找到其相应的注册码,但有点儿惨,要一位一位的计下来但是如果人家不给你面子,一但计算出某位不正确就跳走的话,那你怎么办?所以,国民想致富,种树是根本…NG!所以遇到这种软件,我们就只有对其算法进行分析,并做出注册机才是唯一的方法(如果你想写注册机的话)
你要明白,就算我们能找到那些采用明码比较的软件的注册码,原因也仅仅是因为其采用的是明码比较,所以我们没有什么值的高兴的地方,我们真正要做的,并不是找到一个注册码而以当然如果你刚入门,那对你的提高还是很有帮助的。我们Crack一个软件的最终目的,是对其进行相应的分析,搞懂它的注册算法并写出注册机,这样才算是成功的Crack了一个软件,成功后的心情是难以表达的!就像你便秘了多天后一下子排了出来一样 ^_^,呵呵这个比喻虽然粗俗,但是你可以想象一下,对一个软件进行仔细的分析,最后一下把它的算法给搞明白了,那种感觉我深信不疑的认为有一天你也能体会的到,偶等你
相信你以前看过那些高人大虾的关于软件注册算法分析的文章,同时也相信你有过试图跟踪分析某软件的举动,虽然后来的结果另人不太满意
其实分析一个软件的注册算法,这其中包括了一些技巧性方面的东西以及必要的经验,很难想象一个连调试器的使用都还没掌握的人试图去分析一个软件会是怎样一个场面嘿嘿,偶是见过的 使用调试器并不难,但那并不意味着你就能去分析一个软件了,见CALL就追这样的举动可不是偶一个人有过的经历,本章我尽量给你说明适当的分析方法。
相信大家都有不在父母陪同下独自使用调试器的能力以及看懂大部分汇编指令的能力了吧,那就够了!我们开始
正式开始今天的正题,我来举两个例子,相信这两个例子都有足够的表达能力,最起码比我们家楼下那个卖油条的表达能力要强多了
好的,首先,我们还是请出我们的那位老朋友吧 嘿嘿,在此,偶向CHINAZIP(中华压缩)v7.0的作者表示我内心最真诚的歉意!相信我用这个老版本的中华压缩不会给您带来经济上的麻烦
通过前边儿两章的讲解,我们已经把这个软件大体上给搞明白了,并且也追出了其相应的注册码。而我们今天的目的是对其注册算法进行分析,并写出注册机!这个软件的注册算法其实也比较简(并且存在Bug)用它来当例子,很能说明情况
好的,我们开始,前边儿追注册码的时候我们就已经知道了其用于计算正确注册码的关键CALL的所在位置为004f4dde,我们用TRW2000来对其进行分析!(鉴于目前大部分教程中仍以TRW2000为主,而且这个是大多数菜鸟都会用的调试器,偶就用这个调试器来做具体讲解)
先启动CHINAZIP,帮助注册(所以我才说这个软件非常适合写教程用嘛,注册后仍然中以再次注册)输入注册名Suunb[CCG],注册码19870219。之看按Ctrl+N呼出TRW2000,下断点bpx 004f4ddeF5返回。
接着就按确定吧,呵呵,被TRW2000拦到了。通过前边两章的分析,我们以经知道了004f4dde处的这个CALL用于计算正确的注册码,所以我们直接按F8跟进吧!注册码的算法,就包涵在这个CALL中,把它给分析透了,我们也就能弄明白软件的注册码是怎样生成的了。但是要怎么分析呢?这是一个比较严肃的问题,面对那一堆堆的指令,我不知道你是怎么想的,反正我第一次时是觉的找不着北,我怎么哪些重要哪些不重要呢?再说了,里面又包涵了那么多CALL,我还要一个一个地追进去看看?
呵呵,这就是我说的技巧所在了。其实也没什么可怕的,只要你汇编不是问题,就行了。我们首先可以先把这个计算注册码的CALL从头到尾执行一遍,搞明白其中大概的跳转以及其中某些CALL的作用,hehe~~你可以执行过一个CALL后就看一下各个寄存器的变化情况(如果寄存器中的值改变了,颜色就会变)如果某寄存器的值在CALL过之后改变了,我们就可以看一下其包含的值是何类型,如是内存地址就用d指令看一下,如是数值就看一下是不是得到你输入注册名或注册码的位数等等,这样的话就可以淘汰下来一大部分的CALL,因为有许多CALL的作用只是把注册名或注册码装入到内存中的某个地址或者得到注册名(注册码)的位数或注册码某一位的ASCII码,对与这些,我们不必深究。还是推荐你用Ollydbg,执行过一条指令后很多信息都可以看到 好的,我接着说,按F8追入CALL之后先大概走一遍我给出追入后的反汇编代码,并给出注释,相应的分析看后面
0167:004f4fac push ebp <–F8
跟入后的第一条指令
0167:004f4fad mov ebp,esp
0167:004f4faf push byte +00
0167:004f4fb1 push byte +00
0167:004f4fb3 push byte +00
0167:004f4fb5 push byte +00
0167:004f4fb7 push byte +00
0167:004f4fb9 push byte +00
0167:004f4fbb push byte +00
0167:004f4fbd push ebx
0167:004f4fbe push esi
0167:004f4fbf push edi
0167:004f4fc0 mov [ebp-08],ecx
0167:004f4fc3 mov [ebp-04],edx
0167:004f4fc6 mov eax,[ebp-04]
0167:004f4fc9 call 004041c0
0167:004f4fce xor eax,eax
0167:004f4fd0 push ebp
0167:004f4fd1 push dword 004f5097
0167:004f4fd6 push dword [fs:eax]
0167:004f4fd9 mov [fs:eax],esp
0167:004f4fdc xor esi,esi
0167:004f4fde lea eax,[ebp-0c]
0167:004f4fe1 mov edx,[ebp-04]
0167:004f4fe4 call 00403e24 <–
CALL过后用于得到用户输入的注册名
0167:004f4fe9 mov eax,[ebp-0c] <–
将得到的注册名的地址装用eax寄存器
0167:004f4fec call 0040400c <–
CALL用于得到用户输入的注册名的位数,并将其放入eax
0167:004f4ff1 mov edi,eax <–
将注册名的位数装入edi
0167:004f4ff3 test edi,edi <–
edi进行测试
0167:004f4ff5 jng 004f5051 <–
如果edi中的值为0就会跳走
0167:004f4ff7 mov ebx,01 <–ebx
1,用于后面的运算
0167:004f4ffc mov eax,[ebp-0c] <–ebp-0c
中装的是注册名的内存地址,此时将其付于eax
0167:004f4fff mov al,[eax+ebx-01] <–eax
中此时装的是注册名的内存地址,加上ebx中的值再减去01,用于得到注册码中的相应位的字符,比如说我们第一次执行到这里的时候ebx中装入的是01,再减去01后得到的值其实还是eax本身,这样就能得到注册名中的第一个字符了,而执行到后边再跳回来时ebx会加上1,所以就能得到下一个字符了
0167:004f5003 call 004f4f60 <–
这个CALL很重要,后面会说明我们是怎样知道它很重要的
0167:004f5008 test al,al <–
在这里我们会发现一个测试运算,对象是al,而al在前边CALL之前刚装入了注册名中的某一个字符,所以我们可以断定上面的那个CALL会对得到的字符做上一些手脚,待会儿我们再跟入
0167:004f500a jz 004f5031 <–
如果al中装的是0就跳到004f5031处,而al中的值会被004f5003处的那个CALL所改变
0167:004f500c lea eax,[ebp-18]
0167:004f500f mov edx,[ebp-0c] <–ebp-0c
中装的是注册名的内存地址,此时装入edx
0167:004f5012 mov dl,[edx+ebx-01] <–
跟前边儿004f4fff处的指令道理相同,得到注册码中的当前参加运算的字符
0167:004f5016 call 00403f34 <–
不重要!!
0167:004f501b mov eax,[ebp-18]
0167:004f501e lea edx,[ebp-14]
0167:004f5021 call 004088ac <–
不重要!!
0167:004f5026 mov edx,[ebp-14]
0167:004f5029 lea eax,[ebp-10]
0167:004f502c call 00404014 <–
CALL同样比较重要,其作用是这样的,如果当前参加运算的字符在前边004f5003CALL里进行运算之后符合了要求(符合要求后al会被置非0值)那么在004f500a处的跳转将会失去作用,而执行到这里后该CALL会将当前的这个符合要求的字符保存到00D3B3C4处(内存)!!后边儿会再详细说明
0167:004f5031 cmp ebx,byte +01 <–
用此时ebx中装的值减去1
0167:004f5034 jz 004f5040 <–
如果为零,也就是说此时计算的是注册名中的第一个字符的话就跳到004f5040
0167:004f5036 mov eax,[ebp-0c] <–ebp-0c
中装的是注册名的内存地址,该指令将注册名的内存地址装入eax
0167:004f5039 movzx eax,byte [eax+ebx-02] <–
用于得到上一个参加运算的字符
0167:004f503e jmp short 004f5046 <–
无条件跳转到004f5046
0167:004f5040 mov eax,[ebp-0c] <–ebp-0c
中装的是注册名的内存地址
0167:004f5043 movzx eax,byte [eax] <–
得到注册名的第一个字符
0167:004f5046 lea esi,[esi+eax*4+a8] <–!!!
这一条指令就是关键所在,后面会说明的!!!此指令先得到本轮参加运算的字符的ASCII码,然后乘以6,之后再加上a8(即十进制数168,呵呵,可以理解)同时再将这个字符计算得到的值与前面已经运算过的字符的值的和相加!
0167:004f504d inc ebx <–ebx
1,用于得到注册码的下一个字符
0167:004f504e dec edi <–edi
1edi中装的是注册码的位数
0167:004f504f jnz 004f4ffc <–
不为零就跳到004f4ffc处开始对下一个字符进行运算也就是说每计算完一个字符就将edi减去1,直到其为0也就是所有的字符全参加过运算为止。
0167:004f5051 lea edx,[ebp-1c] <–
把装注册码后半部分的地址装入edx,传给下面的CALL
0167:004f5054 mov eax,esi <–
将前面计算的注册码的后半部分的值装入eax
0167:004f5056 call 00408c70 <–
将前面计算得到的注册码后半部分的值转换为十进制,并装入ebp-1c
0167:004f505b mov ecx,[ebp-1c] <–epb-1c
中装的是注册码的后半部分
0167:004f505e lea eax,[ebp-0c]
0167:004f5061 mov edx,[ebp-10] <–ebp-10
中装的是注册码的前半部分
0167:004f5064 call 00404058 <–
CALL用于将前后两部分注册码合并置一起,合并后的注册码会存放置ebp-0c
0167:004f5069 mov eax,[ebp-08]
0167:004f506c mov edx,[ebp-0c]
0167:004f506f call 00403de0
0167:004f5074 xor eax,eax
0167:004f5076 pop edx
0167:004f5077 pop ecx
0167:004f5078 pop ecx
0167:004f5079 mov [fs:eax],edx
0167:004f507c push dword 004f509e
0167:004f5081 lea eax,[ebp-1c]
0167:004f5084 mov edx,05
0167:004f5089 call 00403db0
0167:004f508e lea eax,[ebp-04]
0167:004f5091 call 00403d8c ——————————

呵呵,看了我加了注释后的代码是不是好理解多了?你也许会问,你怎么知道那些CALL是做什么的?我前边儿不是说过方法了吗?我们先大概地过上一遍,看一下各个跳转,然后再大大概的看一下各个CALL的作用你以为上面这些注释是我过一遍之后就能写出来的?你多过几遍,心中就会有了个大概
你现在在想些什么?众人:站着说话不腰痛我晕~~
呵呵,我尽量说的仔细一些:
其实很好理解的,我们追了进来,之后大概的看一下那些个CALL,其中一些稍有经验的一看就知道是用来得到注册名或长度什么的之后我们再从头跟一遍跟到004f4ff3处,会发现其会对注册名的位数进行一个比较,看用户是否输入了注册名(也就是说如果edi中装的注册名的位数不大于0,即没输入就跳走,一会儿我会在后面说一下关于这点儿的Bug)而后在004f4ffc处我们会发现软件会得到注册名的内存地址,接下来的一条指令一看就知道是用来得到注册名中的各个字符的,嘿嘿,见到这类指令,马上就向下看吧,找一下下边儿哪条指令会再跳回到004f4ffc呵呵,我们会在004f504f处发现目标,好了,现在我们就知道了从004f4ffc004f504f之间的那些个指令会对注册名中的每一个字符进行计算
呵呵,也就是说软件从004f4ffc处开始先是得到注册名中的第N位字符,然后进行一系列的运算,之后执行到了004f504e处时把先前先到的注册名的位数减去1然后看其是否为0,不为0就再跳到004f4ffc处,然后得以注册名的N+1位再来进行计算。此举的目的就是为了看注册名的各位是否都被计算过了,如果不为0就说明还没有计算完,呵呵,很简单的道理嘛,edi中装的是注册名的位数,第计算过一位后就将其减1,减完了,注册名的各位也就都参加了运算
好的,我们再来看具体的算法部分:
004f4ff5的跳转,如果你输入了注册名,其就不会跳走偶输入的是Suunb[CCG],好的,此时会继续执行到004f4ff7处,该指令对ebx进行初始化给它付1,然后在004f4ffc处时会将ebp-0c中装的注册名的内存地址装入eax中,接着的004f4fff处用于得到注册名的第一个字符,并将其装入al。想象一下,eax中装的是注册名的内存地址,从该地址开始连续10个内存单元是我们输入的注册名S u u n b [ C C G ] 呵呵,明白了吗?eax中装的内存地址就是注册名在内存中的首地址,第一次执行到这里时ebx中装的是1eax+ebx-01后得到的还是注册名的首地址,也就是S。而等到后面004f504f处的跳转指令跳转回来之前,会在004f504d处有一条inc指令会给ebx1,这样的话再执行到这里时就会得到注册名中的第2个字符u了,嘿嘿,第三次来之前会再给ebx加上1,明白了吗?总知你可以把ebx中的值理解为当前参加运算的字符在注册名中的位数,即ebx1就是得到注册名的第一位(S),如果ebx2就是得到注册名的第2位(u.
而后紧接着在004f5003处会有一个CALL等着我们,呵呵,这个CALL比较关键,注册码的一部份由它来决定,要发现它的重要性并不难,因为在004f5003处下面会有一个跳转,跳转之前会对al进行测试,嘿嘿,而alCALL之前装入的是当前参与运算的字符并且你用调试器过一下这个CALL就会发现其对al进行了修改,呵呵,这个CALL会对al做一些处理,而处理的结果直接影响了后面部分的流程,所以,对于它,我们一定要跟进最好能派出两个人在边路对其进行防守,并找专门的后位对其盯梢
我们待会儿再跟进它,现在还是要先搞明白软件大体上的算法。好的,我接着说,在004f5008处对al进行了测试之后会有一个跳转,即如果al中此时装的值为0就跳到004f5031处去你可以理解为这个CALL会对字符进行一些运算,如果符合了要求,al就会被置01什么的,出来后的测试用来判断当前字符是否符合要求,如果符合就跳或不符合就跳
继续,由于我输入的注册名的第一个字符是S,而S刚好能通过004f5003处的那个CALL的计算 所以就没有跳走,我继续按F10进行单步执行接下来的004f500c004f500f004f5012这三条指令跟前边儿的得到注册码第N位字符的指令道理是一样的,你看注释好了而后面从004f5016004f5029处的这几条指令也没什么好讲的,对中间的两个CALL好奇的话可以进去大概看一下。得不到什么实质性的东西004f502c处的这个CALL嘛,就很重要了,呵呵,它的作用是什么呢?还记的我刚才说过的004f5003处的那个CALL吧,它执行过后会使al发生变化,它下面的跳转指令会根据al的值做相应跳转,即如果al0,就跳到004f5031处,刚好就跳过了004f502c处的这个CALL…而我输入的第一个字符是S,刚好符合了004f5003处那个CALL的要求,所以没有跳走,于是就执行到了这里,你可以追进去看一下,里面并不复杂,只是将当前参加运算的字符装入内存的00D3B3C4处(如果当前参加运算的字符在004f5003处没有通过,就不会执行到这里,呵呵,明白过来了吧,这个CALL用于收集注册名中所有符合004f5003处那个CALL要求的字符)
HOHOHO~~
(请模仿周星星式的笑声)现在我们已经明白了一半了好的,我们继续
不管你是从004f500a处跳到004f5031处的,还是一步步执行到这里的,总知,不管你输入的注册名中参加当前运算的那一个字符符不符合004f5003处的那个CALL的要求,总知都会执行到这里这条指令用来干什么呢?还记的ebx中装的是参加运算的字符在注册名中的相应的位数吗?cmp ebx,byte +01 就是用ebx减去1,该条指令的用途也就是看一下当前参加运算的字符是不是注册名中的第一个字符,如果是就跳到 004f5040处,否则继续我们先看004f5040处,当执行到此处时,ebp-0c中装的其实是注册名的内存地址(前边就已经说过了)在这里将其装入eax中,而后面004f5043处的指令的用途就是得到注册名的第一个字符好了,我们再拐回来看004f5036处,如果当前参加运算的字符不是注册名中的第一个字符,就不会跳走,而执行到这里时同样将ebp-0c中装的注册名的内存地址放入eax中,而004f5039处的eax,byte [eax+ebx-02]嘛,呵呵,很好理解,eax+ebx-01得到的是当前参加运算的字符的内存地址,而这里的eax+ebx-02得到的就是当前参加运算的字符的前面的那个字符,了解?
我们接着看004f5046处的那条指令吧,这个同样非常重要,它的作用是计算注册码的后半部分!
我相信你很容易就能理解它的意思了,当执行到这里时,eax中装的或者是注册码中的第一个字符,或者是当前参加运算的字符的前一个字符(注:字符在内存或寄存器中是以ASCII码来表示的,如Seax中会显示为00000053,而SASCII码便是53,十进制为83我们第一次执行到这里时,esi中的值为0(即00000000eax*4+a8的意思就是用当前参加运算的字符的ASCII码乘以4,再用积加上a8(也就是十进制数168,一路发?)再用这个和与esi相加,我已经说过了,第一次执行到这里时esi中的值为0…而当第二次执行到这里时,esi中装的便是注册名的第一个字符的ASCII码乘以4再加一路发的和
你会问你为什么知道它是计算注册码的后半部分的?猜的!!呵呵,当然不是,我们可以看到,在004f5054处,程序会将前面计算的结果装用eax中,后边儿紧接着就是一个CALL,嘿嘿,光天化日之下,这也太明显了吧,我们追进去大概看一下就知道它的作用是将十六进制的数转换为十进制的并将转换后的结果装入edx中装的内存地址处,在CALL之前我们会看到edx中的值以由004f5051处装入,即ebp-1c,呵呵,CALL过之后你用d ebp-1c看一下,就会看到你注册码的后半部分了
而后程序会在004f505b将注册码后半部分装入ecx中,在004f505e处时会将一个内存地址ebp-0c装入eax处(它的作用就是起一个传递参数的作用,在待会儿的CALL中会用eax中装入的值来存放结果)之后的004f5061处会将ebp-10装入edx中,ebp-10处装的是什么呢?我们用d ebp-10指令看一下就会知道它的地址为00D3B3C4,嘿嘿,你的嗅觉敏感吗?不敏感的话我就再说一遍,还记的004f502c处的那个CALL吗?它的作用就是收集符合004f5003处的那个CALL的要求的字符
嘿嘿,你明白过来了吗?
这个软件的注册算法是这样的:首先得到注册码的位数,看其是否大于0,不大于0就跳到004f5051好的,我们输入了Suunb[CCG]这个注册名,此时的注册码位数就是10,所以不会跳走,之后我们会来到004f4fff处,第一次执行到这里时会将注册名的第一个字符S装入al中,第二次来时会将注册名中的第二个字符(即u)装入al中,它的作用就是将当前参加运算的字符装入al中,之后紧接着就是一个CALL,这个CALL会对当前参加运算的字符进行计算接着出来会有一个跳转,看al中装的是不是0,如果是就跳到004f5031处,如果不是非0值就说明当前这个字符符合了要求,那么就会执行到004f502c处,这里的CALL会将其存放置内存的00D3B3C4而后到了004f5031处会有一个比较,作用是看当前参加运算的字符是不是注册名中的第一个字符,是的话就跳到004f5040处,在此将注册名的第一个字符装入eax,用来参加004f5046处的计算。如果当前参加运算的不是注册名的第一个字符,那么就会在执行到004f5039处时得到当前参加运算的字符前面的那个字符,将其装入eax后就无条件跳到004f5046处来参加运算。了解?也就是说你输入的注册名的第一个字符会参加两次计算,而最后一个字符不会参加计算(想想看,如果当前参加运算的字符是注册名中的第一个字符,它会参加计算,如果是第二个,就取前边的一个,即第一个又会参加一次计算,到了第三个的时候取第二个,到了第四个的时候取第三个而当最后一个字符
跳到0040446F处时,再得到的就是你输入的注册码的第3位了
00404488 |. 83C6 02 |ADD ESI,2 <–
同上,ESI加上2后再跳到0040446F处重新再来一遍时就会得到正确的注册码的第3
0040448B |. 3ACB |CMP CL,BL <–
再次比较CL是否为空
0040448D |.^75 E0 \\JNZ SHORT LIAOCACH.0040446F <–
不为空就再跳到0040446F处,来继续比较前4位中的13两位
0040448F |> 33C0 XOR EAX,EAX <–1-4
位全部比较完后会跳到这里
00404491 |. EB 05 JMP SHORT LIAOCACH.00404498
00404493 |> 1BC0 SBB EAX,EAX
00404495 |. 83D8 FF SBB EAX,-1
00404498 |> 3BC3 CMP EAX,EBX
0040449A |. 0F85 AB000000 JNZ LIAOCACH.0040454B
004044A0 |. 8D7424 38 LEA ESI,DWORD PTR SSESP+38] <–
与上面的大体相同嘛,将正确注册码的5-8位的内存地址装入ESI
004044A4 |. 8D4424 18 LEA EAX,DWORD PTR SSESP+18] <–
你输入的注册码的5-8位的内存地址装入EAX
004044A8 |> 8A10 /MOV DL,BYTE PTR DSEAX] <–
得到你输入的注册码的第5 or 7(道理我相信你一定已经明白了)
004044AA |. 8ACA |MOV CL,DL <–
再装入CL
004044AC |. 3A16 |CMP DL,BYTE PTR DSESI] <–
与正确的注册码的第5 or 7位比较
004044AE |. 75 1C |JNZ SHORT LIAOCACH.004044CC <–
不相等就跳走
004044B0 |. 3ACB |CMP CL,BL <–
BL中的00000000比较,看5-8位是否已经全部比较完毕
004044B2 |. 74 14 |JE SHORT LIAOCACH.004044C8 <–
是的话就跳走
004044B4 |. 8A50 01 |MOV DL,BYTE PTR DSEAX+1] <–
得到你输入的注册码的第6 or 8
004044B7 |. 8ACA |MOV CL,DL <–
装入CL
004044B9 |. 3A56 01 |CMP DL,BYTE PTR DSESI+1] <–
与正确的注册码的第6 or 8位比较
004044BC |. 75 0E |JNZ SHORT LIAOCACH.004044CC <–
不正确就跳走
004044BE |. 83C0 02 |ADD EAX,2 <–EAX
2,这样做的目的相信你已经知道了吧
004044C1 |. 83C6 02 |ADD ESI,2 <–ESI
也加上2
004044C4 |. 3ACB |CMP CL,BL <–
比较CL是否为空
004044C6 |.^75 E0 \\JNZ SHORT LIAOCACH.004044A8 <–
不是就跳回去再来一遍
004044C8 |> 33C0 XOR EAX,EAX <–5-8
位全部比较完后全跳到这里
004044CA |. EB 05 JMP SHORT LIAOCACH.004044D1
004044CC |> 1BC0 SBB EAX,EAX
004044CE |. 83D8 FF SBB EAX,-1
004044D1 |> 3BC3 CMP EAX,EBX
004044D3 |. 75 76 JNZ SHORT LIAOCACH.0040454B
004044D5 |. 8D7424 40 LEA ESI,DWORD PTR SSESP+40] <–
将正确的注册码的9-12位的内存地址装入ESI
004044D9 |. 8D4424 20 LEA EAX,DWORD PTR SSESP+20] <–
你输入的
004044DD |> 8A10 /MOV DL,BYTE PTR DSEAX] <–
得到你输入的注册码的第9 or 11
004044DF |. 8ACA |MOV CL,DL <–
装入CL
004044E1 |. 3A16 |CMP DL,BYTE PTR DSESI] <–
与正确的注册码的第9 or 11位比较
004044E3 |. 75 1C |JNZ SHORT LIAOCACH.00404501 <–
不对便跳走
004044E5 |. 3ACB |CMP CL,BL <–
CL是否为空,即看9-12位是否全部比较完毕
004044E7 |. 74 14 |JE SHORT LIAOCACH.004044FD <–
是的话跳走
004044E9 |. 8A50 01 |MOV DL,BYTE PTR DSEAX+1] <–
得到你输入的注册码的第10 or 12
004044EC |. 8ACA |MOV CL,DL <–
装入CL
004044EE |. 3A56 01 |CMP DL,BYTE PTR DSESI+1] <–
与正确的注册码的第10 or 12位比较
004044F1 |. 75 0E |JNZ SHORT LIAOCACH.00404501 <–
不相等就跳走
004044F3 |. 83C0 02 |ADD EAX,2 <–EAX
2
004044F6 |. 83C6 02 |ADD ESI,2 <–ESI
2
004044F9 |. 3ACB |CMP CL,BL <–
看是否全部比较完毕
004044FB |.^75 E0 \\JNZ SHORT LIAOCACH.004044DD <–
没有就跳回去再来一遍
004044FD |> 33C0 XOR EAX,EAX <–9-12
位全部比较完毕后会跳到这里
004044FF |. EB 05 JMP SHORT LIAOCACH.00404506
00404501 |> 1BC0 SBB EAX,EAX
00404503 |. 83D8 FF SBB EAX,-1
00404506 |> 3BC3 CMP EAX,EBX
00404508 |. 75 41 JNZ SHORT LIAOCACH.0040454B
0040450A |. 8D7424 48 LEA ESI,DWORD PTR SSESP+48] <–
嘿嘿,都讲了三遍了,你一定明白了吧,所以我把这最后一段留给你自己来看吧,从这里到00404530处我相信你猜也猜的出来 (众人:鄙视你!)
0040450E |. 8D4424 28 LEA EAX,DWORD PTR SSESP+28]
00404512 |> 8A10 /MOV DL,BYTE PTR DSEAX]
00404514 |. 8ACA |MOV CL,DL
00404516 |. 3A16 |CMP DL,BYTE PTR DSESI]
00404518 |. 75 1C |JNZ SHORT LIAOCACH.00404536
0040451A |. 3ACB |CMP CL,BL
0040451C |. 74 14 |JE SHORT LIAOCACH.00404532
0040451E |. 8A50 01 |MOV DL,BYTE PTR DSEAX+1]
00404521 |. 8ACA |MOV CL,DL
00404523 |. 3A56 01 |CMP DL,BYTE PTR DSESI+1]
00404526 |. 75 0E |JNZ SHORT LIAOCACH.00404536
00404528 |. 83C0 02 |ADD EAX,2
0040452B |. 83C6 02 |ADD ESI,2
0040452E |. 3ACB |CMP CL,BL
00404530 |.^75 E0 \\JNZ SHORT LIAOCACH.00404512
00404532 |> 33C0 XOR EAX,EAX <–
全部通过后来到这里
00404534 |. EB 05 JMP SHORT LIAOCACH.0040453B
00404536 |> 1BC0 SBB EAX,EAX
00404538 |. 83D8 FF SBB EAX,-1
0040453B |> 3BC3 CMP EAX,EBX
0040453D |. 75 0C JNZ SHORT LIAOCACH.0040454B
0040453F |. 8BC7 MOV EAX,EDI
00404541 |. 5F POP EDI
00404542 |. 5E POP ESI
00404543 |. 5D POP EBP
00404544 |. 5B POP EBX
00404545 |. 83C4 54 ADD ESP,54
00404548 |. C2 0400 RETN 4

我的注释写的还算清楚吧 ^_^,我再大概给你讲解一下:
软件的注册码是这样计算出来的,机器码中的各个字符的ASCII码加上1500后除以62的余数在密码表中对应的字符,就是相应的注册码。
比如说我这里的机器码为xn2urkeUMwpNv5xZxASCII码为78(十进制120) 78+5DC的值为654(1620) 接着用1620除以3E(62)得商268,好的,我们从密码表”0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ的开始处向后数8下,就会到了8这个字符,嘿嘿,这就是x对应的注册码。
好的,我给出Delphi的注册机(我仍将其写为函数的形式):
function KeyGen(Name: String): String;
var
String[16];
Ptring;
Keytring;
i,N,Z:integer;
begin
P:=\’0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\’;
if Length(Name)<16 then
Result:=\’
机器码必须为16…\’
else
begin
S:=Name;
for i:=1 to 16 do
begin
N:=Ord(S);
N:=N+1500;
Z:= N mod 62;
Z:=Z+1;
Key:=Key+P[Z];
end;
Result:=Key;
end;
end;

2006年04月04日

1. 进入控制面板,选择用户帐户,添加需要自动登陆用户密码。

2. 单击开始/运行,输入 rundll32 netplwiz.dll,UsersRunDll ,按回车键后弹出用户帐户窗口,选择要自动登陆的用户,添加密码(密码必须同1中的密码相符),然后取消选定"要使用本机,用户必须输入用户名和密码"选项。OK,重新启动XP时将自动登陆

早在2003年第1期《微型计算机》刊登了一篇关于破解Windows XP登录密码的文章,认真说起来这并不是破解,而是通过添加用户以另外一个新用户使用Windows XP,操作也略显繁琐。最近笔者在一些论坛“灌”到了关于Windows XP的掌管密码文件,一个新的破解登录方法无形在头脑中产生。

  首先找一台没有设置密码的Windows XP系统,进入XP系统盘的“\WINDOWS\system32”系统目录,把其中的名为“SPOOLSV.EXE”(50KB)拷贝到软盘或闪存里(如图1)。

WINXP


  图1 system32

友情提示:

  如果未在system32文件夹中找到指定文件,则说明当前系统隐藏显示系统文件,在资源管理器中点击菜单“工具→文件夹选项”,在“查看”标签页中撤消“隐藏受保护的操作系统文件(推荐)”复选框,并将“隐藏文件和文件夹”选择为“显示所有文件和文件夹”方式。

  准备好密码文件后,先确认待破解的Windows XP的文件系统(即磁盘系统格式),如果是FAT32,那么只需找一张启动盘,把软盘里的“SPOOLSV.EXE”拷贝到目标XP系统的“\WINDOWS\system32”文件夹覆盖。

  目标XP系统的文件系统是NTFS,如果是还装了能识别NTFS文件系统的其它操作系统(如Windows 2000或Windows Server 2003),直接进入系统进行覆盖。否则的话,可以在纯DOS状态下加载NTFS for DOS工具进行访问覆盖。

  替换文件后,正常方式启动Windows XP,可以不用输入密码直接进入Windows XP桌面已成功破解(多用户的XP系统会选择默认即第一个用户登录)。调出“Windows 任务管理器”工具(快捷键“Ctrl+Shift+Esc”),在“进程”列表中可以查看到“SPOOLSV.EXE”进程(如图2)。

WINXP


  图2 任务管理器

  请注意,通过此方法会造成XP无法使用休眠关机,切换用户时(快捷键“Win+L”)还会提示输入密码才能返回桌面,请读者们谨慎使用。另外本文只作技巧探讨,千万别用在非法目的,否则后果自负。^)^