能力值:
( LV12,RANK:530 )
|
-
-
2 楼
我以前在我写的RSA的帖子中说过:
与其把时间花费在算法上,不如把时间花费在防止软件被修改上。
|
能力值:
( LV12,RANK:770 )
|
-
-
3 楼
利用多层潜套变形陷阱call F8过去,就花花。。
CALL XXXX ;陷阱就花花了(call指令也可以让堆栈接受参数)
XXXX:JMP YYYY;
YYYY:ZZZZ;加密者可以挖陷阱(参数可有堆栈传来)
|
能力值:
( LV12,RANK:370 )
|
-
-
4 楼
构建跳转表
jmp xxx1
jmp xxx2
jmp xxx3
jmp xxx4
通过某种算法运算计算出一个跳转表的索引,然后就能通过跳转表实现间接跳转
程序中多种功能都要通过这个算法运算,然后跳去执行相应的功能。。这种跳转就不好爆了
|
能力值:
( LV9,RANK:330 )
|
-
-
5 楼
利用消息机制来传递各类信息(如SendMessage等)。
这种方法,爆破起来是最头疼的,如果你没有正版的key和或keyfile!
|
能力值:
( LV12,RANK:370 )
|
-
-
6 楼
最初由 laoqian 发布 利用消息机制来传递各类信息(如SendMessage等)。 这种方法,爆破起来是最头疼的,如果你没有正版的key和或keyfile!
这种方法必须得有window,不然没法处理Message
|
能力值:
( LV9,RANK:330 )
|
-
-
7 楼
是啊,可是我们难道能不用window吗?一般都要吧。
这个对功能限制特别好用!
你的跳转表的方法,似乎只能用汇编实现吧?方法倒是好好。
|
能力值:
( LV13,RANK:970 )
|
-
-
8 楼
最初由 Vegeta 发布 我以前在我写的RSA的帖子中说过: 与其把时间花费在算法上,不如把时间花费在防止软件被修改上。
没看过兄弟的文章。不过算法才是正道。耍手腕是早晚要挂的。
既然说跳转,顺便介绍一个老罗站点上的4字节跳转:
假设要实现下面的算法:
IF zf = 0
lodsb
ELSE
add al, 0AC
试试写成助记符?不知道读者朋友们会怎么写――我会写成这样:
jnz $+1
add al, 0AC
解释如下:
如果标志位zf等于0,则EIP会指向add al, 0AC的第2个字节,也就是AC――我们知道AC表示助记符lodsb
明白了吗?使人惊奇的是,整个算法的实现只用了区区4个字节!
|
能力值:
(RANK:410 )
|
-
-
9 楼
我学得算法和耍手段都是必须的。算法好的但跳转指令好找这很容易给人暴破,跳转指令不好找的但算法简单人家都不用再去找那个关键跳转了,利用消息和跳转表是一个好的方法。我原本也想在我的CrakMe v0.3上用自定义消息+Key来实现跳转到关键的比较点,但这次我想看看算法的难易度,所以没用(最后用OnTimer事件耍了一下手段,但给Dt老大一下子给解决了 )
|
能力值:
( LV12,RANK:370 )
|
-
-
10 楼
最初由 laoqian 发布 是啊,可是我们难道能不用window吗?一般都要吧。 这个对功能限制特别好用!
你的跳转表的方法,似乎只能用汇编实现吧?方法倒是好好。
我最近写壳程序,没有window
跳转表用高级语言一样可以实现。。。
我是用delphi写的
|
能力值:
( LV12,RANK:650 )
|
-
-
11 楼
nbw那个是耍手段的。因为恰好是巧合。
kx的方法1变形一下:
push eax
....
mov [esp],xxxx
...
ret
当然也可以先mov eax,esp什么的
耍耍花样。
要么利用user32/kernel32里的jmp esp什么的也可以,具体查shellcode去
mov esp,xxxx
call 7xxxxxxx
xxxx:pop eax
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
最初由 xIkUg 发布
我最近写壳程序,没有window 跳转表用高级语言一样可以实现。。。
........
传一个demo看看,好东西大家分享?谢谢
|
能力值:
( LV8,RANK:130 )
|
-
-
13 楼
to nbw:
应该是
jnz $+3
add al,0ach
才对吧。
|
能力值:
(RANK:460 )
|
-
-
14 楼
最初由 kanxue 发布
1、利用ret指令来实现跳转,如: push xxxxx //需要跳转的地址xxxxx ret
记得某个文件加密软件中就大量使用了这种方法。
如果用间接寻址或寄存器来实现此处的xxxxxx话,对于静态分析的难度会提高一些。
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
嘿,跳转表和消息都不错.SEH太高深不会完
我想了下.可以再加上DLL跳转.
只要把跳转的地址用自己的方式送出去就行了.那边要改的只是堆栈了.不知这方法有没有实用价值?
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
最初由 Vegeta 发布 我以前在我写的RSA的帖子中说过: 与其把时间花费在算法上,不如把时间花费在防止软件被修改上。
我的观点和你一致。
我认为算法并不是主要的,防跟踪才是软件保护的关键。
目前很多人总以为加密算法多高明就一定好。要知道软件保护不是数据加密。
你的key计算公式再复杂,别人根本不用去看你如何计算,只要用一下你算好的结果,或者连结果都不用,直接跳过去执行了。
我的建议和法宝是:
1)一些花指令可以做,但是只能挡住普通破解者,最多看作路上的几颗挡路石而已。像用ret代替call, jmp到指令中间,堆栈的迷惑、SEH等等。
2)多线程或多部件检查,可以采用。
3)多点多层保护。这是总体策略。
4)不但要发现跟踪,而且还不让人知道你发现了跟踪,这是秘诀。
5)表面的破解不代表真正的破解。让破解者永远不知道自己到底破解成功了没有。再深入的论述就暂时保留。
其实软件保护大体上将可以分为两类:
1)防止非法使用:比如非法复制,非授权功能的使用,超过期限的使用。
2)防止技术泄漏:比如跟踪分析,关键算法的获取。
两者的侧重点有所不同,但说到根本还是防止跟踪!
|
能力值:
(RANK:1060 )
|
-
-
17 楼
个人觉得没什么意义,改的话还是改成jxx就可以了嘛。
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
我想在这里讨论,谁也不会把真正有商业价值的代码和论述放出来,所说的只是不痛不痒的话,原谅我这个说实话的人!
|
能力值:
(RANK:1060 )
|
-
-
19 楼
自己做调试器,做PCODE解释器,如果有这个能力,就可以代替jxx了,当然也就隐藏了。
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
道高一尺魔高一丈.
制造自己的虚拟机是提高复杂性的有效方法,不过成本高一些
大的原理大家说了很多,就这个问题简单的其他的廉价间接手段可能还有:
1.溢出法,根据不同的情况计算结果动态计算进行溢出导致返回地址的改变.
2.windows的HOOK也可以用来改变跳转地址和反跟踪,可结合消息机制触发某些代码,和其他手段联合使用,改变流程
3.对后续代码根据call计算结果根据某些算法进行动态解密,正确的计算结果自然可跳转到正确的地址,错误的结果自然导致失败.
4.结合系统的一些其他机制,这些机制还有很多...等待去研究
抛砖引玉......
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
算法=复杂性
实际上,随着网络时代的到来,真正防破解可以用提供网络服务的形式解决,那个时候,不会再发行软件了,而是你输入数据,远程返回给你数据结果....不知道偶能不能看到这一天
跟加密狗的道理是一致的.
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
说来说去,不就是一个反跟踪吗?对高手用处不大。
|
能力值:
(RANK:10 )
|
-
-
23 楼
最初由 freeeman 发布
4)不但要发现跟踪,而且还不让人知道你发现了跟踪,这是秘诀。 5)表面的破解不代表真正的破解。让破解者永远不知道自己到底破解成功了没有........
比较重要。
严格来讲,应该用pcode结合程序代码交互运行,也即所谓的虚拟机,你自己解释你的重要子程序的运行。本人做过一个解释器,效果不错。另外的优点是,pcode不容易反编译,ida这样的静态分析不管用。
|
能力值:
( LV13,RANK:970 )
|
-
-
24 楼
最初由 Lenus 发布 to nbw: 应该是 jnz $+3 add al,0ach 才对吧。
好像不是吧。你去老罗主页查查opcode教程。
这个的确是手腕,我对手腕兴趣不大,因为自己一向很笨,不喜欢搞这些。另外,听大牛们说,好的程序不在于没个细节都优秀,在于整体完美。细节需要做的是让人看起来明白,清楚。
简单的才是最重要的。
|
能力值:
( LV12,RANK:650 )
|
-
-
25 楼
最初由 nbw 发布
好像不是吧。你去老罗主页查查opcode教程。 这个的确是手腕,我对手腕兴趣不大,因为自己一向很笨,不喜欢搞这些。另外,听大牛们说,好的程序不在于没个细节都优秀,在于整体完美。细节需要做的是让人看起来明白,清楚。
........
只是巧合,实际编程中很难有碰巧一句代码可以从中间拆成另一句的。
|
|
|