汇编语言学习(3)

2019-08-03 15:03

么东西在提供段地址呢??又是什么东西提供偏移地址呢??,这又不得不让我想到了寄存器,回忆我们前面学习的(应该还不至于忘记吧)4个通用寄存器,那么是不是CPU内部只有那么多寄存器呢?不是的。。呐。我这里就再给你说一个寄存器。这个寄存器就是专门用来放段地址的,它就是CS寄存器,不过好像叫寄存器就俗了些,不可以体现出它和其他那些寄存器的区别来,因为那些寄存器都是放一般性数据,,这CS寄存器可就不同咯。。所以又给它改个名字,就叫段寄存器吧。。这样理解应该比较好理解吧!!

现在还有个小问题,我们有了一个叫CS的段寄存器,,那还得有一个放偏移地址的寄存器啊,这次倒霉的就是CPU中一个叫IP的寄存器(嗯,别和IP地址的IP弄混了)。。啊,原来是这样啊。现在是万事俱备只欠东风啊。。就让我们来套用这个公式吧。。

物理地址 = CS * 16 + IP 就这样,给出了物理地址,事实上当你为CS为什么不叫EX或者其他的名字的时候,我得告诉你一个天大的秘密:

在8086的CPU上,任意时刻,设CS中的内容为M,IP的内容为N,那么8086将从内存:

M * 16 + N 单元开始执行。。

你可能不以为然呐,这有什么了不起啊,我跟你说这就错了,有了这玩意可以玩的事情可就多了。。你想啊我们想让CPU执行一条指令我们要怎么办呢? 想到了吧,嘿嘿。。让我值得高兴的是,我比你先想到~~~~我们只要设 M * 16 + N 的值为我们想要的内存单元地址那不就得了吗? 对的,确实是这样。。 在任意时刻 CPU将CS : IP指向的内容当作指令执行 为了让你有个更感性的认识我非常有必要举个例子,这是毛主席说的,实践才是硬道理啊,比如我在 内存20000 -20003处有条指令,那么我们想让这条指令执行一下该这么办呢?我想应该是这样的 1。 让CS : IP的值指向 20000处 2。 读取并执行指令,同时IP值要加3

我说的第一点可能比较好理解了,可为什么要加3呢,其实是这样的,你想想啊。。。CPU从20000处开始读取指令,读取到指令后就会返回,然后呢执行,CPU在执行完了这条指令后当然知道这条指令是占几个字节,这里是3个字节。。所以CPU就会把IP的值加3。。。嗯,明白了吧,原来是这样啊。

知识这东西啊,确实是好东西。当然你得先把它学会对吧。。现在让我们回想一下,那个电脑为什么在一按电源就会呼啦啦自动执行指令。。那么我们由此可以判断出,一定是有什么东西在修改着CS : IP的值对吧。。那么事实上是这样的。。 8086在加点启动后(或者重启了电脑) CS : IP的值被分别设置为CS=F000H, IP=FFFFH也就是说CPU在启动的时候从FFFF0H单元开始执行第一条指令,有趣吧。。

所以我们可以得出结论:

想要让指令执行必须让CS:IP指向它,反过来,一条指令如果被执行了,那么CS:IP一定指向过它。。

是不是已经按耐不住了,忍不住想写几条指令给CPU执行了??事实上我是一个不

喜欢调人胃口的人,但是此时此刻我不得不提醒你,你还记得mov, add。指令吗?不会那么快就把这两条指令忘了吧,如果忘记了。那么你应该再回头看看 寄存器(CPU工作原理1), 如果你还记得那么就比较简单了,例如我们还是在内存20000-20003处有条指令,那么我们可以这样写代码: mov cs, 2000H mov ip, 0H

如果你这样写的话,是要出错的,因为intel公司不给你这样干,这样写的指令是错误的。。你可能想问下为什么不行,那么我可以给你电话,你打电话去intel问下就清楚了,那么既然intel不给我们这样干,他总的提供让我们怎么修改CS和IP的值的方法吧,那么我可以明确的告诉你,方法是有的,就是用另外一条指令,它就是 jmp,使用方法:

同时修改CS 和IP的值: jmp 段地址 : 偏移地址 jmp 1000:2

只修改IP的值: jmp 某一合法寄存器

jmp ax ‘这条指令执行的效果和 mov ip, 0H的效果差不多

