首页
社区
课程
招聘
[2005.2月话题]如何隐藏跳转指令
2005-2-1 09:17 31127

[2005.2月话题]如何隐藏跳转指令

2005-2-1 09:17
31127
常见软件判断形式一般如下,因此只要找到关键点即可爆破。

call xxxx
test eax,ebx
jz   //致命点

这个月我们讨论话题就是,如何更好地处理跳转这步,尽可能防止软件被通过修改而破解。

我先给出几个方案:

1、利用ret指令来实现跳转,如:
push xxxxx  //需要跳转的地址xxxxx
ret

2、利用精心构造的SEH来实现跳转,如构造的巧妙还是能让新手摸不着北的。

3、利用消息机制来传递各类信息(如SendMessage等)。

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

收藏
点赞0
打赏
分享
最新回复 (53)
雪    币: 431
活跃值: (442)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
Vegeta 13 2005-2-1 10:17
2
0
我以前在我写的RSA的帖子中说过:
与其把时间花费在算法上,不如把时间花费在防止软件被修改上。
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
qiweixue 19 2005-2-1 11:00
3
0
利用多层潜套变形陷阱call F8过去,就花花。。

CALL XXXX ;陷阱就花花了(call指令也可以让堆栈接受参数)

XXXX:JMP YYYY;

YYYY:ZZZZ;加密者可以挖陷阱(参数可有堆栈传来)
雪    币: 116
活跃值: (220)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
xIkUg 9 2005-2-1 11:00
4
0
构建跳转表
jmp xxx1
jmp xxx2
jmp xxx3
jmp xxx4

通过某种算法运算计算出一个跳转表的索引,然后就能通过跳转表实现间接跳转

程序中多种功能都要通过这个算法运算,然后跳去执行相应的功能。。这种跳转就不好爆了
雪    币: 332
活跃值: (479)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
laoqian 8 2005-2-1 11:16
5
0
利用消息机制来传递各类信息(如SendMessage等)。
这种方法,爆破起来是最头疼的,如果你没有正版的key和或keyfile!
雪    币: 116
活跃值: (220)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
xIkUg 9 2005-2-1 11:21
6
0
最初由 laoqian 发布
利用消息机制来传递各类信息(如SendMessage等)。
这种方法,爆破起来是最头疼的,如果你没有正版的key和或keyfile!

这种方法必须得有window,不然没法处理Message
雪    币: 332
活跃值: (479)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
laoqian 8 2005-2-1 11:41
7
0
是啊,可是我们难道能不用window吗?一般都要吧。
这个对功能限制特别好用!

你的跳转表的方法,似乎只能用汇编实现吧?方法倒是好好。
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
nbw 24 2005-2-1 11:51
8
0
最初由 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个字节!
雪    币: 2367
活跃值: (756)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
小虾 10 2005-2-1 12:01
9
0
我学得算法和耍手段都是必须的。算法好的但跳转指令好找这很容易给人暴破,跳转指令不好找的但算法简单人家都不用再去找那个关键跳转了,利用消息和跳转表是一个好的方法。我原本也想在我的CrakMe v0.3上用自定义消息+Key来实现跳转到关键的比较点,但这次我想看看算法的难易度,所以没用(最后用OnTimer事件耍了一下手段,但给Dt老大一下子给解决了
雪    币: 116
活跃值: (220)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
xIkUg 9 2005-2-1 12:29
10
0
最初由 laoqian 发布
是啊,可是我们难道能不用window吗?一般都要吧。
这个对功能限制特别好用!

你的跳转表的方法,似乎只能用汇编实现吧?方法倒是好好。


我最近写壳程序,没有window
跳转表用高级语言一样可以实现。。。

我是用delphi写的
雪    币: 390
活跃值: (707)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
firstrose 16 2005-2-1 12:51
11
0
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
雪    币: 255
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dREAMtHEATER 2005-2-1 14:28
12
0
最初由 xIkUg 发布


我最近写壳程序,没有window
跳转表用高级语言一样可以实现。。。

........


传一个demo看看,好东西大家分享?谢谢
雪    币: 159
活跃值: (339)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
Lenus 3 2005-2-1 15:16
13
0
to nbw:
应该是
jnz $+3
add al,0ach
才对吧。
雪    币: 1223
活跃值: (469)
能力值: (RANK:460 )
在线值:
发帖
回帖
粉丝
monkeycz 11 2005-2-1 20:03
14
0
最初由 kanxue 发布

1、利用ret指令来实现跳转,如:
push xxxxx //需要跳转的地址xxxxx
ret



记得某个文件加密软件中就大量使用了这种方法。

如果用间接寻址或寄存器来实现此处的xxxxxx话,对于静态分析的难度会提高一些。
雪    币: 50
活跃值: (403)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jr21066 2005-2-1 22:46
15
0
嘿,跳转表和消息都不错.SEH太高深不会完

我想了下.可以再加上DLL跳转.
只要把跳转的地址用自己的方式送出去就行了.那边要改的只是堆栈了.不知这方法有没有实用价值?
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
freeeman 2005-2-1 22:51
16
0
最初由 Vegeta 发布
我以前在我写的RSA的帖子中说过:
与其把时间花费在算法上,不如把时间花费在防止软件被修改上。


我的观点和你一致。
我认为算法并不是主要的,防跟踪才是软件保护的关键。

目前很多人总以为加密算法多高明就一定好。要知道软件保护不是数据加密。
你的key计算公式再复杂,别人根本不用去看你如何计算,只要用一下你算好的结果,或者连结果都不用,直接跳过去执行了。

我的建议和法宝是:
1)一些花指令可以做,但是只能挡住普通破解者,最多看作路上的几颗挡路石而已。像用ret代替call, jmp到指令中间,堆栈的迷惑、SEH等等。
2)多线程或多部件检查,可以采用。
3)多点多层保护。这是总体策略。
4)不但要发现跟踪,而且还不让人知道你发现了跟踪,这是秘诀。
5)表面的破解不代表真正的破解。让破解者永远不知道自己到底破解成功了没有。再深入的论述就暂时保留。

