两年前,我在写USB的文章时,多次提到了DOSUSB这个东东,这两年也没有关注这方面的变化,最近,有机会重新进入DOSUSB的官方网站(www.dosusb.net),欣喜地发现,这个网站不仅依然存在,而且还有所发展,相继推出了DOSUSB 2.0和DOSUSB3.0,但是不再免费(以前,DOSUSB的二进制代码是免费的,但源代码收费),USB 3.0还不怎么常用(至少在运行DOS的机器上),所以,本文仅对DOSUSB 2.0的免费版做了一个简单的分析,介绍其限制方法,并提出了一个非常简单的破解方法。
行号 内存地址 二进制码 反汇编指令 注释 ------------------------------------------------------------------------------------------------ 001 3760:0100 E93D05 JMP 0640 002 ......(这里是一块数据区) 003 3760:0640 BBA386 MOV BX,86A3 ; 新分配的段落块(16字节)数量 004 3760:0643 C1EB04 SHR BX,04 ; ES=内存块段地址 005 3760:0646 43 INC BX 006 3760:0647 B44A MOV AH,4A 007 3760:0649 CD21 INT 21 ; 修改分配的内存块 008 3760:064B B8626B MOV AX,6B62 009 3760:064E 050008 ADD AX,0800 ; 重新设置堆栈,栈底在6b62h 010 3760:0651 8BE0 MOV SP,AX ; 堆栈长度为800h 011 3760:0653 E8DE72 CALL 7934 ; 判断运行环境,设置内存策略 012 ............(这里省略若干行代码) 013 3760:069B E82673 CALL 79C4 ; 显示DOSUSB的版本信息 014 3760:069E BEBD5E MOV SI,5EBD ; 指向字符串:Time restricted Demo Version 015 3760:06A1 E83223 CALL 29D6 ; 显示字符串 016 3760:06A4 60 PUSHA 017 3760:06A5 B42C MOV AH,2C ; DOS功能:取时间 018 3760:06A7 CD21 INT 21 (DOS) 019 3760:06A9 890E0360 MOV [6003],CX ; CH=小时,CL=分钟 020 3760:06AD 61 POPA 021 3760:06AE 60 PUSHA 022 3760:06AF 8B0E0360 MOV CX,[6003] 023 3760:06B3 33C0 XOR AX,AX 024 3760:06B5 8AC5 MOV AL,CH ; 小时(0--23) 025 3760:06B7 B33C MOV BL,3C ; 3ch=60,把小时数换算成分钟数 026 3760:06B9 F6E3 MUL BL ; AX中为当前时间的小时部分转换的分钟数 027 3760:06BB B500 MOV CH,00 028 3760:06BD 03C1 ADD AX,CX ; 加上当前时间的分钟数,为相对于凌晨的分钟数 029 3760:06BF A30F79 MOV [790F],AX ; word [790fh]存储启动程序时的分钟数 030 3760:06C2 1E PUSH DS 031 3760:06C3 33C0 XOR AX,AX 032 3760:06C5 8ED8 MOV DS,AX 033 3760:06C7 A0FE04 MOV AL,[04FE] ; 0:04feh在BIOS数据区,用这个位置记录程序的启动次数 034 3760:06CA 3C0A CMP AL,0A ; 当启动次数达到10次时,将不能再次启动,需要重新启动计算机 035 3760:06CC 7214 JB 06E2 ; <10次启动,可以运行 036 3760:06CE 90 NOP 037 3760:06CF 90 NOP 038 3760:06D0 1F POP DS 039 3760:06D1 BEE55E MOV SI,5EE5 ; Terminal Demo Version! 040 3760:06D4 E8FF22 CALL 29D6 ; 显示一个以\0结尾的字符串 041 3760:06D7 BEE15F MOV SI,5FE1 ; 回车,换行 042 3760:06DA E8F922 CALL 29D6 ; 显示一个以\0结尾的字符串 043 3760:06DD 61 POPA 044 3760:06DE B44C MOV AH,4C ; DOS功能,退出应用程序 045 3760:06E0 CD21 INT 21 (DOS) 046 3760:06E2 FEC0 INC AL ; 将启动次数+1后存回0:04feh的位置 047 3760:06E4 A2FE04 MOV [04FE],AL 048 3760:06E7 1F POP DS 049 3760:06E8 61 POPA 050 3760:06E9 E9947C JMP 8380 ; 继续进行初始化
行号 内存地址 二进制码 反汇编指令 注释 ------------------------------------------------------------------------------------------------ 001 3760:06EC EB09 JMP 06F7 002 3760:06EE 44 4F 53 55 53 42 0A 03-18 2E DOSUSB.... 003 3760:06F7 2E CS: 004 3760:06F8 803E3E6B00 CMP BYTE PTR [6B3E],00 005 3760:06FD 740E JZ 070D 006 3760:06FF 90 NOP 007 3760:0700 90 NOP 008 3760:0701 EA00000000 JMP 0000:0000 009 3760:0706 2E CS: 010 3760:0707 80263E6B00 AND BYTE PTR [6B3E],00 011 3760:070C CB RETF 012 3760:070D 2E CS: 013 3760:070E 800E3E6B01 OR BYTE PTR [6B3E],01 014 3760:0713 60 PUSHA 015 3760:0714 06 PUSH ES 016 3760:0715 1E PUSH DS 017 3760:0716 52 PUSH DX 018 3760:0717 1E PUSH DS 019 3760:0718 0E PUSH CS 020 3760:0719 0E PUSH CS 021 3760:071A 1F POP DS 022 3760:071B 07 POP ES 023 3760:071C BF426B MOV DI,6B42 024 3760:071F A30D60 MOV [600D],AX 025 3760:0722 1F POP DS 026 3760:0723 8BF2 MOV SI,DX 027 3760:0725 FC CLD 028 3760:0726 B92000 MOV CX,0020 029 3760:0729 F3 REPZ 030 3760:072A A4 MOVSB 031 3760:072B 0E PUSH CS 032 3760:072C 1F POP DS 033 3760:072D 60 PUSHA 034 3760:072E 1E PUSH DS 035 3760:072F 0E PUSH CS 036 3760:0730 1F POP DS 037 3760:0731 F8 CLC 038 3760:0732 B402 MOV AH,02 ; 取CMOS时间 039 3760:0734 CD1A INT 1A (BIOS Clock) 040 3760:0736 7308 JNB 0740 ; 执行BIOS成功 041 3760:0738 90 NOP 042 3760:0739 90 NOP 043 3760:073A 1F POP DS 044 3760:073B 61 POPA 045 3760:073C 7251 JB 078F 046 3760:073E 90 NOP 047 3760:073F 90 NOP 048 3760:0740 53 PUSH BX 049 3760:0741 8AC5 MOV AL,CH ; 时间的小时部分 050 3760:0743 E85523 CALL 2A9B ; 将小时的BCD码转换成十进制数 051 3760:0746 8AF8 MOV BH,AL 052 3760:0748 8AC1 MOV AL,CL ; 时间的分钟部分 053 3760:074A E84E23 CALL 2A9B ; 将分钟的BCD码转换成十进制数 054 3760:074D 8AD8 MOV BL,AL 055 3760:074F 8BCB MOV CX,BX 056 3760:0751 5B POP BX 057 3760:0752 33C0 XOR AX,AX 058 3760:0754 8AC5 MOV AL,CH ; 时间的小时数 059 3760:0756 B33C MOV BL,3C ; 60, 060 3760:0758 F6E3 MUL BL ; 将小时换算成分钟数 061 3760:075A B500 MOV CH,00 062 3760:075C 03C1 ADD AX,CX ; AX=时间的分钟数 063 3760:075E 2E CS: 064 3760:075F 2B060F79 SUB AX,[790F] ; [790Fh]存着程序启动时时间的分钟数 065 3760:0763 3D1400 CMP AX,0014 ; 20分钟 066 3760:0766 1F POP DS 067 3760:0767 61 POPA 068 3760:0768 7225 JB 078F ; 启动不到20分钟 069 3760:076A 90 NOP 070 3760:076B 90 NOP 071 3760:076C 60 PUSHA 072 3760:076D BEE55E MOV SI,5EE5 ; 指向字符串:Terminate Demo Version 073 3760:0770 E86322 CALL 29D6 ; 显示字符串 074 3760:0773 BE015F MOV SI,5F01 ; 指向字符串:please unload DOSUSB 075 3760:0776 E85D22 CALL 29D6 ; 显示字符串 076 3760:0779 BEE15F MOV SI,5FE1 ; 指向一个仅有回车换行的字符串 077 3760:077C E85722 CALL 29D6 ; 显示回车换行 078 3760:077F B8E803 MOV AX,03E8 ; 1000 079 3760:0782 E8F521 CALL 297A ; 该子程序根据AX的值,延迟若干毫秒。延迟1秒 080 3760:0785 61 POPA 081 3760:0786 C606476B42 MOV BYTE PTR [6B47],42 082 3760:078B 90 NOP 083 3760:078C E9E905 JMP 0D78 084 ............ 085 3760:0D78 8B1EA061 MOV BX,[61A0] 086 3760:0D7C 83FB00 CMP BX,+00 087 3760:0D7F 7406 JZ 0D87 088 3760:0D81 90 NOP 089 3760:0D82 90 NOP 090 3760:0D83 B43E MOV AH,3E 091 3760:0D85 CD21 INT 21 (DOS) 092 3760:0D87 2E CS: 093 3760:0D88 80263E6B00 AND BYTE PTR [6B3E],00 094 3760:0D8D BE426B MOV SI,6B42 095 3760:0D90 1E PUSH DS 096 3760:0D91 58 POP AX 097 3760:0D92 5A POP DX 098 3760:0D93 1F POP DS 099 3760:0D94 1E PUSH DS 100 3760:0D95 07 POP ES 101 3760:0D96 50 PUSH AX 102 3760:0D97 1F POP DS 103 3760:0D98 8BFA MOV DI,DX 104 3760:0D9A FC CLD 105 3760:0D9B B92000 MOV CX,0020 106 3760:0D9E F3 REPZ 107 3760:0D9F A4 MOVSB 108 3760:0DA0 06 PUSH ES 109 3760:0DA1 1F POP DS 110 3760:0DA2 07 POP ES 111 3760:0DA3 61 POPA 112 3760:0DA4 CF IRET
原文:http://www.cnblogs.com/heiyue/p/4381735.html