首页
社区
课程
招聘
一个关于shl,shr 汇编逆反的问题
发表于: 2013-9-4 18:47 8792

一个关于shl,shr 汇编逆反的问题

2013-9-4 18:47
8792
一个很初级的关于移位操作的问题,请大家解释一下如何解决
假定某个函数有如如下代码:
mov eax, 0ABCDh
SHR eax, 5
SHL  eax,5
SHR eax, 5 代码执行后  eax = 055E (hex)

我的问题是为什么
SHL  eax,5   执行之后 eax  = ABC0  而不是恢复  原来的ABCD

SHR 不是 SHL的逆反操作吗
如果不是逆反操作,如何写出正确的代码,使eax恢复原来的值0ABCD

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 1372
活跃值: (5343)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
2
............

楼主很强大

能问出这种问题的 不是一般人
2013-9-4 18:50
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
mov eax, 0x0ABCD
shr eax, 5
shl eax, 5
shr eax, 5
shl eax, 5
shr eax, 5
shl eax, 5
add eax,0xD
2013-9-4 18:57
0
雪    币: 159
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
见笑了,我的汇编知识很浅:)
我的问题其实是

为什么

mov eax, 0abcd
shr    eax,5

不是
mov eax, 055e
shl   eax,5

的逆反

如何实现逆反

2013-9-4 18:58
0
雪    币: 159
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢。但你这代码重复好几次,没什么意义,还不如下面简单
mov eax, 0x0ABCD
shr eax, 5
shl eax, 5
add eax,0xD

但关键是这句add eax,0xD
为什么少了不行

比如第一句 若变成 mov eax, 0xabc3
是不是最后一句就变成了
add eax, 0x3

其实说明了shl 并不是shr的简单逆反,涉及到某个位上的数字(最后几位或者前面几位截去)的问题

2013-9-4 19:20
0
雪    币: 458
活跃值: (306)
能力值: ( LV12,RANK:400 )
在线值:
发帖
回帖
粉丝
6
逻辑移位又不是循环移位。。你用ROR,ROL试试就可以了。
2013-9-4 19:24
0
雪    币: 182
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
换成2进制,一看就知道了,你把原来的0,1,2,3,4这5位都移动没了,怎么可以能还原!
2013-9-4 19:25
0
雪    币: 159
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这位兄弟说的在理。 以前我想当然直观认为shl跟shr 就是相反的操作,其实还是有些差别的。
其实我是要写出相关的逆反代码,才问道这么个“愚蠢” 的问题

2013-9-4 19:29
0
雪    币: 159
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
假若前面eax付的值是任意hex值,由于移位数字截留的问题,那么有没有可能根据移位后的值反推出移位之前的值??我最关心的是这个问题

2013-9-4 19:36
0
雪    币: 159
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
或者说下面这么一个函数 ,有没有可能写出它的逆反函数代码吗?

@lsdecode_00402820:                          ;<= Procedure Start

        push ebx
        xor eax,eax
        push ebp
        push esi
        
        mov eax,08DDE6E40h

@lsdecode_00402886:

        mov esi,dword ptr ds:[edx]
        mov ebx,esi
        mov ebp,esi
        shr ebx,5
        shl ebp,4
        xor ebx,ebp
        add ebx,esi
        mov esi,eax
        shr esi,0Bh
        and esi,3
        mov esi,dword ptr ds:[edi+esi*4]
        add esi,eax
        xor ebx,esi
        sub dword ptr ds:[ecx],ebx
        mov esi,dword ptr ds:[ecx]
        mov ebx,esi
        mov ebp,esi
        shr ebx,5
        shl ebp,4
        xor ebx,ebp
        add ebx,esi
        add eax,061C88647h
        mov esi,eax
        and esi,3
        mov esi,dword ptr ds:[edi+esi*4]
        add esi,eax
        xor ebx,esi
        sub dword ptr ds:[edx],ebx
        test eax,eax
        jnz @lsdecode_00402886
        pop esi
        pop ebp
        pop ebx
        retn 4
2013-9-4 20:06
0
雪    币: 357
活跃值: (3573)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
11
前面说"愚蠢"的问题,后面又问"愚蠢"的问题

你到底是懂还是不懂?

shl,shr 不可以逆反
rol,ror 可以逆反
2013-9-4 20:13
0
雪    币: 159
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我懂一些,但理解的不是很透彻。上面其实我也说了shl和shr 是不可逆的,但不是完全确定。

2013-9-4 20:21
0
雪    币: 807
活跃值: (2348)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
shl eax,8

    操作将使得eax的高8位被丢弃,低8位充0。

shr eax,8

    操作将使得eax的低8位被丢弃,高8位充0。

   这两个操作都会给操作对象造成无法恢复的伤害,操作过后导致数据永久性丢失,不可能恢复。

shl eax,8
shr eax,8

    操作的直接结果是使 eax 的高8位和低8位永久性丢失,其等效指令为:

and eax,00FFFF00

   经过这样操作你能有办法恢复吗?
2013-9-4 20:28
0
雪    币: 182
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
能恢复的是循环移位,逻辑移位和算术移位是不一定的!
2013-9-5 22:47
0
游客
登录 | 注册 方可回帖
返回
//