能力值:
( LV2,RANK:10 )
|
-
-
2 楼
首先我先声明一下,我的表达能力不强,以下是我的个人见解:
在低级语言中对数据没有什么严格的定义,数据可以当指针用,指针也可以当数据用。
就是这么简单。
00403B33 |. 39D0 CMP EAX,EDX ====>这里只是检测eax和edx是否是同一个指针,
或说是否指向同一个地址。估计肯定是不同的。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
还有几点不明:
1\我想总有标明什么时候用的是数据什么时候用的是指针吧,传的是地址但没加[]指明寻址,那么这样和加[]寻址有什么区别和联系吗?
2\也就是说下面紧跟的CMP指令怎么知道两个寄存器里的职是数据还是指针?
3\是数据就好理解,但指针比较又是个什么原理呢?
这两个地址相同的可能性极小,那么如果他们指向的数据是相同的,CMP那不是判断不相等么,那用这个CMP不就没意义了么?
|
能力值:
( LV7,RANK:100 )
|
-
-
4 楼
"机器怎么判断寄存器里的数据是指针还是实际数据呢?"
答:机器不需要判断.
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
楼主要多动手试。光是讲理论是很难理解的。
|
能力值:
( LV4,RANK:45 )
|
-
-
6 楼
天啊 三个字 F A Q
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
现在就是这几点不明和参考书上讲的有些出入,思路跟不上了:
00403B2F |. 89C6 MOV ESI,EAX ; 把EAX内我们输入的用户名送到 ESI
00403B31 |. 89D7 MOV EDI,EDX ; 把EDX内的数据“Registered User”送到EDI
00403B33 |. 39D0 CMP EAX,EDX ; 用“Registered User”和我们输入的用户名作比较
00403B35 |. 0F84 8F000000 JE CrackMe3.00403BCA ; 相同则跳
1\上面代码紧跟的CMP指令怎么知道两个寄存器里的职是数据还是指针?
2\是数据就好理解,接CMP马上是JE指令肯定CMP指令已得出结果但指针比较又是个什么原理呢?
两操作数相减么?
太菜希望大家别见笑
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).
寄存器里面为数据,比较后,若相等则JE实现跳转(根据零ZF判断)
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
个人理解:
CMP 是对两数进行相减,进行比较
所以是指针的比较
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
CMP 是对两数进行相减修改标志位,而跳转指令只是根据相关的标志位而决定是否跳转。
所以cpu不需要理会那数有什么意义
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
我想是我没表达清楚,如果是指针数据相减有意义么?
如果上指针相减比较成立,那么我要实际比较假如1,2这两个数的话
那就是
第一种情况: 第二种情况:
1h,2h为实实在在的数 1h,2h为地址如果他们所指的内容相同
mov eax,1h mov eax,1h
mov edx,2h mov edx,2h
MOV ESI,EAX MOV ESI,EAX
MOV EDI,EDX MOV EDI,EDX
CMP EAX,EDX CMP EAX,EDX
... ...
这两种情况是不是都得出同一个结果,两种情况都是1h,和2h做减法么?
那我第二中情况不是达不到逻辑比较意义么?本身相等的数据却变成不等了
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
CPU里面把寄存器的内容都当做数据
只有我们要求CPU把他当做指针时他才是指针
如下:
假设我们在00430000处有一字符串
我们mov ebx,00430000;<这里把00430000看做是一个立即数据传入ebx
push [ebx];加上[]后,CPU就把先前的数据当指针使用了
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
我是个菜鸟,开始也有同样的疑惑,慢慢调试后这么理解,不知道对不对:
mov esi, eax
mov edi, edx
cmp eax, edx
eax,edx里的存放的数据是个地址。
CMP eax, edx,就是比较数据相不相同,也就是比较是不是指向同一地址。
说错了请高手不要见笑!
|
能力值:
( LV7,RANK:100 )
|
-
-
14 楼
00403B31 |. 89D7 MOV EDI,EDX ; 把EDX内的数据“Registered User”送到EDI
EDX中的数据不可能是“Registered User”,它是16个字节,EDX只有4个字节,所以是地址,楼主的这段代码00403B33 |. 39D0 CMP EAX,EDX 要么是有什么特殊用途,比如真的是比较地址是否相同,要么就是楼主的注解错的,比较的是数据,而且不是“Registered User”
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
虽然不知道这段代码后面怎么写的,我猜是比较字符串地址是否相同,也就是比较指针是否相等。
验证爆破之一?防止后面的运算中,正确注册字符串和自身比较?
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
楼主所说的这段程序是CrackMe3中用来判断是否输入用户名的一部分
00403B2F |. 89C6 MOV ESI,EAX ; 把EAX内我们输入的用户名送到 ESI//当我们没有输入用户名的时候EAX内的数据应该是“Registered User”
00403B31 |. 89D7 MOV EDI,EDX ; 把EDX内的数据“Registered User”送到EDI
00403B33 |. 39D0 CMP EAX,EDX ; 用“Registered User”和我们输入的用户名作比较
00403B35 |. 0F84 8F000000 JE CrackMe3.00403BCA ; 相同则跳//我从网上很多地方看到说JE是根据ZF零标志位判断是否跳转的,当我们不输入用户名的时候,EAX和EDX内的数据应该是一样的,CMP使用的是减法比较,比较过后相同,应该是在零标志位ZF=1,表示运算结果的所有位为0,JE判断后直接跳过下面的运算程序,就跳出“wrong serial,try again!”了。
我感觉12楼说的应该对一些。在此CMP没有必要判断比较的是指针还是数据,因为都是二进制,CMP只要判断2个二进制是否相同就可以,相同表示没有输入用户名,然后就直接跳。
另外说一点对于JE的理解
我脱WIN98的壳的时候看到很多JE SHORT WIN98记事本* *******
我从网上找了很多,在此参照楼主的帖子,我感觉 JE后边的那个名字就是要在那个程序内部跳
我听过程序领空和系统领空,大概一个程序内部的地址就是一个程序的领空,防止跳出程序出现错误。另外再说一点,也许大家都知道,就是怕大家忘了。
JE和JZ 相等则跳
JNE和JNZ 不相等则跳
JB 小于则跳
JA 大于则跳
JG 大于则跳
JGE 大于等于则跳
JL 小于则跳
JLE 小于等于则跳
JMP 无条件跳
CALL 调用子程序 (子程序相对来说大概就像C语言的函数库,方便使用)
POP 出栈
PUSH 入栈
RETN 返回主程序(感觉有些壳找不到JMP跳,就是使用的RETN跳的)
NOP 空指令
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
不过我又拿OD看看一下,感觉上边我说的有问题,没有输入用户名的时候EAX内好像不是“Registered User”而是"Unregistered..."
堆栈 ss:[0012F9AC]=00D46BC4, (ASCII "Unregistered...")
eax=0000000F
|
能力值:
( LV3,RANK:20 )
|
-
-
18 楼
鄙人才疏学浅,简单分析下,没得到原程序
00403B2F |. 89C6 MOV ESI,EAX ; 把EAX内我们输入的用户名送到 ESI//当我们没有输入用户名的时候EAX内的数据应该是“Registered User”
00403B31 |. 89D7 MOV EDI,EDX ; 把EDX内的数据“Registered User”送到EDI
00403B33 |. 39D0 CMP EAX,EDX ; 用“Registered User”和我们输入的用户名作比较
(复制来的)
如果楼上的没分析错,一般来讲,此时EAX (说是输入的用户名)里面应该是个内存地址,是存放输入用户名的首地址!我觉得怎么也不可能是用户名的ASC吧,一个寄存器的位数是有限的,而要存储的字符ASC确是没有限制的!所以如果楼上的看程序分析得对,此三句的意思就是比较两个地址是否相同了.理论上是不会同的,要不还不乱套了?作者故意的?
比较字符串是否相等,似乎要按位比较吧,没见过一句话就能比较一个字串的
好象一般用API函数取得的字符串,返回的都是他们的位数
大胆猜测下,难道是比较位数是否相等?吼吼
乱想下了
|
能力值:
( LV3,RANK:20 )
|
-
-
19 楼
鄙人才疏学浅,简单分析下,没得到原程序
00403B2F |. 89C6 MOV ESI,EAX ; 把EAX内我们输入的用户名送到 ESI//当我们没有输入用户名的时候EAX内的数据应该是“Registered User”
00403B31 |. 89D7 MOV EDI,EDX ; 把EDX内的数据“Registered User”送到EDI
00403B33 |. 39D0 CMP EAX,EDX ; 用“Registered User”和我们输入的用户名作比较
(复制来的)
如果楼上的没分析错,一般来讲,此时EAX (说是输入的用户名)里面应该是个内存地址,是存放输入用户名的首地址!我觉得怎么也不可能是用户名的ASC吧,一个寄存器的位数是有限的,而要存储的字符ASC确是没有限制的!所以如果楼上的看程序分析得对,此三句的意思就是比较两个地址是否相同了.理论上是不会同的,要不还不乱套了?作者故意的?
比较字符串是否相等,似乎要按位比较吧,没见过一句话就能比较一个字串的
好象一般用API函数取得的字符串,返回的都是他们的位数
大胆猜测下,难道是比较位数是否相等?吼吼
乱想下了
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
假设(AX)=0056H,(BX)=0156H
那么再执行CMP AX,BX ;之后,各个标志位是多少?
答:CF=1、OF=0、ZF=0、AF=0、PF=1、SF=1。
再假设(AX)=FFEFH,(BX)=1D3FH
那么执行SUB AX,BX ;之后,各个标志位是多少。
答:CF=0、OF=0、ZF=0、AF=0、PF=0、SF=1。
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
自己Google一下,可以找到很多的,建议楼主好好学学汇编
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
比效指令 CMP(CoMPare)
格式: CMP OPRD1,OPRD2
功能: 对两数进行相减,进行比较.
说明:
1. OPRD1为任意通用寄存器或存储器操作数.
OPRD2为任意通用寄存器或存储器操作数,立即数也可用作源操作数OPRD2.
2. 对标志位的影响同SUB指令,完成的操作与SUB指令类似,唯一的区别是不将OPRD1-OPRD2的结果送回OPRD1,而只是比较.
3. 在8088/8086指令系统中,专门提供了一组根据带符号数比较大小后,实现条件转移的指令.
|
|
|