首页
社区
课程
招聘
[原创]贴一个可以对付DOS下所有磁盘加密的仿真软件,现在还有用...
发表于: 2005-7-7 17:56 12723

[原创]贴一个可以对付DOS下所有磁盘加密的仿真软件,现在还有用...

2005-7-7 17:56
12723

CSEG   SEGMENT
       ASSUME CS:CSEG,DS:CSEG,ES:CSEG
       ORG 100H

START:         JMP   INSTALL_TSR

OLD_INT15  DD ?
OLD_INT40  DD ?
DISK_BIOS  DW 0EC59H,0F000H
F_NAME DB '000000.DAT',0
OFF_IP DW 0
OFF_CS DW 0
OFF_AX DW 0
OFF_CX DW 0
OFF_DX DW 0
HANDLE DW ?
IN_DOS DD ?
OLD_AX DW ?
OLD_CX DW ?
OLD_DH DB ?
OLD_F DW ?
NEW_CS DW ?
NEW_IP DW ?
OLD_CS DW ?
OLD_IP DW ?
SEC_NUM DB 0

NEW_INT15      PROC FAR

               CLI
               PUSHF
               PUSH DI

               CMP AX,9001H
               JNZ DOS_BUY

               MOV DI,CS:[OFF_AX]
               CMP BYTE PTR [BP+DI+1],02H             ; ah=02 is read disk
               JNZ DOS_BUY

               CALL CHK_DOS
               JZ READ_ROM
               
DOS_BUY:       POP DI
               POPF
               STI
               JMP DWORD PTR CS:[OLD_INT15]

READ_ROM:      POP DI
               POPF
               PUSH ES
               PUSH AX
               PUSH BX
               PUSH DI
               
               MOV DI,CS:[OFF_AX]
               MOV AL,BYTE PTR [BP+DI]           ; al=? is read sec num
               MOV CS:[SEC_NUM],AL

               MOV DI,CS:[OFF_CX]               
               MOV AX,WORD PTR SS:[BP+DI]
               MOV WORD PTR CS:[OLD_CX],AX       ; SAVE CX         
               MOV DI,CS:[OFF_DX]
               MOV AL,BYTE PTR SS:[BP+DI+1]
               MOV BYTE PTR CS:[OLD_DH],AL       ; SAVE DH

               MOV DI,CS:[OFF_IP]
               MOV AX,WORD PTR SS:[BP+DI]        ; BP+DI=IP
               MOV BX,WORD PTR SS:[BP+DI+2]         ; BP+DI+2=CS
               CMP AX,CS:[NEW_IP]
               JNZ SET_IP
               CMP BX,CS:[NEW_CS]
               JNZ SET_IP
               JMP NO_SET

SET_IP:        MOV CS:[OLD_IP],AX
               MOV CS:[OLD_CS],BX               ; SAVE OLD CS:IP

               MOV AX,CS:[NEW_IP]
               MOV BX,CS:[NEW_CS]
               MOV WORD PTR SS:[BP+DI],AX
               MOV WORD PTR SS:[BP+DI+2],BX        ; SET NEW CS:IP

NO_SET:        POP DI
               POP BX
               POP AX
               POP ES
               
               STI
               JMP DWORD PTR CS:[OLD_INT15]

NEW_INT15      ENDP

NEW_CODE       PROC FAR

               CLI
               PUSH AX
               PUSH BX
               PUSH CX
               PUSH DX
               PUSH SI
               PUSH DI
               PUSH DS
               PUSH ES
               PUSHF
               PUSH CS
               POP DS

               PUSHF
               CMP AH,80H                     ; NO FLOPPY DISK ?
               JNZ HAVE_DISK                  ; NO, HAVE_DISK
               POPF
               JMP RETURN                     ; IS, JMP RETURN

