+ 湖南.大学生科技创新平台's Archiver

maozilee 发表于 2008-7-2 23:53

硬件加密技术入门

在使用硬件加密时,加密的强度主要依靠两个方面:一是加密锁本身的设计结构,二是开发商使用加密
F.I]'c:kg[&M3a 锁的技巧。在使用同一种加密锁时,软件的加密强度可能有很大的差别,因为很多开发商不是很熟悉加
l ` fX/\w6paQ 密锁的使用方式,没有充分利用加密锁提供的加密方式,给破解者留下了漏洞。
hSyE;Dx(D'C1V
?$\N~ ?3z 在应用加密锁开发时加
UrO|fF3C"E H 密的强度可以从两个途径提高:一是增加破解的工作量,二是增加加密点的复杂度。
)r d`ET] `\ c
x9M)K+q,ii$H9T 一、增加工作量的基本技巧:
/k%Ug4M2N
tli a1y1l 1、增加加密点的数量,在程序的多个位置,多次检验加密锁的存在,存取数据,破解者必须识别并修改 t(gp(L7\&@ v1s
每个加密点,只要有漏掉的加密点,程序就不能正常执行。 ]6Z`yt7C{CS3d
2、增加复杂的循环或死循环等耗时操作,让破解者难以跟踪程序的执行。例如:
P.X(D,N*X*ud*V i~ RetCode = RY2_Find();
KUv9k(V'[D2U ... ... ... ... //加入多条语句,可以是与操作狗有关的,或者其他复杂的语
4O c D1Ghy^` //句结构。 -C l u Tv:jt5f
//后面的例子如无特别说明,此标记都代表这个意思 :l2QDuAL6x N5A
while(RetCode<=0)//如果没有找到锁,则进入死循环
(g0q$r)v+Dr7Q { 'js;{/WO}?
int j = abs(random()/10);
+P ]0eM4d.W ... ... ... ...
8y9w1eh.bwS*` RetCode = RecCode-j;
p XC-cV ... ... ... ...
f r8k6Y$a@9p7rW}q } Xa7CJR%K/W_N

5N0Lx%\/o$Da
;NINmE(TVW 例1.1
d?Y+LCk*r2A 3、提高效验和读写加密锁的随机性,使破解者难以理解程序的结构和执行规律。随机性是加密的重要思cNX$Aq[ e|
想,合理应用应用随机性还可以增加程序的复杂度,有效对抗分析软件和加密锁模拟器。例如
BF#jy5Rb;V int j = abs(random()/100); 3Dp.O9j hU
... ... ... ... \"Wm;DW6sm,a aP
if(j%17==0)
'p!L/[Q Ceb {
#NRM @oQWI!G ... ... ... ... I} ~Ic2By
RetCode = RY2_Find();
n+m3FZ u(k N ... ... ... ... .N.@w3z|5N1\9X
if(RetCode==0){} //未找到锁,出错处理 0{5?scoW
else
mL P[1A7p:TDm { /w]O]4Y"b-h
RetCode = RY2_Open(...);//打开指定UID的加密锁
QJ_0@T6Y0I7y if(RetCode==0){} //打开失败,出错处理
3a7h!A3uCL }
!}'{a |u3Ba }
K},l l ft 4CSc}3B Ez
4kA2o:l7m1\V:C?
例1.2 ;GrrJ8]_U
/?7z,p6W]z
二、增加加密点的复杂度的基本方法是增加迷惑语句,并根据加密锁本身的特点使用一些编程技巧,迷惑#B-w uWio#{$ZN
就是增加破解者找到加密点的难度,使程序难于理解。常见的有一下几种方式:
C3~L` ^n/Lgj4G 1、不显示出错提示信息:这个技巧很重要,尽可能少地给用户提示信息,因为这些蛛丝马迹都可能导致;[#f5Tz3G
解密者直接深入到保护的核心。比如,当检测到破解企图之后,不要立即给用户提示信息,而是在系统&rrF"\p em
的某个地方做一个记号,随机地过一段时间后使软件停止工作,或者装作正常工作但实际上却在所处理
9tPN Jv6FV9{ 的数据中加入了一些垃圾。例如可以改写上面的示例中 if(RetCode==0){} //未找到锁,出错处理 这句
F+`CGM{WzA
bk zy-jz int flag = 1;
"dz.R'tE JTQ ...//此部分同例1.2 Ea%WaY2HGt
if(RetCode==0) //未找到锁,出错处理 /n'zHL,@.`
{
!s!bB l(sy:J Flag-- 3K H,}jozg4z
} !@Ai.oX mh
...//此部分同例1.2 _}0?)RB|'`
if(flag==0) #A(i1T{6g d2K
{
SJ"o@b1R"c:A ... ... ... ...
a%tR;@ m6^i$} //这里可以采用三种处理方法
/R Mi%n E C 1.普通的:未找到加密锁,退出程序
6y)p*{Pa 2.迷惑性处理:启动定时器,过一定的时间后结束程序 'pvT+|oSC
3.迷惑性处理:破坏掉锁内的数据,继续运行程序。
.y$A#h&D)~3`/S ... ... ... ... 7nHS2z!`;qL,IE2p
}
2Oq"QJ#M8P t{;T
4e;s)U+~e#Q{/}7R
? B"h(kk(Qc;S 例2.1 *gdz~&]V.H
2、加入复杂的循环和死循环,让破解者难以跟踪,发现加密点。这个方法与例1.1类似:
#I,w T*|*b5Hg\ for ( ;; )
2W!s cS'Q o'd?*G { #W5XJz#q`F
int j = random() %1000;
9N'f7[9ig ]9D L if(j%917==0) 7s v/K9B j
{
9RY,]E_b ~.f*y RetCode = RY2_Find();
}$L:\3X.e if(RetCode == 0)
!sy5lzI;L { GA2[ x-B d4g
}
g:ns"v L+DG4WO else g*O GinH"R-] `T3[
{ lC1E G.Zz.kKxv
} gkk W5ZuM.|f
}
&o3g8JY)~ } mc*k'O;cp9Z3L4L
例2.2
`._Fv2Z&\!MqZ;f 3、随机的读写和效验加密锁,在随机的位置读写。这条技巧前面已经多次应用,下面举例说说随机位置D|)K [Q2d}
的读和写:
Q-B2x0yI1t int i = abs(random()/5);
;i;_4[)^9G4k HD} ... ... ... ... S ivOkV;GLHT~
char buffer[512]; d;E F:T:N&lC F
... ... ... ...
7`\9[g%f'rV retcode = RY2_Write(handle, 0, buffer);//随机写人到某一块
\X^"v7QC%J(d ... ... ... ... Q`m3y,?W}3W
retcode = RY2_Read(handle,0, buffer);//读出刚才写入的那一块
uP.pw:[#g8TS/Y3d
8ZEH(gKXi
-\ hFO*? 例2.3
?U7k&?Q"sl 4、把操作加密锁和最终判断程序执行是否合法的语句分开。这个技巧前面的例子里面都用到了,就是不
ZP;Ve{bQ#h 要在得到操作加密锁的状态后立即判断状态是否正常,而是在操作和判断之间加入一定的代码。 yZF6p({ E
5、加入无用的读写,效验锁的语句或其他无效代码。
3w0SU-o.[$c/^0nB 6、在加密锁内写入读出无效数据。当然不要应用真的应用这些数据。2.4、2.5、2.6常结合使用。
j1EUXh V,p
s]-SD@E#u 三、下面结合rockey2的特点说说综合的编程技巧。
Jlk7X:Z,H:d'y 1、使用加密锁传递变量,把加密锁内的存储区当作临时变量,变量需要赋值时,向锁内写入数据,需要W ?+?QR1m
应用变量的值时读取加密锁。
^3CvI(Lx"W a.传递局部或全局变量举例
)Lp)O['hZ$y'vN2g void func()
O|3i;q Ldv P { A n2y$m:F#Er1k;V'h
int i;//这个变量的值将被写入加密锁,
M j)v V_V&N2t6^@8Q //锁内值的更改和使用代替了变量i本身
C]J-U~,\ ... ... ... ... 2f d/a"e3k;U6d
char buffer[512];
+HilZJ7h%Q memcpy(buffer,&i,sizeof(i)) fuiV} {4i
retcode = RY2_Write(handle, 0, buffer); &ui3K7`d,GJ y
... ... ... ... r%o"t'X-q%D q
while(...) &x9e2ZI5^Mhx0o
{ hBAk9FSl r.dP
... ... ... ...
~q-?-a} if(...)
N$c5y1Y p7e {
0~DR!P!\+g*u int j
/B;l$B1D5u!{7E retcode = RY2_Read(handle, 0, buffer); 'b6B$[hi^
memcpy(&j,buffer,sizeof(i)); Y0a?(Z3H5@I&U

2h+rGx[j ... ...//原来需要用变量i的现在改用临时变量j, ]L$d$} Gg:p
//j的值是从加密锁内读出来的 u?}(c3D
d5M:mL9feX
retcode = RY2_Write(handle, 0, buffer);
CVMq Cu$E f}6q0y //原来把变量j的当前值写入加密锁, -~:^ ^'s`
//相当于变量i的值发生了变化 ;vgs+kg
} R!f$Hg~&P GI7X t.W
}
h:^[8B4BR } yI?j ]-Gj

