信息安全与cracker

时间:2021-05-08 01:03:39

信息安全与cracker

 

信息安全:主要是指存储在计算机设备上的数据安全问题。

Cracker:信息安全的破坏者。

 

信息安全的防护措施可以认为是“盾”,而Cracker的crack行为可视为“矛”,“矛”总是想攻破“盾”的,不管是基于挑战的心理还是一种*的宗教心情(好奇),甚至是为了谋取利益。而“盾”呢总是会给“矛”制造多种多样的“逻辑”防护墙,妄图阻断任何的来自于“矛”的入侵。

 

在计算机发展的初期。“矛”与“盾”尚处于婴儿时期,谁也不认识谁。但随着互联网的发展以及计算机的广泛应用。“矛”、“盾”的关系变得越来越“矛盾”,“盾”的防护思想日新月异,而“矛”的挑战心理与好奇心丝毫减。因而“矛盾传奇”总是不断地在持续下去。

 

我写本文的目的不是写“矛盾传奇”,而是写我的一些“矛盾行为”。

 

矛盾”行为:  昨天一个技术群上探讨一个反汇编得来的代码,目标是破解一个小小的加密软件。我看了半天,也没找到突破口,只是简单地知道。它对输入的密码进入了加工。我就想,如果存在正确的密码,它应该进行相应的密码比较才对。按照这种思路,我找到了一些比较语句,并妄图通过修改指令(二进制的代码-----使用了UltraEdit,反汇编工具为:URSOFT)来实现破解:把原来输入密码错误时执行的指令,修改为跳转至正确识别密码的指令位置。这样就实现了简单的加密软件的破解。但这证明是不对的,我找了半天并没有找到正确输入密码时的指令执行位置,原因是作者对正确执行的指令代码进行了加密,直接从原代码是看不出任何相关信息的(类似于程序加壳)。要想正确地执行后续代码,必先输入正确的密码,这样才能解密成所要执行的目标代码。 我的思路不对,因而只能把原来的指令代码修改为,无论输入密码正确与否,退出程序(因为我看不到任何正确执行的提示信息,以为正确执行就是什么都不显示)。结果修改也是“成功”的,但是都没有得到作者的认可。

 

类似的,我自己编写了一个加密认证程序:

data segment

istr db 'please input the key:$'

ostr1 db 0ah,0dh,'error key!',0ah,0dh,'$'

ostr2 db 0ah,0dh,'correct key!',0ah,0dh,'$'

key db 80h,81h,81h,'$'

buf db 100 dup('$')

data ends

code segment

assume cs:code,ds:data

start:

mov cx,data

mov ds,cx

lea dx,istr

mov ah,09h

int 21h

 

call input

call mlock

lea bp,key

lea di,buf

ll:

mov al,[bp]

mov ah,[di]

cmp al,ah

jnz error

cmp al,'$'

jz correct

inc bp

inc di

jmp ll

error:

lea dx,ostr1

mov ah,9h

int 21h

jmp over

correct:

lea dx,ostr2

mov ah,9h

int 21h

over: mov ah,4ch

int 21h

 

;加密过程

mlock proc near

lea bx,buf

mov di,0

llock:

mov al,[bx+di]

cmp al,'$'

jz lover

xor al,0d1h

and al,095h

mov [bx+di],al

inc di

jmp llock

lover:

ret

mlock endp

 

 

;输入密码的过程

input proc near

lea bx,buf

mov di,0

mov ah,1h

li:

int 21h

cmp al,0dh

jz iover

mov [bx+di],al

inc di

jmp li

iover:

mov dl,0dh

mov ah,2

int 21h

ret

input endp

code ends

end start

 

这个程序按我的思路进行破解是十分简单的,首先反汇编找到密码对比失败时的指令:

:0001.001B 8A4600                 mov al , [bp+00]

:0001.001E 8A25                   mov ah, [di]

:0001.0020 3AC4                   cmp al , ah

:0001.0022 7508                   jne 002C

:0001.0024 3C24                   cmp al, 24

:0001.0026 740F                   je 0037

:0001.0028 45                     inc bp

:0001.0029 47                     inc di

:0001.002A EBEF                   jmp 001B

这里的“:0001.0022 7508                   jne 002C”即为密码比较失败时的跳转指令,事实上只要把它修改为:jne 0037就可以了。指令二进制代码为:750F。

至于为何是750F,从后面的对比成功指令::0001.0026 740F                   je 0037

可以看出,je为74  而0F即为跳转0037地址处,干的jne 0037为750F。

通过这样的比较,可以直接对比UltraEdit上的十六进制码,找到相应的指令进行编辑保存即完成了我这个小小的加密软件的修改。

信息安全与cracker

修改为:

信息安全与cracker

至于修改了哪里,你可以认真查看一下!

 