HAVE_DISK:     POPF
               PUSH BX
               PUSH ES                        ; ES:BX = KeyDisk Data Buffer

               MOV WORD PTR CS:[OLD_AX],AX
               PUSHF
               POP AX
               MOV WORD PTR CS:[OLD_F],AX

               call get_filename

               MOV AH,3CH
               MOV CX,00
               MOV DX,OFFSET F_NAME
               INT 21H
               MOV WORD PTR CS:[HANDLE],AX
               
               PUSH CS
               POP DS

               MOV DX,OFFSET OLD_F
               MOV CX,2
               MOV BX,WORD PTR CS:[HANDLE]
               MOV AH,40H
               INT 21H                      ; FLAGS write to file (1,2Byte)

               MOV DX,OFFSET OLD_AX
               MOV CX,2
               MOV BX,WORD PTR CS:[HANDLE]
               MOV AH,40H
               INT 21H                      ; AX write to file (3,4Byte)

               POP ES
               POP BX
               
               MOV DX,BX
               MOV AX,ES
               MOV DS,AX
               CALL SET_SIZE
               MOV BX,WORD PTR CS:[HANDLE]
               MOV AH,40H
               INT 21H                      ; SEC_DATA write to file (5-?Byte)

               MOV AH,3EH
               MOV BX,WORD PTR CS:[HANDLE]
               INT 21H

RETURN:        POPF
               POP ES
               POP DS
               POP DI
               POP SI
               POP DX
               POP CX
               POP BX
               POP AX

               PUSH CS:[OLD_F]
               
               SUB SP,04

               MOV AX,CS:[OLD_CS]
               ADD SP,04
               PUSH AX
               MOV AX,CS:[OLD_IP]
               PUSH AX

               MOV AX,WORD PTR CS:[OLD_AX]

               IRET

NEW_CODE       ENDP

NEW_INT40      PROC FAR

               CLI
               PUSH AX
               PUSH BX
               PUSH CX
               PUSH DX
               PUSH SI
               PUSH DI
               PUSH DS
               PUSH ES
               PUSHF

               MOV CS:[OLD_CX],CX
               MOV CS:[OLD_DH],DH
               MOV CS:[SEC_NUM],AL

               CALL CHK_DOS
               JNZ RETU40
               CMP AH,02H
               JNZ RETU40
               
               push cs
               pop ds

               PUSHF
               CALL DWORD PTR CS:[DISK_BIOS]

               PUSH BX
               PUSH ES                        ; ES:BX = KeyDisk Data Buffer

               MOV WORD PTR CS:[OLD_AX],AX
               PUSHF
               POP AX
               MOV WORD PTR CS:[OLD_F],AX

               CALL GET_FILENAME

               MOV AH,3CH
               MOV CX,00
               MOV DX,OFFSET F_NAME
               INT 21H
               MOV WORD PTR CS:[HANDLE],AX
               
               PUSH CS
               POP DS

               MOV DX,OFFSET OLD_F
               MOV CX,2
               MOV BX,WORD PTR CS:[HANDLE]
               MOV AH,40H
               INT 21H                      ; FLAGS write to file (1,2Byte)

               MOV DX,OFFSET OLD_AX
               MOV CX,2
               MOV BX,WORD PTR CS:[HANDLE]
               MOV AH,40H
               INT 21H                      ; AX write to file (3,4Byte)

               POP ES
               POP BX
               
               MOV DX,BX
               MOV AX,ES
               MOV DS,AX
               CALL SET_SIZE
               MOV BX,WORD PTR CS:[HANDLE]
               MOV AH,40H
               INT 21H                      ; SEC_DATA write to file (5-?Byte)

               MOV AH,3EH
               MOV BX,WORD PTR CS:[HANDLE]
               INT 21H

               POPF
               POP ES
               POP DS
               POP DI
               POP SI
               POP DX
               POP CX
               POP BX
               POP AX

               ADD SP,06
               PUSH CS:[OLD_F]
               SUB SP,04
               MOV AX,WORD PTR CS:[OLD_AX]
               IRET

RETU40:        POPF
               POP ES
               POP DS
               POP DI
               POP SI
               POP DX
               POP CX
               POP BX
               POP AX
               CLI
               JMP DWORD PTR CS:[OLD_INT40]

NEW_INT40      ENDP

