首页
社区
课程
招聘
[原创]实时混淆在线编译器
发表于: 2012-12-4 16:54 19377

[原创]实时混淆在线编译器

2012-12-4 16:54
19377
[bits 32]
%define Key 1234
%define dwFlag 12345678

mov edi,dwFlag
mov eax,dword [edi]
cmp eax,Key
jz @1
mov eax,0
jmp @2
@1:
mov eax,Key
@2:
mov dword [edi],eax

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 6
支持
分享
最新回复 (22)
雪    币: 55
活跃值: (519)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
2
一个字,“
两个字,“真牛
三个字,“真是牛!
mark,收藏。
2012-12-4 17:20
0
雪    币: 219
活跃值: (783)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
3
谢谢 啊 mark
2012-12-4 17:50
0
雪    币: 177
活跃值: (471)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
support~
2012-12-4 18:06
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
5
调试起来是个问题。
2012-12-4 19:36
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
6
200byte ->200kb
只要搞清楚Client对这200kb的处理方式,还有必要去逆向这200kb的数据吗?
2012-12-4 19:43
0
雪    币: 1233
活跃值: (907)
能力值: ( LV12,RANK:750 )
在线值:
发帖
回帖
粉丝
7
我感觉不太靠谱,楼主应该画一个详细的流程图,大家才好帮你分析啊,你一上来就搞一堆汇编
对大伙思路是一个考验啊,至少我看得云里雾里,不知道你具体是怎么搞的
2012-12-4 20:29
0
雪    币: 189
活跃值: (56)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
这个输入的是nasm源代码,输出混淆后的二进制代码,开发时仍然本地进行,开发完成后,把需要混淆的部分代码上传到服务器,给最终用户前从服务器得到实时混淆的代码,插入到主要程序相应的位置,完成交付即可.
2012-12-5 08:32
0
雪    币: 189
活跃值: (56)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
有必要的,前面我举的例子没有表述清楚,因为用户的项目具体内容不便透露,我另外想了一个应用场景,请指正.

用网格计算进行密码破解的场景,客户机有空闲时间时向服务器申请,服务器从字典文件中抽若干个发给客户机,客户机进行
运算,如果运算符合了,直接把结果告诉服务器,运算完所有,也告诉服务器,服务器按客户机运算的次数给客户积分.

一开始,是直接明码通讯的,很快,管理员发现有邪恶的人申请后不进行运算,伪造运算完所有的结果发给服务器,骗得积分.
于是管理员改进了,在通讯时包含一个密匙,结果用密匙加密后再发回给服务器.

然后,发现有更邪恶的人直接破解了程序并加了PATCH,程序收到任务和密匙后,不执行,直接用密匙加密伪造的结果后发回服务器.

再然后,管理员把运算计分部分和对结果进行加密部分从主程序提取出来,在客户申请的时候连代码+数据发过去,写入内存后执行,
...时间不长,实时patch出来了...

现在我们把运算计数部分和对结果进行加密部分在发给用户前,用我们的小玩具混淆起来,从200byte -> 200KB(或更大,越大越能保证不在密匙有效期内被破解.)

我们知道要伪造有2个条件,1个是获得密匙,2是知道在用密匙加密前,计分结果的存放的地方(某内存地址或某寄存器).

而要获得这2个条件,都必须分析被混淆后的200kb的代码,

因为是一次一乱的.即使手上有完整的混淆前的代码,也必须分析这混淆后的代码才能实现伪造.

通过这个小玩具想做到的是一次一混淆,程序员开发一次,而用户得到的完整副本或副本的关键位置代码却是各式各样
2012-12-5 08:34
0
雪    币: 189
活跃值: (56)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
10
这个小玩具其实就想做一件事,把代码变得更大,更乱,混淆后连他妈(开发者)都认不出他.当然,代码的原功能是不变的.
思路其实刘涛涛大神的 扭曲变形 一文 (1楼附录1) 已经表述清楚了,区别是1:我们目前只支持纯的nasm代码,还不支持obj们,
2:我们的混淆是在线实时进行的,一次一编译,一次一混淆,也符合现在流行的云吧 :),不再是开发者混淆好了发拷贝给用户,而是可以让用户每次取得都不同.