其实软件保护大体上将可以分为两类:
1)防止非法使用:比如非法复制,非授权功能的使用,超过期限的使用。
2)防止技术泄漏:比如跟踪分析,关键算法的获取。

两者的侧重点有所不同,但说到根本还是防止跟踪!
雪    币: 6073
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
forgot 26 2005-2-1 23:50
17
0
个人觉得没什么意义,改的话还是改成jxx就可以了嘛。
雪    币: 255
活跃值: (165)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dREAMtHEATER 2005-2-2 09:50
18
0
我想在这里讨论,谁也不会把真正有商业价值的代码和论述放出来,所说的只是不痛不痒的话,原谅我这个说实话的人!
雪    币: 6073
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
forgot 26 2005-2-2 09:53
19
0
自己做调试器,做PCODE解释器,如果有这个能力,就可以代替jxx了,当然也就隐藏了。
雪    币: 1227
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hume 2005-2-2 13:29
20
0
道高一尺魔高一丈.
制造自己的虚拟机是提高复杂性的有效方法,不过成本高一些
大的原理大家说了很多,就这个问题简单的其他的廉价间接手段可能还有:
1.溢出法,根据不同的情况计算结果动态计算进行溢出导致返回地址的改变.
2.windows的HOOK也可以用来改变跳转地址和反跟踪,可结合消息机制触发某些代码,和其他手段联合使用,改变流程
3.对后续代码根据call计算结果根据某些算法进行动态解密,正确的计算结果自然可跳转到正确的地址,错误的结果自然导致失败.
4.结合系统的一些其他机制,这些机制还有很多...等待去研究

抛砖引玉......
雪    币: 1227
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hume 2005-2-2 13:36
21
0
算法=复杂性
实际上,随着网络时代的到来,真正防破解可以用提供网络服务的形式解决,那个时候,不会再发行软件了,而是你输入数据,远程返回给你数据结果....不知道偶能不能看到这一天
跟加密狗的道理是一致的.
雪    币: 204
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
东方弘 2005-2-2 13:50
22
0
说来说去,不就是一个反跟踪吗?对高手用处不大。
雪    币: 208
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
mYeXcKsN 2005-2-2 15:00
23
0
最初由 freeeman 发布

4)不但要发现跟踪,而且还不让人知道你发现了跟踪,这是秘诀。
5)表面的破解不代表真正的破解。让破解者永远不知道自己到底破解成功了没有........


比较重要。

严格来讲,应该用pcode结合程序代码交互运行,也即所谓的虚拟机,你自己解释你的重要子程序的运行。本人做过一个解释器,效果不错。另外的优点是,pcode不容易反编译,ida这样的静态分析不管用。
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
nbw 24 2005-2-2 16:29
24
0
最初由 Lenus 发布
to nbw:
应该是
jnz $+3
add al,0ach
才对吧。


好像不是吧。你去老罗主页查查opcode教程。
这个的确是手腕,我对手腕兴趣不大,因为自己一向很笨,不喜欢搞这些。另外,听大牛们说,好的程序不在于没个细节都优秀,在于整体完美。细节需要做的是让人看起来明白,清楚。

简单的才是最重要的。
雪    币: 515
活跃值: (1223)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
RoBa 16 2005-2-2 17:04
25
0
最初由 nbw 发布


好像不是吧。你去老罗主页查查opcode教程。
这个的确是手腕,我对手腕兴趣不大,因为自己一向很笨,不喜欢搞这些。另外,听大牛们说,好的程序不在于没个细节都优秀,在于整体完美。细节需要做的是让人看起来明白,清楚。

........


只是巧合,实际编程中很难有碰巧一句代码可以从中间拆成另一句的。
游客
登录 | 注册 方可回帖
返回