SET_SIZE    PROC NEAR

            PUSH AX
            PUSH BX
            PUSH DX
            PUSH ES
            PUSH DI

            XOR AX,AX
            MOV ES,AX
            MOV DI,WORD PTR ES:[0078H]      ; 0000:0078H = CS:IP is disk para table
            MOV AX,WORD PTR ES:[0078H+2]
            MOV ES,AX
            MOV CL,BYTE PTR ES:[DI+3]       ; ES:DI+3 = disk sec data size

            MOV AX,128
            MOV BX,2
GO_SIZE:    MUL BX
            DEC CL

            OR CL,CL
            JNE GO_SIZE

            MOV BL,CS:[SEC_NUM]
            MUL BX
            MOV CX,AX

            POP DI
            POP ES
            POP DX
            POP BX
            POP AX
            RET

SET_SIZE    ENDP

CHK_DOS     PROC NEAR

            PUSH BX
            PUSH ES

            MOV BX,WORD PTR CS:[IN_DOS]
            MOV ES,WORD PTR CS:[IN_DOS+2]
            CMP BYTE PTR ES:[BX],0

            POP ES
            POP BX

            RET

CHK_DOS     ENDP

GET_FILENAME   PROC NEAR
                        
               PUSH ES
               PUSH CS
               POP ES

               MOV AX,'00'
               LEA DI,F_NAME
               MOV CX,3
               REP STOSW

               MOV AX,CS:[OLD_CX]
               LEA SI,CS:F_NAME+3
               MOV BX,16
               CALL ASCII

               CMP BYTE PTR CS:[OLD_DH],00
               JZ GET_END
               MOV BYTE PTR CS:[F_NAME+5],'1'

GET_END:       POP ES
               RET

GET_FILENAME   ENDP

ASCII      PROC NEAR

ASC1:      CMP AX,0
           JZ NONUM

           CMP AX,10
           JB AEXIT
           XOR DX,DX
           DIV BX

           OR DL,30H
           CMP DL,'9'+1            ; IF DL < '9'+1
           JB NOCHAR
           ADD DL,07
        
NOCHAR:    MOV [SI],DL
           DEC SI
           JMP ASC1

AEXIT:     OR AL,30H
           MOV BYTE PTR [SI],AL
        
NONUM:     RET

ASCII      ENDP

TSR_END_FLAGS EQU $+1

;***************************** MESSAGE   SEGMENT *****************************

name_1 DB 10h,1Fh,10h,10h,17h,10h,10h,1Fh,10h,13h,12h,12h,13h,10h,20h,40h
name_2 DB 02h,0FEh,82h,82h,0FAh,82h,82h,0FEh,02h,0F2h,12h,12h,0F2h,02h,0Eh,04h
ming_1  DB 10h,10h,10h,10h,55h,54h,54h,55h,54h,54h,54h,7Dh,44h,04h,00h,00h
ming_2  DB 20h,20h,48h,84h,0FEh,48h,86h,02h,0FCh,84h,0C4h,28h,10h,28h,44h,82h

MSG1     DB 0dh,0ah,0dh,0ah,0dh,0ah,0dh,0ah,0dh,0ah
         DB '                     赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯突',0ah,0dh
         DB '                     ?            Soft  Moth             ?,0ah,0dh
         DB '                     ?-----------------------------------?,0ah,0dh
         DB '                     ?Soft Name: << LockDisk Killer >>   ?,0ah,0dh
         DB '                     ?File Name: READKEY.COM             ?,0ah,0dh
         DB '                     ?Note:      This TSR Program Is For ?,0ah,0dh
         DB '                     ?           KeyDisk Protech System  ?,0ah,0dh
         DB '                     ?           Crack !                 ?,0dh,0ah
         DB '                     ?     Soft Crack Studio 1997.07.18   ?,0ah,0dh
         DB '                     ?     Programmed For Mr.   '          ,0d7h,12h,0d8h,13h        
         DB                                                         '     ?,0dh,0ah
         DB '                     韧屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯图',0dh,0ah
         DB 0dh,0ah,'                   Press Enter " READKEY.COM " Remove Memory.',0dh,0ah
         DB 0dh,0ah,'                          Press any key to continue...',0dh,0ah,0dh,0ah,'$'
MSG2     DB 0dh,0ah,0dh,0ah,07h
         DB '                         Tsr Program Remove Memory OK!',0dh,0ah,0dh,0ah,'$'