1楼的DEMO 中的链接可以把参数dwFlag值改成一个有效可读写的内存地址(堆栈之类),
然后下载的2进制码可以直接在调试器里开跑,会发现它实现的就是DEMO中原始代码的功能,当目标内存地址和Key相同时,不变,否则目标内存地址就被置0
2012-12-5 08:36
0
雪    币: 967
活跃值: (1138)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
11
得了 你还是尽量简单点吧 从服务器传个key就可以了 升级太麻烦了 感觉不实用
2012-12-5 08:44
0
雪    币: 107
活跃值: (404)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
特殊需求,特殊对待...

学习了..

有时间膜拜一下你们的神器..看看到底有多屌
2012-12-6 07:52
0
雪    币: 1233
活跃值: (907)
能力值: ( LV12,RANK:750 )
在线值:
发帖
回帖
粉丝
13
结合你假设的场景我又看了一遍,貌似是可行的,关键是那个key一定要足够混淆才行,而且地址应该确保能够随机,否则:
1、我先加载你的混淆后的代码到内存一个基地址Base
2、我在你发送数据前调用的某个API函数,你总要用socket发送数据吧?
3、执行混淆的代码,断下来后,你的key是否内存位置是随机的?如果不是就可以获取到你的key
4、如果你要调用外部实现的加密算法的话,那key基本就等于明白的告诉破解者了

另外我认为刘滔滔的这种类型的加密其实理论上是可以还原的:
假设你一共有M1、M2、M3、Mn个变形模版,输入为S_in, 输出为S_out = M3(M2(S))...【其中的模版序列相当与密钥】
对于模版类型的加密会留下一个很明显的特征:就是最后一次的模版必然会暴露,还有就是单一模版一定存在一个对应的解谜模版
例如M1一定存在一个解密的M1'模版。
如果破解者能够通过大量的样本统计【或者开发人员泄密】获取到所有的M1,M2...Mn变形模版
1、对S_out依次检查M1-Mn,如果有模版匹配,对其执行对应的解密模版
2、重复1,直到没有模版匹配
2012-12-6 08:38
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
14
分布式计算,要有一部分冗余计算的
客户端算没算对,是可以校验的,哪有客户端发上来的结果,不经过校验就接受的?
校验得适当,客户端不加密,也无法作弊的

你这个应用场景的架构本身就有问题,被作弊是必然的
2012-12-6 11:17
0
雪    币: 189
活跃值: (56)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
15
首先,感谢您看完我的大段文字.

key是被放在代码里,作为代码被多态混淆

如最简单的XOR加密
xor [123],key
会被多态为:
xor [123],key ^ rand
xor [123],rand
这样即使知道key(实际是不可能知道的),也不能直接搜索代码部分定位到.

至于解密部分,理论上是可以的,特别在模板比较少的情况下,但我们这个多态混淆模板用户可以自己添加并互相共享,每添加一个,复杂度都会上一个指数级,在庞大后不但不可能被恢复成原来的代码.想精简到原代码的程度都会比较困难.

这个工具的目的不是保护程序无法被破解,而是要一次一混淆,你破解了一个copy,OK ,但也就代表这个copy被破而已.
2012-12-6 14:17
0
雪    币: 189
活跃值: (56)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
16
您指的冗余计算是指比如把相同要求发给不同人,然后比较是否结果相同来判断是否有人作弊吗?

但冗余计算无法检测。。他们实际做没做这个事情,比如分布式计算某密码,每人发了100个字典,都不匹配,结果一样,但有人就根本没有计算,直接返回,那就用冗余计算无法识别了,如果只有匹配了才算积分,那冗余计算是可以的,但如果要按客户机消耗运算能力来计积分,冗余计算就无能为力了。
2012-12-6 14:22
0
雪    币: 189
活跃值: (56)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
17
接受大家意见,原来的DEMO是二进制代码,不能直接运行,调试起来比较麻烦,改成了用可执行文件,方便大家加载调试,查看效果

多态混淆前原代码和一楼相同:
[bits 32]
%define Key 1234
%define dwFlag 12345678