如果你看到了这里,并且前面的教程你都看了,并且明白了,那么我不得不佩服你的勇气,与毅力,好好努力,相信自己一定可以把汇编学好的。相信你看到这里也开始心里甜了吧,很多奥秘开始向你解开,我当初就是学到这里的时候想,我一定要把汇编学下去,并且要学好。。相信你也是一样,下一篇我就要给大家将debug的使用了,虽然那东西简陋但是还是有必要了解下的。。因为它简单,学起来方便。。OK今天就到这里吧,晚上2点了!

汇编教程5:debug的使用 2008-11-01 15:56 嗯,这次距离上次文章发布快两个礼拜了,今天我终于痛下决心了。要再写一篇。写到一半,好友 “冰横”,来向我介绍黑莓手机,,黑莓??什么是黑莓手机。诶!看来啊,落后拉。。后来查下资料才发现,这东西确实好啊,又便宜,功能又多。。有时间挑一个。然后在写这篇文章的时候,要找一个屏幕截图的软件,我用的是SangIt这个软件我可是用了好几年了6.0就开始用了,现在都9.0了。非常不错。在WP里面上传的时候弄了好几次都没有成功,不过最后还是成功拉!废话少说,开始今天的话题:debug的使用

上次我们讲了CPU给出物理地址的方法、和介绍了2个段寄存器 CS 和IP。虽然我已经写了好几篇了,但是还没有涉及到任何的编程知识,这在学习高级语言里面是不敢想象的,学高级语言就是好啊,比如C。哈哈上来就写 “hello world”,汇编可不行,,写完这篇,我们还不能写出 “Hello World”,还要

下几篇才可以,不过别泄气。通用寄存器那章都挺过来了,这两篇不难。 本来我是想直接和大家讲 “Rad ASM”想想还是作罢,还是讲讲 “debug”吧,让大家了解下计算机内部的原理。实际上你以后在编程工作中根本就用不到“debug”,至少我是很少用到,我都是用 “Rad Asm”里面集成的调试器,直观,方便。所以这章也不用死记,只要了解原理就成。

“debug”是什么呢?debug是一个软件,是一个调试其他软件的软件,既然是软件,当然要启动拉,在windows 2000/xp下启动可以这样,[开始]-[运行]-[cmd]。打开命令行窗口,然后输入命令 [debug],这样就启动了程序 debug是古老的命令行方式运作,命令繁多,一下介绍怕消化不完,那么我们只学习几个常用的。 -R

查看,改变寄存器的值。 -D

查看内存中的内容 -E

改写内存中的内容 -U

将内存中的机器指令翻译为汇编指令 -T

执行一条汇编指令 -A

以汇编的指令的格式在内存中写入一条汇编指令

这就是我们最常用的debug指令了。这样罗列出来给大家看,非常的不直观。。我们就来做几个实例虽然我个人非常不喜欢用图片来讲解计算机的原理性的东西,但是不可否认,这样更容易让人理解:

-R: 查看和修改寄存器的值:我们已经学过6个寄存器了,4个通用的,2个段寄存器。。

上面是在命令行里面显示的信息,,非常简单、你在自己电脑上试试就可以了,