BUFFERS  DB 80*12 DUP(0DH),'$'
MES_BUF1 DB 80 DUP(8EH),'$'
MES_BUF2 DB 80 DUP(0AH),'$'
BUF_IP   DW 0
TIME_HI  DW ?
TIME_LO  DW ?
ERR_MSG   DB 0DH,0AH,0DH,0AH
          DB '                    Open File Error , Program Break !'
          DB 0DH,0AH,0DH,0AH,'$'
BUFFER    DB 768 DUP(?)
RAM_BUF   DB 320 DUP(?)
PIC_FILE   DB 'LOGO.DAT',0
INI_FILE   DB 'C:\LDK_100.CFG',0
INI_HANDLE DW ?
INI_MSG    DB 0DH,0AH,0DH,0AH,07H
           DB '                    Open File " LDK_100.CFG " Error !'
           DB 0DH,0AH,0DH,0AH,'$'
INI_BUF   DB 36 DUP(0)
INI_ID    DB 'This File For LockDisk Killer v1.00',1Ah
PARM      DB 0
ROM_OFF   EQU 0EC59H
ROM_SEG   EQU 0F000H


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (27)
雪    币: 244
活跃值: (105)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
这个程序是读取加密磁盘加密数据部分,读取后文件名字为:xxxxxxx.dat(xxxxxxxx是所在的扇区号)
到现在还没发现能避开我这个软件的程序(包括最新版的BITLOK)

PS:因为程序最后部分没任何技术含量了,而且后半部分有自己的个人信息
不大方便放出来,作用就是替换INT15和40的中断地址,并显示自己的信息而已,没多大用。。。。。。
2005-7-7 17:58
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
好,学习学习!
2005-7-7 18:10
0
雪    币: 343
活跃值: (611)
能力值: ( LV9,RANK:810 )
在线值:
发帖
回帖
粉丝
4
谢谢。收藏
2005-7-7 18:46
0
雪    币: 280
活跃值: (281)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
5
我不会编译,拜托哪位把编译好的程序放上来!
2005-7-7 20:02
0
雪    币: 390
活跃值: (707)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
6
不全

用INT15确实很巧妙
2005-7-8 12:33
0
雪    币: 244
活跃值: (105)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
最初由 lzqgj 发布
我不会编译,拜托哪位把编译好的程序放上来!


本来想放上来,但是因为有自己的信息不大方便,其实上面的代码如果你能看懂的话已经是足够了,所有原理都在里面了
2005-7-8 13:28
0
雪    币: 244
活跃值: (105)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
最后一点,我到现在还没搞明白,那个时代有一些磁盘仿真软件是怎么替换F000:EC59这个地址的?ROM映射?我自己用了笨办法
2005-7-8 13:30
0
雪    币: 99
活跃值: (2433)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
最初由 脱壳请教 发布
这个程序是读取加密磁盘加密数据部分,读取后文件名字为:xxxxxxx.dat(xxxxxxxx是所在的扇区号)
到现在还没发现能避开我这个软件的程序(包括最新版的BITLOK)


你遇到的加密盘太少了吧,你这个程序对付不了crc错误,而且还有更高级的加密方法。
2005-7-8 15:54
0
雪    币: 244
活跃值: (105)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
最初由 TeLeMan 发布


你遇到的加密盘太少了吧,你这个程序对付不了crc错误,而且还有更高级的加密方法。


呵呵,加密盘其实不少了,当时DOS下我碰到的所有加密磁盘都拿这个通过了
除了BITLOK是用/S参数,其他加密磁盘连参数都不需要

什么LOCK95,KV100-300,BITLOK,还有很多商业性的软件统统搞定
CRC错误的话也能对付呀,只要你读正版磁盘的数据,程序就能截取
更高级的加密方法我没碰到过,请赐教~

PS:任何DOS下读加密磁盘都要通过F000:EC59,除非你直接IO操作,否则都要被截取......
2005-7-9 01:48
0
雪    币: 214
活跃值: (40)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
11
最初由 脱壳请教 发布


呵呵,加密盘其实不少了,当时DOS下我碰到的所有加密磁盘都拿这个通过了
除了BITLOK是用/S参数,其他加密磁盘连参数都不需要

