首页
社区
课程
招聘
[旧帖] 新手求教编码问题 0.00雪花
发表于: 2011-1-20 04:51 7037

[旧帖] 新手求教编码问题 0.00雪花

2011-1-20 04:51
7037
- - ID注册好几年了 可一直就没正八经学过破解

今天打算从头开始 无奈功底比较薄 就从基础的汇编开始看起  下了中山大学的教程 遇到了两个问题

我正在看前两节内容 包括数值编码和非数值编码(心里暗自赞叹 和老谭的C语言有的一拼)

曾听人听说过 汇编语言是比较接近机器语言的一种语言

我的疑问:

1.在第二节内容中讲到非数值编码  例如ASC2码  这东西到底用在哪啊? 机器都是识别的2进制码  OD反汇编里面都是用的16进制的

2.ASC2码有他自己的16进制表示方法 但是如果遇到相同的16进制数值编码 咋区分啊?机器可不像人类有逻辑思维功能 这不是容易产生二意性么?

--------------------------------------------------

问题更新:

引用:
(最初由 初空如风发布  
用王爽书中的一个例子
“例如,内在中的二进制信息1000100111011000”,计算机可以把它看作是大小为89d8h的数据处理,也可以将其看作指令mov ax,bx来执行
指令和数据是应用上的概念,在内存和磁盘上,没有任何区别,都是二进制信息。CPU在工作时候把有的信息看作是指令,有的信息看作数据。。。。。 )

这点我知道的 而且我也很赞同 但是我不解的是 计算机是怎么对这些数据进行处理的  如果说是通过处理指令来识别  那么这些处理指令转换成计算机语言后 不也是2进制的么  这些2进制语言和其他的数据不也没什么区别么? 计算机是怎么对这些数据进行处理的- -   

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 416
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
通常ASCII的編碼在程式碼區段不常見,如果有的話,那就要靠OD的分析能力了,不然他一樣會當成程式碼解析。

