汇编技术步步高!
[size=3] 汇编技术步步高LEON(林#超)
学CRACK前要懂什么呢?当然是汇编语言,所有的程序调试工具都是用这种语言的,作为新手+菜菜,必须要耳濡目染啊。当然,本篇不是教你做程序员,只是要成为一个HACKER必定要有多方面的知识,不能只做一个脚本小子,CRACK快速入门相信很多朋友都一头雾水,因为不懂汇编,现在让我们了解汇编吧!
汇编指令:在机器语言上进行翻译,机器语言是由0和1组成的,不适合阅读。为了改善机器语言的可读性,人们选用了一些英文单词的缩写代表一个机器指令,比如,赋值指令MOV。与此同时,也把CPU内各种资源加上了符号。我们称这些符号叫助记符,它们和机器语言一一对应。[color=Red](此文有不少闪光点,但有些内容不是很详细,有可能误导小菜请X子们 带着疑问来看待----小3)(我加了一些注意的地方)[/color]
通用寄存器:
通用寄存器有8个,为AX,BX,CX,DX,SP,BP,SI,DI。其中前四个可以作为一个单独的16位寄存器,又可以作为两个8位寄存器使用,AX分成AH,AL,BX分成BH,BL,CX分成CH,CL,DX分成DH,DL。各自的用途如下表。[color=Red](两者并不是同一概念,AH一般放AX的高8位,AL者放低8位,两者不可混用)[/color]
寄存器 用途
AX 用做累加器,在乘法指令中做隐含乘数。 [color=Red](。。这个又有点模糊,应该说做存放操做数用)[/color]
BX 基地址寄存器。 [color=Red](这是在计算存储器才做基址的)[/color]
CX 在LOOP指令中做记数器,执行一次LOOP,CX的值-1,直到变成0才运行LOOP下一行的指令。
上面的我们不一定要全部掌握,只要记住AX,CX的用途就好。下面讲讲运算指令。
“与(AND)”:把两个数进行计算,两数中只要其中对应计算的一位数是0,那位上的结果是0。否则结果是1。比如AND 1011,0110 =0010。
“或(OR)”:把两个数进行计算,两个数对应位只要有一个是1,那位上对应结果是1。比如,OR 0000,0101 =0101。
“非(NOT)”:把两个数进行计算,对应位0变1,1变0。比如NOT 1111 =0000
“异或(XOR)”:把两个数进行计算,不相同时,对应位结果是1。比如XOR 0001,0000 =0001
上面讲的计算指令,学CRACK的话一般要掌握前两个。下面还是从基础开始,讲讲汇编的指令,因为我们阅读汇编代码总是先看指令再看指令对应的操作。
在讲指令中,我会不断出题,新手一定不要马上看我的解题过程,准备好纸和笔,自己动手写一边,看看和我的答案正确吗,这样才能提高技术!
“MOV”指令是最经常用的指令,用于数据传输,我们可以理解成赋值指令,比如,MOV AX,1,就是给AX赋值1,指令执行以后AX=1。
“ADD”指令是加法指令,比如ADD AH,1,指令执行前AH=1,指令执行后AH=AH+1=2。
“SUB”指令是减法指令,比如SUB AH,1,指令执行前AH=1,执行后AH=AH-1=0。
“INC”指令是加1指令,比如INC AX,指令执行前AX=1,执行后AX=AX+1=2。
“DEC”指令是减1指令,比如DEC AX,指令执行前AX=1,执行后AX=AX-1=0。
“MUL”指令是乘法指令,先不用说复杂的,我等菜菜只要记住当执行这个指令,默认AL是乘数,乘积给AX(啥?什么是乘数,那你该好好上数学课了)。利用这个指令我们可以求正方形面积。比如:求一个边长是10的正方形面积,我们可以按如下指令编写。
MOV AL,100
MUL AL
MOV ABC,AX //前面说过MUL乘积送给AX,所以我们只要在执行完MUL后把AX赋值给你要赋值的变量就行了,比如本题中的变量ABC。
既然有乘法指令,当然就有除法指令拉。“DIV”指令就是除法指令,同样,说得太复杂大家不理解,菜菜们记住,执行DIV指令的时候,默认AX是被除数,商放AL,余数给AH,可别以为电脑会帮你四舍五入!我们可以用这个指令做一道题目:求底是10,高是8的三角形面积是多少?
MOV BL,8 //给BL赋值8
MOV AL,10 //给AL赋值10
MOV BX,2 //给BX赋值2
MUL BL //相当于BL*AL,8*10(底*高)乘积送AX
DIV BX //相当于AX/BX,80/2,商送AL,这里我们不考虑余数
MOV ABC,AL //把AL赋值给变量ABC
这样我们就完成了底*高/2求三角形面积的公式了。并且结果保存在ABC中。
“CMP”指令用做比较,比如CMP AX,1,把AX和1比较,指令功能就是这么简单,比较以后干什么呢?下面我们引出跳转指令。跳转指令是非常多的,这里我先讲一个无条件跳转指令“JMP”指令格式如下:JMP 目的位置。既然有无条件跳转指令,那是不是有条件跳转指令呢?答案是有的,再讲一个“JE”(等于就跳)指令,这个指令要和CMP指令结合使用。当然还有很多条件跳转指令,见附录。题目题目,题目是人类进步的阶梯,出题了!判断AL是不是偶数,是就给变量ABC赋值1,不是给它赋值0。
AND AL,01H //把AL进行与运算,注意加个H表示是16进制数,代码意思说白了就是保留AL的最低位不变。结果赋值给AL。
CMP AL,0 //把AL和0比较
JE LEON //相等就跳到LEON的地方
MOV ABC,0 //不是把ABC赋值0
JMP LEON2 //跳到LEON2的地方
LEON:
MOV ABC,1
LEON2:
NOP //补充一下,NOP表示无动作,直接往下走
好了,我们再介绍新手必须掌握的一个指令,“LOOP”指令,还记得吗?讲寄存器CX的地方有讲到过这个指令,它的格式是:LOOP 目的地址。当代码执行到LOOP指令时,会先判断CX是不是等于0,是就往下走,不是就把CX-1,然后回到目的地址,当又运行到这个地方时,又会重复比较的步骤,直到CX=0,才往下走。题目:利用INC指令和LOOP指令完成给AX赋值10。(准备好纸和笔了吗?自己动手先写一下!)
MOV CX,10
MOV AX,0
DA:
INC AX
LOOP DA //进行比较CX,然后循环
这样就完成了题目。
最后一个指令,“CALL”指令,调用子程序,从子程序返回的指令是RET,子程序可以理解成主程序中的一个分支。我们只要先了解这点。
反汇编中的经典语句
说过了汇编,那么,我们就要体现汇编对于我们的价值,(睡觉的都给我起来!……)。
经典语句:
一般在程序内部会调用一个子程序,进行注册码的计算,然后将结果带回到主程序。其注册方式类似于下面的语句。
MOV EAX,XXX
CALL XXX
CMP XXXXXXX //真假注册码进行比较
JE/JNZ XXX一类的跳转语句
CALL XXXX //调出一个对话说明正确或者错误
其流程图类似于下表:
取用户名
调用子程序计算用户名对应序列号
取假注册码
真假注册码比较
条件跳转
给出提示对话框
这样口头叙述好象没有什么说服力,还记的talent feng写的去除NAG的那篇文章吗?上面有个KENGEN ME里面的注册码判断就是大致这样的,图1。
图1
那里的JNZ就是真假注册码判断后跳转的地方,只不过比较在CALL里面已经完成了,在CALL上面F2下断可以拦截到注册码,图2,不过这个软件制作的目的不是让我们这样练习破解的,这里只是顺带提一下。这个软件是用明码比较的。
图2
所以破解起来比较简单,对于注册码隐式存在的,虽然不能直接看到注册码,不过注册码也是给了某个寄存器,所以有时我们要进入CALL分析算法。
其实反汇编的经典语句还有很多,比如ASP压缩壳是以pushad+CALL+JMP,图3。
各种壳的作者都为了与众不同,创出自己的风格,所以都有各自的开头,正因为这样,我们可以发掘很多经典的语句。
图3
总而言之,只要看到CALL后面跟着JNZ,JE,JZ一类的跳转指令,一定要小心!
学用汇编写程序
讲了基础的汇编知识,以及利用基础知识分析软件,该教大家写汇编程序了,同样的,汇编也象C一类有自己的格式,有自己的开头语,有自己的结束语,好,从开头的格式讲起。
先了解几个定义变量要用的伪指令
DB:表示“字节”
DW:表示“字”
DD:表示“双字”
1、SEGMENT 和 ENDS
功能:把程序分成N段,由ENDS标志结束。
格式: 段名 SEGMENT
定义变量名
段名 ENDS
比如:
DATA SEGMENT
LEON DB ? //定义一个字节变量,初始未知
LEON ENDS
2、ASSUME:
ASSUME是指定段寄存器伪指令,比如ASSUME DS:DATA,前面讲过了CS,DS是寄存器。这样,在程序开始时,就要按照ASSUME所指定的,把DATA段放入DS寄存器。所以开头一般都有这样的指令
MOV AX,DATA
MOV DS,AX
这里大家要记牢一句话:当需要访问段中变量时,该段一定要预先放在某个数据段寄存器中,才可以访问变量!所以才有了上面那两句。
3、END伪指令
功能:告诉CPU从哪里开始执行程序。
比如,在程序尾部一般有这么一句:END START,意思是告诉CPU从标记START的地方开始执行程序。
总结一下汇编程序的格式,然后开始编程!
数据段名 SEGMENT
变量名1 类型(DB、DW)
变量名2 类型(DB、DW)
…………
段名 ENDS
代码段名 SEGMENT
ASSUME 指定段寄存在什么地方(ASSUME DS:DATA,CS:CODE)
START(标记):MOV AX,DATA
MOV DS,AX
CODE ENDS
END START(告诉程序从START处开始执行)
先从较为简单的开始,实现单个字符的输入,并且在屏幕上显示出来。
要实现这个程序,要调用到DOS功能,DOS功能调用是通过软中断来实现的,要调用DOS功能也有一个过程,过程如下:
给中断服务程序输入入口参数,参数存放DX,通常这步可省略。
把要调用的DOS功能号放进AH。
使用INT 21H。
INT 21H称为软中断指令,功能是根据送AH的功能号执行,转向对应中断的地方,对应中断的地方(入口参数)由DX提供。
开始解题:
DATA SEGMENT
DA DB ?
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:MOV AX,DATA
MOV DS,AX
MOV AH,01H
INT 21H
CODE ENDS
END START
这样,代码编写好了,但是我想大家也发现了一个问题,就是怎么才能让编好的代码变成程序呢?下面我们来解决这个问题。
解决这个问题我们要用到微软的MASM.EXE和LINK.EXE。
用MASM生成OBJ文件,用LINK把OBJ文件变成EXE文件。
把编写好的代码保存后缀名为.asm的,再把三个东西放在同一个目录下,运行MASM.EXE,输入.asm的文件名,按回车。图4。下面会问生成的名字叫什么,我们什
图4
么都不管,按4个回车,过一会,马上发现同目录下有个OBJ文件,图5。再运行LINK,会问OBJ文件的名字,我们要打前缀名就好了,后缀已经帮
图5 我们默认了。这里我输入1,然后一直按回车,过程差不多,不给截图了。你会发现我们的EXE已经躺在那里了。但是我们运行它,会发现输入第2个字符时就会有错误提示, 图6。
图6
这是因为我们调用的DOS功能还不够强大,它只支持输入一个字符而已,多输入当然回导致错误发生。解决这个问题当然还是有办法的,只要用0AH号功能就行了,完整代码如下:
DATA SEGMENT
DA DB 200
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:MOV AX,DATA
MOV DS,AX
LEA DX,DA //LEA指令是得到DA的首地址给DX当作入口参数。
MOV AH,0AH
INT 21H
CODE ENDS
END START
这样,再编成程序,你就会发现可以输入199个字符了,最后一个字符一定要回车结束,刚刚好200。图7。
图7
好了,以上的就是顺序结构程序设计,就是让程序一步一步按照顺序运行。除了这个,还有分支程序设计,就是用到JMP指令一类的程序,还有循环程序,就是用到LOOP一类的程序。最后就是子程序设计了,就是汇编中最困难的一部分。新手能懂就懂最好,不懂不要强求,多看看书会漫漫理解的。
子程序设计
写子程序要考虑到很多因素,比如现场的保护,根据主程序的信息进行处理,恢复现场,返回等等。
子程序定义伪指令格式:
标号 PROC
定义
标号 ENDP
就是用上面的代码进行定义子程序。在主程序中调用子程序要用CALL指令,从子程序返回主程序要用RET指令。
现在编写一个利用子程序实现变量ABC+1。
DATA SEGMENT
ABC DB ?
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:MOV AX,DATA
MOV DS,AX
CALL S1 //调用子过程S1
MOV ABC,AX //把ABC+1后的值给回ABC
POP AX //恢复刚才备份的AX
S1 PROC //子过程定义
PUSH AX //把AX压入栈,就是先备份一个AX现在的值。
MOV AX,ABC //把变量ABC放入AX
ADD AX,1 //AX+1
RET //返回
S1 ENDP //子程序定义结束
CODE ENDS
END START
上面讲的代码其实有部分多余,比如PUSH,和POP在这个程序里根本就不会用到,可是它们起的作用在CALL里是非常重要的,保证的主程序的连贯性,而且一般的子程序开头也是如下:PUSH AX
PUSH BX
…………
结尾是恢复现场:POP AX
POP BX
POP ……
总结
到此,本篇的内容已经讲完了,如果你全部学会,那我要恭喜你,你已经算是一个汇编新手了,因为上面的知识还是属于比较简单的,学习的关键在于多动脑,多动笔,我这里还有一些题目,有兴趣的可以做一下。
设计一个子程序,求一个字节数的平方。
把一个字节数和1进行比较,等于给变量LEON赋值1,不等于直接退出。
[color=red] 附录(CRACK常见的跳转指令)
无条件跳转指令
条件跳转指令
JMP
JE
JNE
JG
JGE
JL
JLE
JO
JNO
JS
JNS
JZ
JNZ ————
等于则转
不等于则转
大于则转
大于等于则转
小于则转
小于等于则转
溢出则转
未溢出则转
是负数则转
是正数则转
是0则转
非0则转
附录2(OD常用指令)
F2:对指定地址进行下断,当程序运行到此处停下。
F4:是程序运行到指定位置。
F7:步入跟踪,遇CALL跟进。
F8:单步跟踪,遇CALL不跟进,直接运行CALL,然后继续下一步主程序指令。
F9:让程序运行起来。[/color][/size] 有机会跟你好好学学,用不用什么教材呀,哈哈!::14:: ::14:: 汇编很容易的啊,,, 如果你不是要当程序员的话,,这个就够了 收下,慢慢的学了,现在是什么都看不懂 什么话都不多说了!感谢 undefined undefined undefined
罗大哥的汇编书也要看啊!!!!!!!!!!!!11 罗大哥的书貌似有点难度,学习是为了不做菜鸟,努力ing... 我觉得windows汇编语言程序设计这本书不错 内 容 不 错 很 适 合 小 ::16:: 菜 正是我想要的~~~~~谢谢啦
有没有VB做木马的例子啊,发点上来::03:: 好东西啊,谢谢谢谢啊,好
::06:: ::06:: ::06:: ::06:: ::06:: 看不懂 只动PS
::07:: ::07:: ::07:: ::07:: ::07:: 破解者应该掌握的东东,真是不错,好东西。 LEON就是LEON啊,顶一个~~~~
::16:: ::16:: ::16:: ::16:: ::16:: 正想学呢 ::04:: ::04:: ::04:: 好长………………
慢慢看……
还是谢谢你!!