;TD DN&paC;t
l'Qf/gh 例3.1
*HV5I}l q&H(r b. 传递函数的参数:
i8uF2e&@!S ~7w 普通的编程思路:
8R(P?f9}8R Func1(int i) %kC Rt`|W
{}
z5CI#L ko v Func2() ,UH+g"TD'N/\
{ .E8^'z6r"q|X.t.?Fz
int j; w_ ZK zV8Gm)V
... .iLo(RT6i\ `0?h3S
Func1(j)
mf[ml$Z } L)a7CH z
改写为应用加密锁的方式: h[(v2d nmD
Func1() ~9}y~tk
{
QdC2w D*fu int j; "_`0f)R7L'a
retcode = RY2_Read(handle, 0, buffer);
}]ku:Pd#] memcpy(&j,buffer,sizeof(int));//这个过程相当于参数传递 E lPE o bFk%|
... ... ... ...
B!Uxp:r$u0a } {.o{2r,~9DdD
Func2()
]\6Jk ]z9[&G5{z {
6b8JC.r&X lY:p8t char buffer[512]; @G0FW V?QS4h
int i;//这个是要传递的参数,
"C;?Is'Q9]FP ... ... ... ... e WZ3bp
memcpy(buffer,&i,sizeof(i)) Gu#{.Ms
retcode = RY2_Write(handle, 0, buffer);
/x!Hu1l BX$~B ... ... ... ...
:@8dY3B_9fb@ Func1(); Mb"yDf4e,r
gChB,W:X-K1fe
a-lMCo3n6c#h
例3.2 Y Bs R%_0sBV*r"N
2、把需要保存在磁盘上的数据全部或部分保存到加密锁内.Rockey2提供了多达2560字节的存储空间,可]w(p-E8e$jl5H|
以把本来需要保存在磁盘上的重要的数据保存在加密锁内,比如程序的配置信息,上次运行时得到的下7oA }$g$wd"H
次需要应用的数据等等 7J1MTS7P,IR$L ?
3、 使用多线程技术。利用多线程调试的复杂性可以有效迷惑破解者和破解软件。可在一个线程中寻找
:`ML5f4y|5heD 加密锁,随机读写数据,在另外的线程中应用这些信息。多线程技术也是加密锁应用的重要技巧。

页: [1]

Powered by Discuz! Archiver 7.0.0  © 2001-2009 Comsenz Inc.