- 注册时间
- 2004-8-29
- 最后登录
- 1970-1-1
|
下面是几种用于电脑端的加密方法,某些方法同样适用于文曲星~
1。
用时间差反跟踪
概述:
如果关掉中断,不仅仅是键盘不动了,时钟也不会走,所以可以利用时间差来反跟踪,具体方法是:先关掉中断, 再用当前时间作 key 加密,在执行一大堆指令后,偷偷地再用当前时间解密, 如果为了解密跳过关中断指令, 时间就会变化, 解密结果就会不对,然后...当然是死机啦 !
汇编编程示例:
code segment
assume cs:code,ds:code
org 100h
start:
jmp install
d1 db 'OK, passed ...',0dh,0ah,24h
install:
xor ax,ax
mov es,ax
mov ax,es:[046ch] ;系统时间计数
xor word ptr _code,ax ;把 _CODE 处的指令加密
mov ah,0ffh
in al,21h
xchg ah,al
out 21h,al ;关掉中断,并保存原中断开关情况到 AH
mov cx,100 ;这儿是延时语句,模拟其他程序的执行时间
lop1:
push cx
xor cx,cx
lop2:
loop lop2
pop cx
loop lop1
mov bx,es:[046ch] ;再把时间取回来解密
xor word ptr _code,bx
xchg ah,al ;记得把中断复原
out 21h,al
_code:
nop
nop
mov ah,9
mov dx,offset d1
int 21h
int 20h
code ends
end start
2。
用指令预取反跟踪
概述:
CPU 的执行时并不是执行到哪一句再到内存中去取那一句,而是先读入到 CPU 的 Cache 中,如果指令已经到了 Cache 中,再将它修改也没有用了,如果用跟踪程序的话,CPU 的 Cache 中就不会是跟正常执行时的指令相同,所以可以改动下几条指令,当然是故意改错,如果没有跟踪,程序还回照常执行,有跟踪的话,那就...
汇编编程示例:
code segment
assume cs:code,ds:code
org 100h
start:
jmp install
d1 db 'OK, passed ...',0dh,0ah,24h
install:
mov word ptr _code,20cdh
_code:
nop ;如果跟踪一下,就会发现下一条指令是 INT 20H,返回 DOS 了
nop
mov si,offset _code1
mov di,si
cld
mov ax,20cdh
stosw
lodsw
_code1:
nop
nop
mov ah,9 ;now ax=20cdh
mov dx,offset d1
int 21h
int 20h
code ends
end start
3。
"花指令"加密法
概述:
用‘花指令’来进行静态加密是很有效的,这会使解密者无法一眼看到全部指令,杜绝了先把程序打印下来再慢慢分析的做法。我们知道,一条指令的长度是不等长的,假使有一条指令为 3 字节长,然后你从它的第二个字节开始反汇编,你照样会看到一条面目全非的指令,‘花指令’就是在指令流中插入很多‘垃圾’,使静态反汇编无法进行,如何实现你把以下程序编译出来用 Debug 的 U 指令看一下,跟踪一下就能理解了。
汇编编程示例:
XX1 MACRO
local _next1
jmp short _next1
db 0e8h
_next1:
ENDM
;--------------------------------------
XX2 MACRO
local _next2
jmp short _next2
db 0e9h
_next2:
ENDM
;--------------------------------------
XX3 MACRO
local _next3
jmp short _next3
db 09ah
db 0e8h
_next3:
ENDM
;--------------------------------------
XX4 MACRO
local _next4
jmp short _next4
db 09ah
db 0e8h
_next4:
ENDM
;--------------------------------------
.286
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
ORG 100H
start:
db 20 dup (90h)
xx3
mov ax,0201h
xx3
mov bx,0200h
xx3
mov cx,0001h
xx3
mov dx,0080h
xx2
int 13h
xx2
int 20h
CODE ENDS
END START
4。
指令动态执行加密法
概述:
这儿讲述的是用单条指令加密法,再用 int 1 单步中断解下一条指令的第一字节,由于用另外程序解密时无法预知指令长, 所以不能用编程的方法解密,只能用手工一条一条地解。具体实现见注释,这种加密法的麻烦只处就是加密时也要一句一句来。
汇编编程示例:
code segment
assume cs:code,ds:code
org 100h
start:
jmp install
d_ok db 'OK, passed...',0dh,0ah,24h
temp_bx dw ?
off1 dw ?
seg1 dw ?
int1:
mov temp_bx,bx ;save bx
mov bx,sp ;BX=SP=0016h
mov bx,ss:[bx]
xor byte ptr ds:[bx],55h ;decode
mov bx,temp_bx
iret
install:
mov ax,3501h ;保存原 INT 1 中断向量
int 21h
mov off1,bx ;设置新 INT 1 到 offset int1
mov seg1,es
mov ax,2501h
mov dx,offset int1
int 21h
xor byte ptr x1,55h ;这些指令是先把以下
xor byte ptr x2,55h ;的一些指令加密
xor byte ptr x3,55h ;当然,在应用时就不会有这些指令了
xor byte ptr x4,55h
xor byte ptr x5,55h
xor byte ptr x6,55h
xor byte ptr x7,55h
xor byte ptr x8,55h
xor byte ptr x9,55h
pushf
pop ax
or ax,0100h
push ax
popf ;打开单步跟踪
nop ;由于单步跟踪要在执行下一条指令后才激活
x1: ;所以这儿是一条 NOP 指令
mov ah,9
x2:
mov dx,offset d_ok
x3:
int 21h
x4:
pushf
x5:
pop ax ;从 X1 到 X9 的指令要在
x6:
and ax,0feffh ;执行中才由 INT 1 逐句解开
x7:
push ax
x8:
popf
x9:
nop
mov ax,2501h ;把 INT 1 复原
lds dx,dword ptr off1
int 21h
int 20h
|
|