........


1、想看看 /S 参数,呵呵,把代码发全吧:),个人信息修改掉就是了
2、单纯的纪录key盘数据可以简单地通过校验40:3e开始的标志甚至直接读状态寄存器发现假冒的。曾经见过一个破解过的软件在硬盘上运行时还需要你随便放张软盘在软驱里 :P

3、f000:ec59的截获和修改发生在386出现之后... ;)
4、传说中的磁盘弱位技术可以让每次读取的结果不一样...
2005-7-9 14:33
0
雪    币: 244
活跃值: (105)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
最初由 m4gic 发布


1、想看看 /S 参数,呵呵,把代码发全吧:),个人信息修改掉就是了
2、单纯的纪录key盘数据可以简单地通过校验40:3e开始的标志甚至直接读状态寄存器发现假冒的。曾经见过一个破解过的软件在硬盘上运行时还需要你随便放张软盘在软驱里 :P

........


1,/S参数也在上面了,就是拦截了INT40,INT15不去动它
2,破解过的软件要放软盘我知道,好像和程序运行时间也有关系的
3,我这个修改F000:EC59的方法不好,不知道其他软件用什么方法的
4,如果每次读取结果不一样的话,那程序怎么判断?
2005-7-9 15:09
0
雪    币: 214
活跃值: (40)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
13
最初由 脱壳请教 发布



1,/S参数也在上面了,就是拦截了INT40,INT15不去动它
2,破解过的软件要放软盘我知道,好像和程序运行时间也有关系的
........


3、利用保护模式、v86模式、调试寄存器等
4、重复读同1磁道、扇区,读出来不一样的就是key盘,一般的仿真软件是按磁盘读取时的参数保存的,同1磁道、扇区就保留1份数据,读再多次也是1样。
2005-7-9 17:16
0
雪    币: 244
活跃值: (105)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
14
最初由 m4gic 发布


3、利用保护模式、v86模式、调试寄存器等
4、重复读同1磁道、扇区,读出来不一样的就是key盘,一般的仿真软件是按磁盘读取时的参数保存的,同1磁道、扇区就保留1份数据,读再多次也是1样。


3,明白了,谢谢~
4,这样做的话最多只能做到在程序里判断了,而返回的数据确没有什么实用价值了,如果我是加密盘的作者,返回的数据一定要在程序里用到
2005-7-9 21:43
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
m3b
15
支持一下,顶。
2005-7-11 23:05
0
雪    币: 328
活跃值: (925)
能力值: ( LV9,RANK:1010 )
在线值:
发帖
回帖
粉丝
16
学习一下!
2005-7-12 08:14
0
雪    币: 234
活跃值: (104)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
据说kv系列到后来已经不使用call f000:ec59,
是直接io操作读取加密盘的。
2005-7-12 10:24
0
雪    币: 703
活跃值: (327)
能力值: (RANK:380 )
在线值:
发帖
回帖
粉丝
18
最初由 脱壳请教 发布


3,明白了,谢谢~
4,这样做的话最多只能做到在程序里判断了,而返回的数据确没有什么实用价值了,如果我是加密盘的作者,返回的数据一定要在程序里用到


4还有一种是伪弱位 连续读两次或几次会不一样 但是数据是固定的 可以满足你的需要 磁盘的好久不搞了 忘的差不多了
看你们的讨论好怀念的说
2005-7-13 08:35
0
雪    币: 77
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
支持一下。。。顶!
2005-7-13 12:53
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
支持,顶上去
2005-7-13 17:06
0
雪    币: 224
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
都是DOS时代的风云软件
2005-7-13 17:06
0
雪    币: 390
活跃值: (707)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
22
只要它不直接IO,弱位模拟起来很简单的
2005-7-13 17:13
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
哪位大侠再说说win下的软盘加密!!!
2005-7-13 19:14
0
雪    币: 244
活跃值: (105)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
24
是的,直接IO现在还没有好的模拟软件出来,不过DOS时代也过去了......
2005-7-14 00:44
0
雪    币: 2003
活跃值: (61)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
不错 请求全贴
2005-7-14 13:59
0
游客
登录 | 注册 方可回帖
返回
//