这只是我修改明码加密软件的一种思路,当然如果把密码找出来-----很有可能会是明文出现在可执行代码中----只要认真查找,总会有意想不到的发现的。但对于压缩过或者加密过的软件上毫无用处的。因为那些指令代码从根本上来说是看不出所以然的,甚至你看不到人家的代码是怎么样子的,更不可能通过查看反汇编程序对软件进行破解。

虽然如此,群里的人为了打开了一个新的天地。这就是传说中的Cracker行为啊。还有反Cracker行为啊。十分值得我借鉴和思考。

今天,我上操作系统的课,里面讲到一点是:虚拟段页式存储的程序必需能自身修改自身,否出无法对里面的指令进行修改(特别是访存指令,里面有内外存储标志,必需执行时动态修改)。我就想原来程序执行时真的是可以自身修改自身指令的。联想到前些天编写的汇编代码:mov al,00h   mov [$],al   jmp $-4   当执行到这里时,CPU会出现一个“执行非法指令的错误!

信息安全与cracker

 

后来我就想,既然如此,那么我执行时对指令代码进行传输再执行(仿照解压、解密),因而我编写了以下的代码:

 

;一个自己修改自身代码的程序段

;程序功能:通过对自身指令的拷贝及执行,展示程序自己修改自己代码的方法

;程序用途:可用于研究程序加壳保护问题

;8086汇编代码

;author: BUG_lauo

;2009-5-11

code segment

assume cs:code

str db 'lauo',0ah,0dh,'$'  ;这里必需是放置于code段中,否则将无法正确显示字符串

num db ?    ;显示个数计数

start:

mov ax,code

mov ds,ax

 

mov cx,over-lcode ;保存指令数据的字节数

lea bp,codebuf       ;指令池 

lea di,lcode      ;要保存的指令首指

ll:

mov al,[di]     

mov [bp],al

inc di

inc bp 

loop ll 

mov num,0;计数初值为零

jmp codebuf

 

lcode:  ;此代码用以显示字符串,这段代码的指令将被拷贝到指令池中

lea dx,str ;显示lauo

mov ah,9

int 21h

inc num

cmp num,10 ;满10个时输出结束

jnz lcode  ;注意这里,不是jnz codebuf 这很让人感到惊奇,不知道什么原因

mov ah,4ch;

int 21h   ;如果将以上这两句注销掉,

  ;你会发现,程序没法结束,证明了指令拷贝成功

over:

mov ah,4ch

int 21h

codebuf: 

db 100 dup(?) ;这里用以保存指令数据

code ends

end start

 

这个程序段也会在我的博客中出现:http://hi.baidu.com/lauo1988/blog/item/fb227e1bf19bb6ddad6e75d1.html

 

这段代码实现了对指令代码的执行时的修改(实现上是将指令代码移动到指定的区域里去执行),这类似地实现了代码的修改执行。虽然比不上高手们的解密、解压再执行。但这终究是自己的又一次探索啊。当然,在写这段代码时也遇到了一些问题。如把num及要显示的str放入到一个数据段中,结果发现,显示时出现了一大堆杂乱无章的字串。后面修改成都放在同一代码段中,才纠正了这个问题。问题也远不止这些,不管了。先到时为止了。下次再尝试写点更加有用的加壳加密程序。

 

 

事实上:这些都只是“矛盾行为”的一个方面----破解软件与软件加密技术。然而对于文件加密保护也是十分重要的,所幸的是文件加密与保护的防护能力远比这软件的防护要来得简单。因为数据是海量的。你只能破解一丁点地方的数据是对于整个文件或者数据的破解是没有任何好处的。然而对于整个文件格式或者加密数据文件的破解,现在是没有什么好的办法的-----除了暴力强破。值得注意的一点是,复杂的文件格式本身就是一种极好的安全保护措施。如DOC文件格式,如果微软不公开这种文件格式的话,那么想要搞出一个兼容的DOC文件浏览器比登月的难度差不了太多。因为里面的信息绝大多数是冗余的(对于我们眼里要识别的真正有用的信息来说----文本信息只是文件数据信息里最少的一部分,而其它的格式信息是复杂而多变的,这根本上来说是破解十分困难的。------当然微软是公开这种文件格式的,否则它就成了孤家寡人了。

 

-----这复杂的文件格式为我们提供了一种信息加密的思路。这种加密是顺带的,因而在实际情况中广为人们所利用。如超星阅读器的文件格式等等(有人破解过,但最近破解过的软件也不好用了,显示的全是乱七八糟的东西。

 

 

对于其它信息的加密,现已经有很多加密方法。如公钥加密体系等。信息加密比软件加密来得安全。这与自然界中的破坏总是比创造来得简单正好相反。原因在于“逻辑复杂性”保证了数据的安全吧。