mov edi,dwFlag
mov eax,dword [edi]
cmp eax,Key
jz @1
mov eax,0
jmp @2
@1:
mov eax,Key
@2:
mov dword [edi],eax


加载后如下图:


为方便测试,dwFlag的位置固定为程序入口处前4个字节,Key固定为0cccccccch
运行效果:
当把dwFlag位置修改为非0cccccccch后,运行后会被置0,不改变dwFlag位置(原为0cccccccch),运行后不变。
这个效果和上面的原代码一样。

但重点是:你会发现每次下载的代码都是被实时混淆多态的,每次下载都不一样哦!虽然它们做的工作是一样的。

DEMO下载地址:
http://unest.org/demo/demo.php
上传的附件:
2012-12-6 14:23
0
雪    币: 1022
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
设要求云用户查询数A是否为1-100000区间内MD5的值。
选择一个4字节随机数设为R = 12345678,随机选择一个要加载的bit,设为第0位。
根据R生成发往用户端的数据,
M[0]为A;
从R的第1至31位:
若此位为1,则随机选择一个1-100000区间内MD5的值(设为A1);
若此位为0,则随机选择一个随机数(设为R1)。
发给用户查询的数据应该为M[32]={A,R1,A1...Rn..An}

用户端计算MD5(1-1000000)是否为M[i],若相等则对应第i位标记为1。
最后将计算的结果发往服务器。

若A是1-100000区间内MD5的值用户将返回12345679(R + 1),否则返回12345678,返回其他数据则是伪造的。
用代码描述应该是很简单的,这个过程可以证明用户若不能破解MD5,则必须计算MD5(1-1000000),否则会被服务器发现。
密码字典等其他算法也是类似的,只需要加入一些已经在字典中的hash看用户是否能正确识别出来就行了。
2012-12-6 14:48
0
雪    币: 1632
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
我只是来占楼的
2012-12-6 15:18
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
20
这个还是你算法设计的不好,18楼的密码学版主已经解答过了。

不要把Compare过程放在客户端,要把Compute过程放在客户端

我再通俗地给你把算法改造一下

计算某密码,假设计算过程 FN(D, K) = M

你的需求可能是,下发D,下发K1 - K100,然后算出相应的M1 - M100,

把M1 - M100传到服务器上来,判断K1- K100计算结果是否满足要求

本地只有计算过程,没有比较过程,这样客户端算错了,很容易处理
2012-12-6 18:10
0
雪    币: 1233
活跃值: (907)
能力值: ( LV12,RANK:750 )
在线值:
发帖
回帖
粉丝
21
[QUOTE=lingyu;1123680]设要求云用户查询数A是否为1-100000区间内MD5的值。
选择一个4字节随机数设为R = 12345678,随机选择一个要加载的bit,设为第0位。
根据R生成发往用户端的数据,
M[0]为A;
从R的第1至31位:
若此位为1,则随机选择一个1-100000区间内MD5的值(设为A1...[/QUOTE]

来一个通俗易懂的:
发送给用户的数据中有部分数据是已知的,用来校验客户端是否恶意计算结果
服务端生成一个随机【客户端不可知,服务端知道】序列:
校验数据1、计算1、计算2、校验数据2。。。
然后客户端就傻了,因为不知道那个数据是校验数据,如果校验算错,结果将不可信,只能全部计算一遍,
服务端只需要测试对应序列所有的随机位是否是1,很容易就知道是否伪造数据了
2012-12-6 19:59
0
雪    币: 189
活跃值: (56)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
22
感谢lingyu,海风月影,boywhp三位,明白了冗余计算的原理,确实是非常巧妙的设计,但它也有自身的限制,它需要服务器能预先知道结果,才能用来作为判断客户端是否说谎的标准,遇到服务器无法预知结果的情况就无法适用了。不过确实,在我假设的这个场景中,冗余计算比代码混淆来得合理的多。
2012-12-6 20:58
0
雪    币: 79
活跃值: (35)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
23
可以研究一下SSL,非对称加密就是解决这个问题
2012-12-10 22:02
0
游客
登录 | 注册 方可回帖
返回
//