首页
社区
课程
招聘
[旧帖] [求助]鸟蛋的心声音:想像看小说一样的看汇编代码. 0.00雪花
发表于: 2008-11-13 00:20 4749

[旧帖] [求助]鸟蛋的心声音:想像看小说一样的看汇编代码. 0.00雪花

2008-11-13 00:20
4749
说实在的,我真的很羡慕大虾们看汇编代码想看小说一样。
把病毒的EXE载入OD,就能分析病毒的原理什么的,
能看懂代码在做些什么.
我看基础资料看了一段时间了,头还是一样晕晕的。
个人比较倾向于用简单的例子来学习,无奈这样的教程少.
网上找到了这个代码,编译后运行,整个类似DOS窗口全是A。
但是,虽然是短短几行,但是还是没办法理解。
希望大虾们能解释一下
assume cs:code
code segment        这两行好像汇编的都需要的
GoRun:                   不理解
mov ax,0b800h       把0b800h放入ax, 0b800h是地址?还是个什么数据。
mov es,ax               把ax的0b800h又放到es,郁闷放来放去的..
xor bx,bx                把bx清零,上次问过这个嘿嘿.
mov al,'A'                把A放到al里,真麻烦..又要MOV
mov ah,07h            这个也不清楚是做什么的,ah 没这个寄存器吧,把07h放进去做什么呢?
s:mov word ptr es:[bx],ax   直接被这句雷到了,老大们我真的看不懂...
add bx,2                bx+2 也不知道具体达到什么目的,移位?
jmp s                     这个知道,是跳到s:这里 循环.嘿嘿
code ends             代码结束了,人也倒了...
end GoRun            又要结束一次吗?又雷我.....

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 350
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
  楼主有够搞笑
2008-11-13 00:28
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
你还是乖乖的去学汇编吧
2008-11-13 00:30
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
assume cs:code
code segment------设CODE为CS代码段
GoRun:                   标志着从这里开始执行代码 也就是反汇编入口
mov ax,0b800h       把0b800h放入ax, AX是一个16位寄存器 运行后AX=0B800H
mov es,ax               把ax的0b800h又放到es,结合上面代码意思是 设ES为堆栈段 为什么要同过AX来中转 是因为CPU设置问题
xor bx,bx                把bx寄存器的直清零
mov al,'A'                把A(41)放到AX的低8位al里,执行这条指令后 AX=0B841H
mov ah,07h            把07H(37)放到AX的高8位AH里,执行这条指令后 AX=07841H

s:mov word ptr es:[bx],ax   循环开始 AX的直放到堆栈段 遍移地址保存在BX
add bx,2                bx+2 偏移地址+2
jmp s                     跳到s:这里循环  其实真正意义是把IP的指向改为S:这个地址
code ends             代码结束了,
end GoRun           标志着从这里结束代码

其实UNPACK只是个游戏   很好玩 并不是很难`
2008-11-13 00:34
0
雪    币: 111
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
呵呵,好有意思!
GoRun:

  呵,不好意思,我也不是太了解,应该是一个标记吧,如什么_start:之类的一样吧,标志着从这里开始执行吧。
mov ax,0b800h 把0b800h放入ax, 0b800h是地址?还是个什么数据。

单从这句不能决定它是是数据还是第址,但你看下面那个句子就可以决定这是一个段基址。
mov es,ax

es是一个段寄存器,这句话的意思是把设ES段的段基址为ax,即为刚才的b8000h(左移4位)
mov ah,07h 这个也不清楚是做什么的,ah 没这个寄存器吧,把07h放进去做什么呢?

  呵呵,你的汇编功底很弱,需多看书。
  AX寄存器分高八位(ah)和低八位寄存器(al)(h代表High, l代表Low),大致结构如下:
  --------|--------—|
        AH                         AL

s:mov word ptr es:[bx],ax 直接被这句雷到了,老大们我真的看不懂...

你把它写成:
s:
   mov word ptr es:[bx],ax
  或许就更好理解了,es刚才说明了是一个段寄存器,指定了一个段的起始地址:这里是   B8000h(注意这里我左移了四位,若这里不懂,看书吧,看看8086的寻址方式)。
简而言之吧:把ax的值 存入 es << 4 + bx (也就是 B8000 + bx)这一地址上。
而前面的那个word ptr指明是操作。
add bx,2 bx+2 也不知道具体达到什么目的,移位?

  调整指针值,使其加2,指向下一地址。

  貌似是一个死循环
  建议LZ多看书!
2008-11-13 00:46
0
雪    币: 111
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
唉,这次是我没坐到沙发。。。。。。
2008-11-13 00:48
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不是把 翻译小组成员也说不懂滴````嘿嘿``果然每个人都是一步步走过来的````
2008-11-13 00:48
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
有楼上各位的解释,能大致理解了,对楼上各位的敬仰之情犹如滔滔江水$#!@%!$#......
书确实看了, ah al 是ax的高位和低位也看过了,虽然有映像,但是不被你们点一下,我就是没反映过来, 这个只能说明,我对这些知识很生疏,运用不灵活  还是谢谢你们能解释出来.
还有一些问题 0b800h 这个换成其他的成吗? 0b700h 或者 0b900h....
为什么最后AX要=07841H?意思就是 41知道是A的ASCII码 078就知道了
mov word ptr 是把A输出到DOS窗口上的吗?
2008-11-13 01:08
0
雪    币: 111
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
哇,这里的人都好热心一个~!让我感到好欣慰啊~!
2008-11-13 01:09
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
10
B800h 是 video memory
你在那里放什么, 会相对显示在Monitor

格式为 属性'字元
你放 07''A' 为正常属性(好像是黑底白字)之'A'

为早期硬件差'速度慢, 之最快的显示方法

所以.根本不必翻译各行指令
2008-11-13 01:12
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
多看书把`` ````这样下去  2088年都结不了帖啊``````
2008-11-13 01:12
0
雪    币: 111
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
还有一些问题 0b800h 这个换成其他的成吗? 0b700h 或者 0b900h....
为什么最后AX要=07841H?意思就是 41知道是A的ASCII码 078就知道了
mov word ptr 是把A输出到DOS窗口上的吗?

原则上是可以的。。。但要看你做于什么用途。
比如你这里,通过你这段代码能了解你这段程序的大致功能为:
不断的向屏幕输出灰色的字母'A'。(0x07指的是字符的属性,0x41为其要输出的字符),因此这里若改成其他的值可能就达不到这结果(B8000为VIDEO MEMORY起始地址(因显卡而异,唉,弄起来就好麻烦的。。。),你向这里写字符,就相当于屏幕上输出字符)。但可把它改成位于VM 起始地址于结束地址之间应该可以得到同样的结果的。
2008-11-13 01:25
0
雪    币: 111
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
果然都是热心人物~!
闪先~!
2008-11-13 01:28
0
游客
登录 | 注册 方可回帖
返回
//