【DOS 之编程相关】>>破解之初手
一、关于软件的简单介绍
大家都知道无论用什么语言编出来的程序。一般都可以分成两种:一种是解释型程序,如用vb,java,vfp,powerbuilder......等编的程序。它们并不是直接和cpu打交道。而是通过解释程序,一边解释一边执行。而另一种是编译程序,它必需通过编译才能执行。如用c语言编出来的程序。它和cpu的指令集直接打交道。而我们现主要讲的是编译程序,这就要涉用相关的汇编知识。
二、解密敏感指令
大家肯定都有这样一个经验,当你对一个软件注册,等你输完姓名,序列号,密码等项后按确定按钮时。如果你输入正确,会出现注册成功信息,相反则出现失败提示框,叫你重新输入。大家稍想一下肯定知道,在按下确定按钮之后计算机肯定有一个注册码比较过程或是运算过程(因为现大多数共享软件注册码获得方法是把你输入的用户名信息或序列号信息通过一定的运算而获得的),比如正确则通过,不正确,则出现提示错误。因此我们想破解一个软件首先要读懂它的相关的加密代码。所以必需要对软件进行反汇编。同时要掌握相关的汇编知识。对解密敏感的指令有:
cmp //比较指令
jz/je //相等或为‘0’则跳转
jnz/jne //不相等或不为‘0’则跳转
jl/jle //小于/小于或等于则跳转
jg/jge //大于/大于或等于则跳转
jmp //无条件跳转
示例:
cmp ax,bx //ax寄存器与bx寄存器数相比较
jz 001234 //如相等则跳转 至001234地址处执行。
jmp 000543 //如不相等则跳转至000543地址处执行.
别小看这段代码。如果ax寄存器放的是你输入的密码而bx放的是程序运算后的正确密码。如你的密码正确则去执行001234处(说不定那里就是注册成功信息框的代码:))。但一般我们没有这么好的运气,不然500万元的头彩每个人都拿得到了:),但是假使我们输入的密码是错的,但我们找到了这一比较代码,那么解决的办法就简单了,你可以直接把jmp 000543改成:jmp 001234不是照样注册成功。或把jz 001234改成jnz 001234。对就是这么简单。:)。其实你可以干脆看正确的注册码。对它就在bx中,打一个d bx就出来了。然后退用正确的注册码重新去注册一下就完事了。不过不要高兴的太早。这只是个简单的示例。再看下面。
and ax,bx //相与操作,ax与bx作‘与操作’运算
or ax,bx //相或操作,ax与bx作‘或操作’运算
test ax,bx //测试指令,测试ax与bx是否等值,相当于ax-bx但结果不保留它只改变标志寄存器
xor ax,ax //异或操作。
add ax,bx //加法运算 相当于 ax=ax+bx
sub ax,bx //减法运算 相当于 ax=ax-bx
inc ax //加‘1’ 相当于 ax++,或ax=ax+1
dec ax //减‘1’ 相当于 ax--,或ax=ax-1
mul //乘法运算
div //除法运算
这些指令在密码破解中都相当有用,因为现在的软件很少有这种可能:将密码存放在某段内存中再与你输入的密码作比较。而是通过一定的运算动态的给出,再与你的密码比较。所以上面的指令在一般的软件中都要用到。必需要熟记。并能综合应用。如不是很清楚可以去看一下有关汇编的书籍,上面都有。
三、解密工具的简单介绍
其实现在的解密工具有很多,一般分成两类。一种是静态解密,如w32dasm,hiew等。另一种是动态解密,如有名的soft-ice,trw2000,我们常用的debug调试程序,cv等。
静态解密工具一般先将程序反汇编,然后通过代码你要找到相应的加密代码的地址,然后读懂它的加密方法做出注册机。相对来说难度比较大。
动态解密工具也可以叫做跟踪程序。它跟踪程序的运行,通过下断点来跟踪到程序的加密部分,并可以直接修改源代码。跳过注册区。相对来说要简单一些。而一般在破解软件时都是两者相结合的。如先利用静态工具找到程序的加密部分再用动态跟踪至此部分直接修改等。
上回主要讲了一些有关汇编的基础知识、一般软件加密的手段和一些解密的敏感指令。对了上回漏掉了一个比较重要的指令:call,子程序调用指令。因为现在的程序容量越来越越大。 不可能你一个程序编到底。大都一个应用软件由好几个子程序组成,每个子程序都有各自的功 能。如负责界面的、对话的、加密的、主体部分等。我想用c语言编程的朋友都有这样的经验。只 是形式上有点不同。在汇编里用call 地址或call程序名来实现子程调用,执行完毕用ret(返回指令),返回到调用处继续执行下面的程序。在加密的子程序中比较经典的语句有:
call 044375 //调用044375处地址上的程序
test ax,ax //调用返回后测试调用结果ax
jz 0743458 //如测试结果为‘0’则跳转到074358处执行
一般情况下在破解如遇上如上指令时要注意了。可能已找到入口了。call 044375是调用算法子程序或是比较子程序。调完后设置标志。如成功则置ax 1或0。测试结果如密码错则跳至0743458 处。相必大家都很清楚0743458处是注册错误的信息了。而至于如何破解,想必大家心里已比较清楚了,在(一)也稍有提及过。前段程序还有一种可能:干脆算法程序结束后将运算结果存于ax 中(正确的密码)。如这样的话就可得出密码了了。:)。这些只是简单的例子,在实际的应用 中可能要复杂一些。这里只是能够起到抛砖引玉的效果。:)
好了!下面简单说说一些debug的调试命令。因这些在用到trw2000时有时要用到。其和debug完全兼容。debug的命令都是一些单一字母,后面跟着一个数或数值。
d命令:
语法:‘d [起始地址] ' 作用:显示指定内存地址或寄存器的内容
F命令:
语法:‘F<起始地址<结束地址<填入值’
作用: 修改内存内容
E命令:
语法: 'E<内存地址’
作用: 在指定地址中输入一串定节的数据
如e100 然后输入12345
G命令:
语法: G[结束内存地址] //注:‘[]’表示可选.'<>'必选。
执行内存程序,你可以一直g到底如:g 回车,也可以g一段程序 如:g 04567(执行到04567处停止)
A命令:
语法: A[内存地址]
作用: 用此命令可以在内存中直接编一段程序,并可以执行。
例如: a100 //下面是相应语句:
:0100 mov ax,1234
:0103 add ax,bx
:0105 push ax
:0106
然后可以:g 0106执行这一段。
u命令:
语法: U[起始地址],[结束地址]
作用: 将机器码反编译成汇编指令。
R命令:
语法: R[寄存器名]
作用: 显示寄存器内容
例如: r 回车:显示所有寄存器内容,r ax不用说了吧!
N命令:
语法: N<文件名>
作用: 当你在内存内编了一段小程序但你想保存它,并以后能在dos状态下执行,如用a命令编了一段程序.可以用n命今保存如:n temp.com
W命令:当你用N命令输入文件名后必须将该文 件保存在磁盘里,以备以后调用。W就是存盘命令。好了debug命令就讲到这里了,讲的有点简单不熟悉的朋友可以去试试。下面是比较重要的了。
trw2000的一般应用:
相信大家手头上都已以有了这个程序。如还没有的话也可以到这里下载。 w32dasm.zip trw2000.zip 执行该程序相 当简单双击图标即可。下面先讲相应的命令(别头大:)),以后可是要用到的!
调整窗口位置(如有些内你看不到,就要在窗内移动可视位置)
ctrl+光标键右:向右移一行
ctrl+光标键左:向左移一行
ctrl+光标键上:向上移一行
ctrl+光标键下:向下移一行
shift+ 光标键上:显示向上卷一行。
shift+ 光标键上:显示向下卷一行。
功能键:
F1: 不用说了吧!help
F4: 回复窗口
F5: 回到原程序
F6: 在命令行窗口中和程序代码窗中切换
F7: 执行到光标所在行处
F8: 单步执行(相当于deubg中的T命令)
F10: 单步执行(相当于deubg中的p命令)
F11: 执行到返回地址
还有一些。待发现中......:)
一些断点:
createwindow,createwindowex,dialogbox,createdialogparam,dialogboxindirect,createdialogindirect,getdlgitemtext,messagebox,hmemcpy(重点),lockmytask
还有好多,我知道的就这么一点了:)喜欢windows编程的朋友一看这些断点就知道 这些其实是windows函数。都是一些用于和用户对话的函数。
下断点函数:bp,bpx,bpm可能还有待大家去发现,其中最常用的是bpx
如bpx hmemcpy等
中断处理:
bd: 中止断点
be: 启动中断
bl: 列出中断
bpe: 编辑中断
bpt: 反中断点当样板
bc : 清除断点
bc,bd,bl比较常用,如想清除所有断点:bc* 我也只用过这几个断点,希望大家都能够去试试。好了!这里没有给出详细的使用方法,但大家都可以去体验一下,一般用一下就知道了。下回会把部分的使用方法给出。下面就简单的讲一下破解的一般步骤(是不是都已磨拳察掌了 ?:)):
(1)调入trw2000:双击图标。按'ok'按钮,程序自动缩小调至后台(能在任务栏右可看到),注:按ctrl+N组合键就可以激活,调出调试窗口。
(2)应用软件的载入:先将trw2000调至后台,然后运行软件,输入用户信息和注册码(可以随便输)。先不要急着按确定按钮。
(3)断点设置:按ctrl+N键调出调试窗口,下段点bpx hmemcpy(这可是个万能断点哟!)然 后再按ctrl+N键返回后台。接着可以按注册框内的‘确定’按钮了。看看会有什么东西出现。
(4)开始破解:按‘确定’按钮后是否调试窗口自动出现了。其已到了该断点,你先要用pmould命令(好象这个命令没说起过:)漏了。其作用是跳出子程序)。然后一直按F8,记住!要记下按的次数(可要有耐性哟!:))。这很重要。直到执行到出现注册错误提示框(别急)。记下的数要起作用了。如果你数到32次出现注册错误提示。则说明注册窗口在31后的这个 汇编代码。所以用同样的方法进入程序。用相同方法。但执行到31次后要停下了。成功将离你不 远了(但可能还要花点时间)。你首要开始读这些附近的代码,别怕麻烦。如能看懂最好,看不 懂也没关系。找解密的敏感指令吧!(前已提到过)。好了!祝大家好运吧。我要休息休息了。希望这篇能够给大家带来收获(大家可以去试试小程序的破解)。
原文地址:http://blog.tom.com/blog/read.php?bloggerid=611357&blogid=46855
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课