ASC2他通常都是用在儲存英文字母、特殊符號、控制符號和數字再用的XD。
2011-1-20 07:06
0
雪    币: 4506
活跃值: (2131)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
在计算机里面都是2进制ASCII在计算机中也不列外啊 ,,16进制只是方便程序员理解啊 。。如果全都写成2进制计算机能识别 ,,你人能看懂不啊
2011-1-20 09:46
0
雪    币: 81
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
新人,积极学习中。希望多多指教~
2011-1-20 10:14
0
雪    币: 67
活跃值: (31)
能力值: ( 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在工作时候把有的信息看作是指令,有的信息看作数据。。。。。
2011-1-20 10:39
0
雪    币: 140
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢各位 是我问题问错了

无论什么码在计算机去看 都是2进制的 我的问题是 计算机怎么识别这些2禁止码到底是属于数值码还是非数值码

- - 计算机里面只有2进制的语言 他们是怎么进行分析的?
2011-1-20 23:58
0
雪    币: 140
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这点我知道的 而且我也很赞同 但是我不解的是 计算机是怎么对这些数据进行处理的  如果说是通过处理指令来识别  那么这些处理指令转换成计算机语言后 不也是2进制的么  这些2进制语言和其他的数据不也没什么区别么? 计算机是怎么对这些数据进行处理的- -  
2011-1-21 00:01
0
雪    币: 156
活跃值: (27)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
程序有专门识别的地方吧..代码段和数据段...
2011-1-21 02:03
0
雪    币: 67
活跃值: (31)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
这个可能和PE头有关吧,不太清楚了
 它说明那一块作数据解读,那一块作代码解读
 你看下这个教学的第十二课和第十四课吧
 也许能找到一些你想要的答案吧
http://bbs.pediy.com/showthread.php?t=123860&highlight=
2011-1-21 08:29
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
路过帮不了你!
2011-1-21 11:31
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
个人认为是按照指定地址的段寄存器(win32里貌似应该叫段选择器吧)。。。
比如地址是DS:XXXX或SS:XXXX程序就认为这里存的是数据。
        是CS:XXXX程序就认为是指令
大概是吧。不确认。偶也是新手的说。。。
2011-1-21 12:03
0
雪    币: 76
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
PC汇编语言学哪个的好
2011-1-21 12:43
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
回答lz 第二个问题,貌似第一个问题没什么意义

既然lz看过王爽那本书, 你因该知道第二个问题的答案,呵呵! 可能是楼主不怎么认真!

代码,指令.........等等东西在硬盘上面都是011010101010这些东西,load到内存也没什么太大的变化

所以这些东西根本就是一样的!但是CPU怎么区别呢?

  那就得靠 寄存器里面的内容来区别了

  16位 CPU 是 CS*16 +IP
   32位 CPu 就是EIP

只要是上面两个寄存器 “指到” 内存地址里面的东西,CPU都会把他们当做"指令".送到CPU中区执行

其他的也就是一些数据了

如果楼主愿意,可以用EIP 修改指令 jmp call 之类的指令把内存数据"变成"指令,呵呵
2011-1-21 20:58
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
那个几楼,ox是十六进制只是书写,并不显示standa吧?
2011-1-23 08:32
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
你们知道为什么要从外存转到内存?因为外存被当作静态的,存取速度太慢所以控制器先从硬盘读取到内存,这样就大大提高了速度,早期是没内外存概念,cpu也没缓存更不用说硬盘。编码只是为了显示,当然编码的概念就不仅次了,还有很多原因大家去思考,脑袋要发挥他的作用,一只铅笔就是有二十多重用途,好奇心并不是小孩子的天性!听说内存是有无数的小磁柱在转,正转就是1.和与门里的有无单脉冲不同,有1就是真值,然后再触发器…。什么东西都分两仪上与下男与女。就连破解也分静动。磁铁分两极,唯有量子才只有1
2011-1-23 09:10
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
程序是顺序执行的,cpu只执行指令,不会执行字符串,当然也是有可能的,那就是出错了。哥们儿,你说的问题od自己也没有能完全解决的,很多时候它也会把字符串搞成了指令,你可以试试,这种情况通常是用户查看一段代码时出现的,它也不知道当前的数据究竟是指令还是什么别的xx了。
2011-1-23 22:30
0
雪    币: 450
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
大概是看cpu寄存器,是指定到cs`还是ds里边去,cpu把不同寄存器内的数据当作不同意义的内容吧。进入cs寄存器内的cpu就将它视作控制指令数据,ds寄存器的数据cpu就将它看作是数据吧。我也刚学可能也说不对。
2011-1-24 09:56
0
雪    币: 245
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
ASCII只是字符编码,你把一块内存当字符看的时候,你就用ASCII(或者其它UNICODE编码)去看待它们。
实际上,一块内存里面具体是什么值,在于你认为它是什么。内存中只是01组合,你把它当作字符,那你就用特定的编码去解读它,要是看作数字,你也得按特定的规则去读它。
某字节:0100 0001(65,A),它要当作一个字符,就是'A',要是当作数字,就是65。。。
指令一般处于可执行的段(代码段),CPU将此段数据看成指令,此段开始处第一条数据(指令)进行分析,看它需要什么样的数据,如,它发现第一条是个push EAX, 则这个指令长度就是4字节,然后从4字节以后分析下一条指令。。。就是说,指令是有其固定长度的数据的。

指令和数据存在于不同的段内。
代码段内的数据长度是根据指令分析出来的。
数据段内的数据是什么,需要看引用它的指令需要什么数据。
2011-1-24 10:28
0
雪    币: 93
活跃值: (55)
能力值: ( 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比较难上手)

有条件可以研究一下《深入理解计算机系统》的第一章和第四章(这本书好,虽然比较贵,而且有些地方需要一定数学基础,不过这些地方可以略过,不影响你对计算机的了解~)
2011-1-25 19:25
0
雪    币: 84
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
同意13楼。

正是因为数据、指令,对机器来说是无法区分的,所以才会出现以下技术:
1. 在不定长指令集的cpu上,使用“花指令”来干扰静态反编译。
2. 想办法把攻击指令当作数据送给程序,并且想办法让程序收到数据后再当作指令执行。很经典的就是缓冲区溢出攻击。

以上两点,都很典型,网上可以搜到大量资料。

具体到楼主的问题,cpu怎么知道哪个是指令,哪个是数据?
执行程序时,都有个入口,cpu从入口地址取出一条指令,开始解析指令并执行,
在执行这条指令时,将会确认下一条指令的地址,
(比如当前是一个普通的mov 指令,那么下一条指令地址就是紧跟着当前指令的;如果当前是jmp指令,那么下一条指令地址就是jmp的目标地址......)
然后执行下一条指令,并确认下下条指令的地址......

cpu完全是个傻瓜,就这么一条条指令执行下去...能执行到的,就是指令了,指令执行时,访问到的,就是数据...

假如你程序写错了,写了个jmp不知道跳到了哪里,cpu也不会知道,依然会按照你这个指令去执行,结果就可能是程序崩溃,如果是内核态,那就可能操作系统崩溃,典型的如windows的蓝屏死机...

当然,有的操作系统,甚至有的cpu,把内存属性做了区分,分为了可执行、可读、可写等属性,cpu把可执行程序文件中代码段的数据加载到可执行属性的内存区,并且cpu只能把可执行属性的内存中数据当作指令来执行,这样就可以防止程序崩溃时(或者恶意程序)把数据区的数据当作指令来执行,当然这是另外的问题了。
2011-2-26 00:13
0
游客
登录 | 注册 方可回帖
返回
//