首页
社区
课程
招聘
一种很难实现的技术-指令复用
发表于: 2014-1-7 11:58 6583

一种很难实现的技术-指令复用

2014-1-7 11:58
6583
一种很难实现的技术-指令复用
有没有可能实现这样的技术:同一堆汇编指令,被某个key解密后能实现a功能,被第二个key解密后又实现b功能

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

收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
个人觉得很难
2014-1-7 12:02
0
雪    币: 68
活跃值: (105)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感觉像解释器
2014-1-7 12:06
0
雪    币: 7068
活跃值: (3517)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
4
汇编指令如何解密?应该是加密后的指令吧?
用xor 应该可以,不过key2就得跟指令一样长。
举个例子:
执行的指令1
55              push    ebp
8BEC           mov     ebp, esp
用key1 0x7F按字节异或得到加密后的数据edata:
2AF493

执行的指令2:
C1E804         shr     eax, 0x4

拿加密后的数据与指令2异或。得到key2[3]:
EB1C97

这样key1的长度是固定的是1字节。key2的长度与指令2的长度相等。
用key1按字节异或加密的数据,就可以得到执行的指令1
用key2异或加密的数据,就可以得到执行的指令2

这种方法只适合保护软件
2014-1-7 12:18
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我觉得应该是这样理解

指令A

指令B。

将B作为key . 可以计算得到指令C。

那么反过来 , 将C作为key做逆运算,可以得到指令B,同时也可以得到指令A。

所以只要数据量足够大,是可以得到的。
2014-1-7 13:07
0
雪    币: 28
活跃值: (42)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
楼上正解,两次异或就可以反得到以前的 A 或 B 指令序列。
2014-1-7 13:22
0
雪    币: 623
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
http://www.mouseos.com/assembly/example/multiplex.html
2014-1-7 13:30
0
雪    币: 13
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
可以实现 !  把代码从写  我写了个实现加密的壳 实现代码从写(写入覆盖指定子程序)在启动子程序  多线程启动两个线程实现修改 和执行代码 可以实现边修改边执行 执行了一个片段就解密下一个要执行的代码片段 循环   这个是看太极图 想到的方法
2014-1-7 13:39
0
雪    币: 1491
活跃值: (975)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
9
简单的或许可以,但正常软件所使用到的汇编指令太多,如何一一转换
2014-1-7 14:37
0
雪    币: 1491
活跃值: (975)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
10
高人啊,能否共享下代码
2014-1-7 14:38
0
雪    币: 211
活跃值: (77)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
11
他这个应该属于边解密边执行吧,而不是同一段指令经过不同的key转换成另外一种功能的指令。
2014-1-7 15:46
0
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
可以 很容易实现
mov eax,0x1000000
call [eax]

把0x1000000里面的内容处理了就行了
2014-1-7 15:51
0
雪    币: 211
活跃值: (77)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
13
[QUOTE=iceway;1253500]可以 很容易实现
mov eax,0x1000000
call [eax]

把0x1000000里面的内容处理了就行了[/QUOTE]

你这个貌似属于复用一片地址空间,要想实现不同的功能,地址空间里得提前放置进去不同的指令,好像楼主的意思是一个指令序列A能实现某种功能,然后用一个key进行加密或解密或散列等等操作刚好转换成另一个指令序列B,而B能实现另外一种功能。
2014-1-7 16:08
0
雪    币: 334
活跃值: (92)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
14
我感觉 有些网友没理解透我的意思吧
同一堆汇编指令,被某个key解密后能实现a功能,被第二个key解密后又实现b功能

就是说 以下这几个指令:
mov eax,ebx
push eax
经过某个解密算法后变成
add ebx,ecx
ret
还是刚才那几条指令,经过另外一种解密算法后变成:
lock xadd [ecx],edx
sub eax,edx

或者只是说进行简单的xor,也能把原来的指令序列变成其他功能。当然这得对指令千挑万选才行啊。比写shellcode难多了。
如果说能作出来,应该是很强大的
2014-1-7 16:46
0
雪    币: 0
活跃值: (221)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
兄弟的想的好远 一步一个脚印 相信你会有成就的
2014-1-7 20:58
0
雪    币: 7068
活跃值: (3517)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
16
这个真心不错~
2014-1-7 22:01
0
雪    币: 1711
活跃值: (516)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
17
某种意义上说,壳和花指令就是干这个的,但只能迷惑反编译器,而“最后执行的”==“解密算法解码后的”,动态脱壳就靠这个。所以如果不改CPU,你想实现的功能就是加壳嘛。

真要实现你要的功能,解码要在CPU内部发生,比如CPU内部增加一个专门用于解码的MCU,MCU根据私钥对执行前的"指令"解码,生成真正执行的指令通过专门的通路把和私钥配对的公钥传给MCU。当然还要解决至少两个问题:保证只有合法访问能够和MCU通信,CPU执行效率问题。现在的通用CPU和操作系统都不会这么搞的,太过复杂以及没有必要,因为已有的手段已经能够起到比较好的保护作用。
2014-1-7 22:43
0
雪    币: 297
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
同一扇门,用不同的钥匙打开,可以看到不同的世界?从最简单的异或试试。。
2014-1-8 01:57
0
雪    币: 166
活跃值: (392)
能力值: ( LV13,RANK:357 )
在线值:
发帖
回帖
粉丝
19
只要key足够长就行.....
2014-1-8 07:26
0
雪    币: 28
活跃值: (42)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
20
对,我说的简单异或得到的结果有可能不是指令了,A 或 B 两条序列异或,一般情况下得到的肯定是一个不能执行的序列,因为指令集在设计的时候也不会考虑去遵循这样的规律,即使偶尔千挑万选得到某些指令存在这样的偶然,但通过这些少数的指令也很难完成通用程序所需要的功能,再加上很多指令都会对地址进行直接编码,而地址也只有通过添加偏移来造成不同程序段来避免内存覆盖。所以结论是,可能是有的,只是猜测,因为我也没有实际去发现哪些指令存在这样的特性,解决思想就是利用这些极少数的特性指令,通过频繁读取内存(就可以少用寄存器,使指令简单),然后在内存寻址的时候用 key 加上偏移,对指令进行针对性的加密,那么 key 就是由这些指令 key 和内存地址偏移组成,小心地还原出不同的代码段。但是否能成功,没有验证过,只是这种想法而已。
2014-1-8 09:31
0
游客
登录 | 注册 方可回帖
返回
//