告诉你一个小密码,这个命令是系统自带的,所以别问我哪里下载(这个软件在MS-DOS的时候就是系统自带了,所以现在的系统里面都有这个软件。如果你看不明白请在自己的电脑中试验下,实在不明白请看 王爽《汇编语言》,首先最上面是输入了-R命令,然后显示出了很多寄存器的值,有几个我们是认识的,有几个我们还不认识,不过没有关系,我们会在以后的时间介绍,现在就先不管了,反正记得这是显示寄存器的值就是拉,左下角这里显示的 CA12:0100你仔细看看就明白了,刚好对应CS:IP的值对吧。旁边的ADD DH[ DI +48 ] 这就是当前CS:IP指向地址的指令。同样的右下角还有个DS: 0048 = 00这个也不用深究,现在不用了解。。

命令就是这样,很简单,自己试验试验就直观了,如果要改变一个寄存器的值可以这样:

输入命令-R接着要修改的寄存器,然后回车,就输入想要修改寄存器的值就成,然后你要记得举一反三,修改其他寄存器的值方法也是一样的,包括CS:IP寄存器。所以说是非常简单的。。

-R命令:查看内存中的内容:我们可以用 d 段地址:偏移地址 的方式查看,使用方法如下:

输入命令后,默认是显示从你输入的物理地址开始128个内存单元的内容,右边全是点?的这里是该内存单元内容所对应的ASCII码。如果你嫌弃它给你显示的内存单元少了或者多了, 比如现在我们要显示1000:0-1000:23内存单元的内容该怎么做呢? 我们可以试试这样: d:1000:0 23 。这样就把1000:0-1000:23内存单元的内容全部显示出来了,一个不多,一个不少。这里就不截图了,自己试试。

-E命令:改写内存单元的内容:这个比较简单,截图一看你就明白了: 非常简单吧,我们先用d命令查看了1000:0处的内容,然后用e命令修改内存单元的内容,总共修改了11个从43开始到32结束。当然你也可以写入ASCII码值,道理和写入数字是一样的,不过记得字符串要加冒号”\是英文的冒号。 -U命令:查看内存中该地址对应的汇编指令:

可以看出来,这条命令是非常简单的,这条命令和-D很像,-D是查看内存中的ASCII码,-U是查看对应的汇编指令。非常简单。所以看到这里你就应该明白,在内存中执行指令和数据是没有区别的,关键是CPU如何解释了,如果你让CS:IP指向它,那么这个地方就是执行指令,如果你让~~~,呵呵那个还没有讲呢,下次再讲。

-A命令:以汇编的形式在内存中写入指令:使用方法也是非常简单: 我们首先用-A在2000:0处写入了3条指令,然后用-U查看了2000:0-2000:10的汇编指令,结果当然是显示我们刚才写入的指令了,所以说非常简单。看也看

了,写也写了,追究是为了执行,所以我们来看看如何执行汇编指令。 -T命令:执行一条指令,如果没有给出CS:IP,那么就执行默认的CS:IP处的指令:

T命令也是非常简单的,上图我们是先用-R命令查看了寄存器的值,然后用-R修改了CS和IP的值,然后用-A在2000:0处写入了一条指令,最后用-T执行了一下,注意看AX的值,是不是加1了,非常简单吧。。

到这里debug最简单的使用方法就讲完了,这篇我写的特别累,主要是截图,我喜欢安静的写,这样可以让自己的思绪有条理,所以我喜欢汇编,不喜欢用VB,或者delphi这样的可视化工作界面,用汇编你想做什么就做什么,只要你能够想到,限制你的只有你的知识和你的想象空间。debug就已经讲完了,是不是意见有了一些成绩了?你可能不以为然,说这debug能够做什么呢??其实可以做的事情多了,如果你是在没有任何开发工具的情况下,又需要写个小程序做点事情(好像只有黑客这么干),那么debug是非常不错的选择,在网吧或者其他别人的电脑里面想做点破坏你就可以写点汇编指令。非常不错、什么开发工具都不用。当然现在你还没有那个能力,等你再深入的学习下你就可以做到了。 这一篇又写完了,下面我们主要讲下栈,等讲完了栈就可以开始用记事本写自己的“hello World”了,在如何学习汇编 就已经讲过,学习汇编是很吃苦的事情,但是,如果你越过了这道槛,你就会获得很大的收获。有听过 “浴火重生”的故事吗?传说中,凤凰是人世间幸福的使者,每五百年,它就要背负着积累于人世间的所有不快和仇恨恩怨,投身于熊熊烈火中自焚,以生命和美丽的终结换取人世的祥和和幸福。同样在肉体经受了巨大的痛苦和轮回后它们才能得以更美好的躯体得以重生.

脱壳的艺术!(1) 2008-11-01 20:27 概述:脱壳是门艺术——脱壳既是一种心理挑战,同时也是逆向领域最为激动人心的智力游戏之一。为了甄别或解决非常难的反逆向技巧,逆向分析人员有时不得不了解操作系统的一些底层知识,聪明和耐心也是成功脱壳的关键。这个挑战既牵涉到壳的创建者,也牵涉到那些决心躲过这些保护的脱壳者。 本文主要目的是介绍壳常用的反逆向技术,同时也探讨了可以用来躲过或禁用这些保护的技术及公开可用的工具。这些信息将使研究人员特别是恶意代码分析人员在分析加壳的恶意代码时能识别出这些技术,当这些反逆向技术阻碍其成功分析时能决定下一步的动作。第二个目的,这里介绍的信息也会被那些计划在软件中添加一些保护措施用来减缓逆向分析人员分析其受保护代码的速度的研究人员用到。当然没有什么能使一个熟练的、消息灵通的、坚定的逆向分析人员止步的。


汇编语言学习(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:浙江海滨城投三期施组

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: