能力值:
( LV2,RANK:10 )
|
-
-
2 楼
通常ASCII的編碼在程式碼區段不常見,如果有的話,那就要靠OD的分析能力了,不然他一樣會當成程式碼解析。
ASC2他通常都是用在儲存英文字母、特殊符號、控制符號和數字再用的XD。
|
能力值:
( LV4,RANK:50 )
|
-
-
3 楼
在计算机里面都是2进制ASCII在计算机中也不列外啊 ,,16进制只是方便程序员理解啊 。。如果全都写成2进制计算机能识别 ,,你人能看懂不啊
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
新人,积极学习中。希望多多指教~
|
能力值:
( LV3,RANK:20 )
|
-
-
5 楼
计算机里面只有0和1
举个例子
0110 0001
可以看作是有符号数+61H
也可以看作是无符号数61h
也可也看作是字符‘A’
计算机并不知道他到底是什么,只知道内存某字节有0110 0001
关于它怎么解释,是由程序指定的
比如
printf("%c",0x61)
打出来的是A,因为你指定把它看作是字符
printf("%x",0x61)
打出来的是61,因为你指定它为数据
所以怎么区分,应该是看程序怎么解释这一串0和1
用王爽书中的一个例子
“例如,内在中的二进制信息1000100111011000”,计算机可以把它看作是大小为89d8h的数据处理,也可以将其看作指令mov ax,bx来执行
指令和数据是应用上的概念,在内存和磁盘上,没有任何区别,都是二进制信息。CPU在工作时候把有的信息看作是指令,有的信息看作数据。。。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
谢谢各位 是我问题问错了
无论什么码在计算机去看 都是2进制的 我的问题是 计算机怎么识别这些2禁止码到底是属于数值码还是非数值码
- - 计算机里面只有2进制的语言 他们是怎么进行分析的?
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
这点我知道的 而且我也很赞同 但是我不解的是 计算机是怎么对这些数据进行处理的 如果说是通过处理指令来识别 那么这些处理指令转换成计算机语言后 不也是2进制的么 这些2进制语言和其他的数据不也没什么区别么? 计算机是怎么对这些数据进行处理的- -
|
能力值:
( LV3,RANK:20 )
|
-
-
8 楼
程序有专门识别的地方吧..代码段和数据段...
|
能力值:
( LV3,RANK:20 )
|
-
-
9 楼
这个可能和PE头有关吧,不太清楚了
它说明那一块作数据解读,那一块作代码解读
你看下这个教学的第十二课和第十四课吧
也许能找到一些你想要的答案吧
http://bbs.pediy.com/showthread.php?t=123860&highlight=
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
路过帮不了你!
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
个人认为是按照指定地址的段寄存器(win32里貌似应该叫段选择器吧)。。。
比如地址是DS:XXXX或SS:XXXX程序就认为这里存的是数据。
是CS:XXXX程序就认为是指令
大概是吧。不确认。偶也是新手的说。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
PC汇编语言学哪个的好
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
回答lz 第二个问题,貌似第一个问题没什么意义
既然lz看过王爽那本书, 你因该知道第二个问题的答案,呵呵! 可能是楼主不怎么认真!
代码,指令.........等等东西在硬盘上面都是011010101010这些东西,load到内存也没什么太大的变化
所以这些东西根本就是一样的!但是CPU怎么区别呢?
那就得靠 寄存器里面的内容来区别了
16位 CPU 是 CS*16 +IP
32位 CPu 就是EIP
只要是上面两个寄存器 “指到” 内存地址里面的东西,CPU都会把他们当做"指令".送到CPU中区执行
其他的也就是一些数据了
如果楼主愿意,可以用EIP 修改指令 jmp call 之类的指令把内存数据"变成"指令,呵呵
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
那个几楼,ox是十六进制只是书写,并不显示standa吧?
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
你们知道为什么要从外存转到内存?因为外存被当作静态的,存取速度太慢所以控制器先从硬盘读取到内存,这样就大大提高了速度,早期是没内外存概念,cpu也没缓存更不用说硬盘。编码只是为了显示,当然编码的概念就不仅次了,还有很多原因大家去思考,脑袋要发挥他的作用,一只铅笔就是有二十多重用途,好奇心并不是小孩子的天性!听说内存是有无数的小磁柱在转,正转就是1.和与门里的有无单脉冲不同,有1就是真值,然后再触发器…。什么东西都分两仪上与下男与女。就连破解也分静动。磁铁分两极,唯有量子才只有1
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
程序是顺序执行的,cpu只执行指令,不会执行字符串,当然也是有可能的,那就是出错了。哥们儿,你说的问题od自己也没有能完全解决的,很多时候它也会把字符串搞成了指令,你可以试试,这种情况通常是用户查看一段代码时出现的,它也不知道当前的数据究竟是指令还是什么别的xx了。
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
大概是看cpu寄存器,是指定到cs`还是ds里边去,cpu把不同寄存器内的数据当作不同意义的内容吧。进入cs寄存器内的cpu就将它视作控制指令数据,ds寄存器的数据cpu就将它看作是数据吧。我也刚学可能也说不对。
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
ASCII只是字符编码,你把一块内存当字符看的时候,你就用ASCII(或者其它UNICODE编码)去看待它们。
实际上,一块内存里面具体是什么值,在于你认为它是什么。内存中只是01组合,你把它当作字符,那你就用特定的编码去解读它,要是看作数字,你也得按特定的规则去读它。
某字节:0100 0001(65,A),它要当作一个字符,就是'A',要是当作数字,就是65。。。
指令一般处于可执行的段(代码段),CPU将此段数据看成指令,此段开始处第一条数据(指令)进行分析,看它需要什么样的数据,如,它发现第一条是个push EAX, 则这个指令长度就是4字节,然后从4字节以后分析下一条指令。。。就是说,指令是有其固定长度的数据的。
指令和数据存在于不同的段内。
代码段内的数据长度是根据指令分析出来的。
数据段内的数据是什么,需要看引用它的指令需要什么数据。
|
能力值:
( LV7,RANK:110 )
|
-
-
19 楼
借用百度百科:
指令是指示计算机执行某种操作的命令,它由一串二进制数码组成。
一条指令通常由两个部分组成:操作码 +地址码 。
操作码:指明该指令要完成的操作的类型或性质,如取数、做加法或输出数据等。
地址码:指明操作对象的内容或所在的存储单元地址。
自己写的:
CPU内部有一种叫寄存器的东西,可以记录一些信息,
其中有两个寄存器叫CS和IP,他记录了当前执行的指令的位置~
CS:IP指示出内存中的一个位置
CPU从这个位置取一些二进制信息~,取的长度由取的信息决定
(这里听起来有点纠结,不过)
这一段取出的二进制信息就被CPU当做指令来执行
(其实不严谨的说,机器语言就是这些指令按一定顺序组合在一起)
有一部分指令,比如说一条访问内存的“mov ax,[bx]”指令
ax,bx是寄存器(记录了一些信息)
在执行这条指令时,bx里的二进制信息,会被看成是地址,
而在内存中,起始位置为bx,长度为2字节(两操作数长度一致,而ax是2字节的)的一段信息,就被看成是数据,被CPU读出,并用这个读出的值来改变ax的值
更特殊的,一段二进制信息可以被同时看做是数据和信息(这个只是说说,你还是先不要尝试去弄懂它,等到学好基础时再自己看书去~)
比如:
jmp near Lable1
Lable1: mov ax,cs:[Lable1]
这里执行到第二条指令时,CS:[Lable1]和CS:IP指向内存的同一位置,这一位置的二进制信息既是数据又是指令
建议去了解一下“图灵机”和“存储程序原理”,你对计算机的一些基本概念看起来似乎不甚了解。。。
建议再次阅读王爽《汇编语言》的1-3章,看起来你是刚学编程的人,这3章最好看上3、4遍。而且,提醒(而不是建议)一下,学编程最好从高级语言入手,比如PASCAL,C也有必要了解,(不过C比较难上手)
有条件可以研究一下《深入理解计算机系统》的第一章和第四章(这本书好,虽然比较贵,而且有些地方需要一定数学基础,不过这些地方可以略过,不影响你对计算机的了解~)
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
同意13楼。
正是因为数据、指令,对机器来说是无法区分的,所以才会出现以下技术:
1. 在不定长指令集的cpu上,使用“花指令”来干扰静态反编译。
2. 想办法把攻击指令当作数据送给程序,并且想办法让程序收到数据后再当作指令执行。很经典的就是缓冲区溢出攻击。
以上两点,都很典型,网上可以搜到大量资料。
具体到楼主的问题,cpu怎么知道哪个是指令,哪个是数据?
执行程序时,都有个入口,cpu从入口地址取出一条指令,开始解析指令并执行,
在执行这条指令时,将会确认下一条指令的地址,
(比如当前是一个普通的mov 指令,那么下一条指令地址就是紧跟着当前指令的;如果当前是jmp指令,那么下一条指令地址就是jmp的目标地址......)
然后执行下一条指令,并确认下下条指令的地址......
cpu完全是个傻瓜,就这么一条条指令执行下去...能执行到的,就是指令了,指令执行时,访问到的,就是数据...
假如你程序写错了,写了个jmp不知道跳到了哪里,cpu也不会知道,依然会按照你这个指令去执行,结果就可能是程序崩溃,如果是内核态,那就可能操作系统崩溃,典型的如windows的蓝屏死机...
当然,有的操作系统,甚至有的cpu,把内存属性做了区分,分为了可执行、可读、可写等属性,cpu把可执行程序文件中代码段的数据加载到可执行属性的内存区,并且cpu只能把可执行属性的内存中数据当作指令来执行,这样就可以防止程序崩溃时(或者恶意程序)把数据区的数据当作指令来执行,当然这是另外的问题了。
|
|
|