首页
社区
课程
招聘
用VM保护软件多少比例的代码是安全?
发表于: 2007-4-3 10:48 14165

用VM保护软件多少比例的代码是安全?

2007-4-3 10:48
14165
1、用VM保护软件的所有代码导致软件主程序太大,运行速度太慢。
2、请问用它只保护软件初始化、注册算法、注册验证、软件完整性校验部分安全吗?
3、如果不安全,请问用VM保护软件多少比例的代码是安全?

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

收藏
免费 1
支持
分享
最新回复 (24)
雪    币: 50161
活跃值: (20610)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
目前计算机速度快,如果你所保护代码对速度要求不高,完全没问题的。
首先你设计一套安全的保护架构,然后用VM对相关代码处理一下,目前来说还是很安全的。
2007-4-3 11:07
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
Kanxue坛主回复真快,谢谢。
用VM保护所有代码有时不能运行。

我的软件目前安全保护措施如下:
1、RSA注册验证
2、文件完整性校验
3、初始化数据用文件特征码加密、解密
4、用VM保护软件初始化、注册算法、注册验证、软件完整性校验部分。

这样的保护安全吗?谢谢
2007-4-3 11:28
0
雪    币: 263
活跃值: (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
4
新兴的国内为数不多的公开的加密团体P.E.T,
P.E.T站点进入>>>>

不是广告,LZ可以去发展!
2007-4-3 12:39
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
5
CRACKER面对VM的时候,它要做的是把VM的使用的指令与X86的对应关系整理出来,然后写一个编译器,将VM代码编译成X86。

也可以是用有意义的符号来显示VM代码,就象VB PCODE的反编译器那样。

也就是说,只要找出VM代码代表的意义,VM就被破解了。所以VM保护所有代码和保护关键代码是一样的。除非你在一个软件中,用不同的VM保护不同部分的代码。

我的建议是,用VM保护注册算法和注册验证(即比较注册码是否正确的判断语句,防止爆破)。
2007-4-3 14:59
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
6
将加密技术公开,只会让软件更容易被破解。包括那些只有思路的简单示例,至少让人知道你是怎么做的。

例如那个直接修改程序主体的想法的。

我要是做破解的,我关注你的版面,曾经看过你有这个想法。

我就会在ntdll!zwcreatefile下断,一个INT3和内存读取断点(这么做只是为了面对防止API断点的大多数方法都能断下来)。然后便会把我带去我想看的代码那里了。
2007-4-3 15:13
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢版主笨笨雄,是您的解答让我了解用不同的VM分别保护相应的关键代码是比较安全的。
对您的回复再次表示感谢。
2007-4-3 16:18
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
8
一般用一个,保护注册算法和注册是否成功的条件判断就够了

因为无论哪一个没保护好,后一个保护就没有任何意义。

一个以上的VM跟一个VM,对于CRACKER的工作量是没有区别的

除非你的软件用一个以上的加密算法,一个以上的注册条件判断。

一个以上的注册条件判断倒没什么,限制功能前面有这个东西很正常。

但是加密算法本来就花费很多时间,还用一个以上?而且还是在VM的情况下,你就不怕你的正版用户在点注册的时候误以为程序死掉了?
2007-4-3 16:31
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
谢谢版主笨笨雄的提醒:
1、我准备用一个VM用来保护 RSA注册验证部分
2、另一个用来保护软件初始化(初始化数据已经用程序特征码加密)和程序完整性校验部分。

再次对版主笨笨雄的回复表示感谢。
2007-4-3 16:44
0
雪    币: 263
活跃值: (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
10
不排除双向性,
一个男性自杀者的遗书:


几年前,我跟一个寡妇结了婚,她有一个已成年的女儿。
后来我父亲跟我妻子的女儿结了婚。
我女儿就成了我继母,我父亲成了我女婿。
两年后我妻子为我生了个儿子,她是我后母同母异父的弟弟,儿子管我叫爸爸,我管我儿子叫舅舅。
我女儿又为我的父亲生了一个儿子,他是我的弟弟,但他又必须得管我叫外公。
同时我是我妻子的丈夫,我妻子即我后母的母亲是我的外婆,所以我是我自己的外公...于是我想到了死……

用西裤的说话上面是嵌套错误死循环,你分析一遍吧,看看那个环节出问题了!

一个加密团队的产品仅仅是用市面上的那样一些很直观的代码来加密,无疑是最终是一个东拼西揍模块。既然是加密团队,必然是超越这种东拼西揍,更深入的是代码可读性的研究。不可能仅仅是玩像anti_*的游戏,

现在的壳已走向无脱壳机的时代,至少证明了一点,要人工全智能化的去分析,这已基本证明了代码的可读性已成为加密的研究主流对象。像刘涛涛的扭曲变换概念算得上是相当成熟的加密作品之一了。
试问,经过刘涛涛的扭曲变换,代码的分析不是已经进入了一个全新的代码暴力分析之中了吗!

当然,针对性的单方面说,在数M的代码中dump出关键代码并作暴力分析,远比分析数K病毒难得多。且病毒是有模块性的,在哪一部分是什么功能理论上是可以通过监视得出,所以使病毒的分析事半功倍。而在数M的带有在代码变形的产品中,模块没有那么严格的区分,本身dump就变得那么不容易了。

举实例:在采用VM技术的加密中,前提必然是把VM体分离出来,后面才可以更顺利的进行分析,才能进行加密核心(以注册算法核心为例)dump,才能后续分析。,也有不分离的,直接单步暴力式的,对于这种,用看雪老大的话说,同情F8键,不作别的

——————————————————————————————————————————
一下写了这么多,仅仅是从个人的技术认识上探讨而已,熊老大不要有太大压力感,并不是被你三言两语激恕的
2007-4-3 22:25
0
雪    币: 263
活跃值: (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
11
————————————————————————————
VM的简单理解就是无数个call一样的东东取代我们常见的运算

类似于VB程序,用大量的call取代了常规的sub add xor

————————————————————————————
我对VM的认识是这样,不知道有没有问题,

如果是按我的对VM理解逻辑的话,双层VM完全不同于一个VM的工作量,至少要分离一次以上VM体的哦
2007-4-3 22:36
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
12
我的意思是。使用两个不同编码规则的VM,一个用在注册算法上,另外一个用在注册验证的判断上。

只要解出任意一个VM,都可以破解该软件。

在VM上再VM,只要编码规则一样,工作量是一样的
2007-4-3 22:52
0
雪    币: 263
活跃值: (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
14
哈哈~
我的意思跟你一样
两个不同的VM工作量不一样!
两个相同的VM意义一样!
所以有了这句“至少要分离一次以上VM体的”

OK
结贴
2007-4-3 23:06
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
15
我的意思是,一些技巧性的东西,是不应该公开的。

另外,看雪翻译关于多态变形技术的文献,里面提到的,也是我所知道的最前沿。是生成更加人性化的垃圾代码,即让垃圾代码,看起来是有意义的。
2007-4-4 00:02
0
雪    币: 263
活跃值: (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
16
垃圾代码有点言过了~
他们都是全功能代码

add eax,ebx

53            push    ebx
50            push    eax
33C3          xor     eax, ebx
50            push    eax
59            pop     ecx
58            pop     eax
51            push    ecx
21D8          and     eax, ebx
D1E0          shl     eax, 1
5B            pop     ebx
03C3          add     eax, ebx
5B            pop     ebx


xor eax,ebx

53            push    ebx
50            push    eax
03C3          add     eax, ebx
50            push    eax
59            pop     ecx
58            pop     eax
51            push    ecx
21D8          and     eax, ebx
D1E0          shl     eax, 1
50            push    eax
5B            pop     ebx
58            pop     eax
2BC3          sub     eax, ebx
5B            pop     ebx

变形确有其说,关键还是环环相扣,例举了add eax,ebx 和xor eax,ebx,可以从中看得出,要扣起来是很容易的,
add eax,ebx和xor eax,ebx是完全可以扣在一起的,想找他的根,不会是那么容易吧!

论坛有有点相似的代码相扣的例子http://bbs.pediy.com/showthread.php?t=41671

2008, 一个期待,push&pull将会充斥IDA
2007-4-4 11:01
0
雪    币: 263
活跃值: (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
17
扣的技巧是可以公开的,倒底怎么样去扣,因人而异了,
分析一个死循环,真的会让人疯掉!
2007-4-4 11:05
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
18
你应该去看看关于多态变形技术的代码重整的相关文献,同样翻译版有。月中人翻译的很多文献都很有价值的。

你这样的代码很简单,可以通过数据流技术整理之后先舍弃无意义的堆栈操作和内存移动,然后通过数据加权,识别对垃圾数据的操作,进一步舍弃垃圾指令。

这种技术叫编译优化

真正难以识别的是随机条件跳转后两个分支是否等效。

另外,你对程序主体修改,记录使用次数,除非你自己写驱动,直接对硬盘读写,否则你始终还是要R0去的,我在NTFS和FAT驱动的IRP DISPATCH INLINE HOOK,难道还拦截不到?定位到想要看的代码,意味着我已经不需要分析整个程序,省去大量时间拉。你不认为吗?

当然,出版看雪的书的出版社,还有出版一本叫数据修复技术的书,里面对NTFS和FAT的系统文件格式有详细解释,相信看完要驱动,下点苦工还是可以。

但是即使是这样,还是有别的方法监控。R3切换R0,就那么几种方法,中断门调用门什么的。
2007-4-4 11:35
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
19
既然是讨论技术,就别用那么多形容词。什么疯掉不疯掉的。

只要你知道对方可能使用什么方法,灰盒分析就可以避免看大量的代码。简单的功能代码,甚至看都不看就能把你模拟出来。

THEMIDA的驱动就是一个好例子。

什么什么壳,用KANXUE的插件就可以在OD中跑起来,也是知道对方可能使用的方法,直接跳过相关分析的例子。

但是我分析过KANXUE的插件,我知道KANXUE是使用什么方法anti anti debug的。我就可以绕过它。
2007-4-4 11:46
0
雪    币: 263
活跃值: (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
20
受教了~
学习中~
2007-4-4 16:22
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
21
互相学习而已。我也是曾经在某帖看过你说的,加密最好是让CRACKER不得不分析整个程序。

我觉得很有道理,后来想了想,这应该是在对方完全不知道你使用什么方法的前提下。

否则几个断点,或者IDA里面的交叉参考,就把原来得分析全部变成分析某部分了。
2007-4-4 16:36
0
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
22
加密者和cracker都是很痴狂...
从火星飞到地球,从地球飞到火星...

往复轮回飞来飞去...

偶是旁观者...
淡泊宁静去逾越阿赖耶识...
2007-4-4 19:37
0
雪    币: 263
活跃值: (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
23
y=3
if len(pwd)>1 then
{
for i:=1 to len(pwd) do
{
if i<4 then
y=y+1
else
y=y-1

}
if y=3 then ‘成功’
}
‘失败’

不知道这个例子可不可以说明一定问题,
我的思想依然处于完全分析的概念中,因为他是扣起来的,前后是扣在一起的,
这个例子在不考虑爆破的情况下,首先要求得Y的来源
而这个Y的来源正可扣在整个代码中~
虽然一开始都是某部分分析,但最终结果来是完全分析了!
不知道这种理念正确与否....
2007-4-4 20:29
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
我新来的,学学.
2007-4-4 20:34
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
25
无论你要不要加密,破解软件,也是得从注册算法的开始分析的。。。。。

在你的例子中,我的意思就相当于隐藏注册算法
2007-4-4 23:41
0
游客
登录 | 注册 方可回帖
返回
//