好友
阅读权限20
听众
最后登录1970-1-1
|
本帖最后由 chinasmu 于 2011-4-5 11:35 编辑
【破文标题】文件夹看门狗 白金版 V4.1算法分析(附注册机)
【破文作者】DemoV
【破解工具】OD
【破解平台】Win7
【软件名称】文件夹看门狗-白金版
【软件大小】280KB
【原版下载】自己搜索下载
【软件简介】[文件夹看门狗 白金版 V4.1]
适于安装Windows 9X/NT和Vista/Win7系统的计算机中◇本机硬盘◇和◇移动存储器◇中文件夹加密。
操作简便,解压软件,将软件拷贝到待加密文件夹中(无须安装)或浏览选择文件夹,输入密码点击"加密"按钮,就OK啦!
文件夹加密后效果:
□无法删除和复制文件夹
□文件夹中内容全部消失,除本软件外:)
【破解声明】只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
------------------------------------------------------------------------
【破解过程】
用Peid查得该软件用Visual C++ 6.0编写,用到了MD5算法。
定位关键代码的过程略过,直接进入正题。
1——读取注册码,进入验证call
00409A0F |> \8B4424 08 mov eax,dword ptr ss:[esp+8]
00409A13 |. 8D4C24 10 lea ecx,dword ptr ss:[esp+10]
00409A17 |. 8DB7 C0000000 lea esi,dword ptr ds:[edi+C0] ; 假码地址放入esi
00409A1D |. 51 push ecx ; /pBufSize
00409A1E |. 8D5424 10 lea edx,dword ptr ss:[esp+10] ; |
00409A22 |. 56 push esi ; |Buffer
00409A23 |. 52 push edx ; |pValueType
00409A24 |. 6A 00 push 0 ; |Reserved = NULL
00409A26 |. 68 D0F74300 push DirWatch.0043F7D0 ; |ValueName = "RegSerial"
00409A2B |. 50 push eax ; |hKey
00409A2C |. C74424 24 010>mov dword ptr ss:[esp+24],1 ; |
00409A34 |. FF15 10304300 call dword ptr ds:[<&ADVAPI32.RegQueryVa>; \RegQueryValueExA
00409A3A |. 85C0 test eax,eax
00409A3C |. 74 08 je short DirWatch.00409A46
00409A3E |. 5F pop edi
00409A3F |. 33C0 xor eax,eax
00409A41 |. 5E pop esi
00409A42 |. 83C4 0C add esp,0C
00409A45 |. C3 retn
00409A46 |> 33C0 xor eax,eax
00409A48 |> 8A0C06 /mov cl,byte ptr ds:[esi+eax] ; 依次取注册码的前20位
00409A4B |. 8888 A0224400 |mov byte ptr ds:[eax+4422A0],cl ; 如果输入的注册码大于20位,20位以后都被忽略
00409A51 |. 40 |inc eax
00409A52 |. 83F8 14 |cmp eax,14
00409A55 |.^ 7C F1 \jl short DirWatch.00409A48
00409A57 |. 68 A0224400 push DirWatch.004422A0 ; 输入的假码(ASCII "78787878")
00409A5C |. 8BCF mov ecx,edi
00409A5E |. C605 B4224400>mov byte ptr ds:[4422B4],0
00409A65 |. E8 16000000 call DirWatch.00409A80 ; 重启验证call,进入分析
00409A6A |. 8B5424 08 mov edx,dword ptr ss:[esp+8]
00409A6E |. 8BF0 mov esi,eax
00409A70 |. 52 push edx ; /hKey
00409A71 |. FF15 14304300 call dword ptr ds:[<&ADVAPI32.RegCloseKe>; \RegCloseKey
00409A77 |. 8BC6 mov eax,esi
00409A79 |. 5F pop edi
00409A7A |. 5E pop esi
00409A7B |. 83C4 0C add esp,0C
00409A7E \. C3 retn
2—— 重启验证call,进入分析
00409A80 /$ 64:A1 0000000>mov eax,dword ptr fs:[0]
00409A86 |. 8B15 C8204400 mov edx,dword ptr ds:[4420C8] ; 机器码 ASCII "ABCDEFGHIJKLV61E80T8"
00409A8C |. 6A FF push -1
00409A8E |. 68 98194300 push DirWatch.00431998
00409A93 |. 50 push eax
00409A94 |. 33C0 xor eax,eax
00409A96 |. 64:8925 00000>mov dword ptr fs:[0],esp
00409A9D |. 8B4A F8 mov ecx,dword ptr ds:[edx-8] ; ds:[005E59B0]=00000014,为机器码的长度
00409AA0 |. 83EC 70 sub esp,70
00409AA3 |. 85C9 test ecx,ecx ; 检查机器码长度是否为0,为0则跳至00409ACD
00409AA5 |. 53 push ebx
00409AA6 |. 55 push ebp
00409AA7 |. 56 push esi
00409AA8 |. 57 push edi
00409AA9 |. 7E 20 jle short DirWatch.00409ACB
00409AAB |. 8BF2 mov esi,edx
00409AAD |. 8D4C24 14 lea ecx,dword ptr ss:[esp+14]
00409AB1 |. 2BF1 sub esi,ecx
00409AB3 |> 8D0C06 /lea ecx,dword ptr ds:[esi+eax] ;\
00409AB6 |. 40 |inc eax ; |
00409AB7 |. 8A4C0C 14 |mov cl,byte ptr ss:[esp+ecx+14] ; |
00409ABB |. 884C04 13 |mov byte ptr ss:[esp+eax+13],cl ; | 该处循环算出机器码的长度
00409ABF |. 8B4A F8 |mov ecx,dword ptr ds:[edx-8] ; |
00409AC2 |. 3BC1 |cmp eax,ecx ; |
00409AC4 |.^ 7C ED \jl short DirWatch.00409AB3 /
00409AC6 |. 83F8 14 cmp eax,14 ; 机器码长度应大于等于20
00409AC9 |. 7D 0F jge short DirWatch.00409ADA
00409ACB |> 8AD0 /mov dl,al ; \
00409ACD |. 80C2 41 |add dl,41 ; |
00409AD0 |. 885404 14 |mov byte ptr ss:[esp+eax+14],dl ; | 若机器码长度小于20,该处循环负责将其补到20位
00409AD4 |. 40 |inc eax ; |
00409AD5 |. 83F8 14 |cmp eax,14 ; |
00409AD8 |.^ 7C F1 \jl short DirWatch.00409ACB ; /
00409ADA |> 8D4424 28 lea eax,dword ptr ss:[esp+28]
00409ADE |. 50 push eax
00409ADF |. E8 0CA7FFFF call DirWatch.004041F0 ; 进行MD5初始化,进去一看便知
00409AE4 |. 8D4C24 18 lea ecx,dword ptr ss:[esp+18]
00409AE8 |. 6A 14 push 14
00409AEA |. 8D5424 30 lea edx,dword ptr ss:[esp+30]
00409AEE |. 51 push ecx
00409AEF |. 52 push edx
00409AF0 |. E8 2BA7FFFF call DirWatch.00404220
00409AF5 |. 8D4424 38 lea eax,dword ptr ss:[esp+38]
00409AF9 |. 8D4C24 20 lea ecx,dword ptr ss:[esp+20]
00409AFD |. 50 push eax ; eax=0012FAD0,用来保存最终的散列值
00409AFE |. 51 push ecx
00409AFF |. E8 8CAEFFFF call DirWatch.00404990 ; MD5计算,主要是将计算出的散列值(AE 1A 7D 23 BE 05 11 F6 A1 B1 5D 75 C4 A2 BE F9)
00409B04 |. 83C4 18 add esp,18 ; 保存在0012FAD0中,再将其转换为小写放入内存单元中,
00409B07 |. 8B7424 10 mov esi,dword ptr ss:[esp+10] ; 转换后的MD5值,堆栈 ss:[0012FAB8]=003E5A58, (ASCII "ae1a7d23be0511f6a1b15d75c4a2bef9")
00409B0B |. 33C9 xor ecx,ecx
00409B0D |. 8A46 01 mov al,byte ptr ds:[esi+1] ; 取"ae1a7d23be0511f6a1b15d75c4a2bef9"的第二个字符'e',放入al中
00409B10 |. 884424 16 mov byte ptr ss:[esp+16],al ; 将机器码的第三个字符'C'用'e'替换
00409B14 |. 8A46 04 mov al,byte ptr ds:[esi+4] ; 取"ae1a7d23be0511f6a1b15d75c4a2bef9"的第五个字符'7',放入al中
00409B17 |. 884424 18 mov byte ptr ss:[esp+18],al ; 将机器码的第五个字符'E'用'7'替换
00409B1B |. 8A46 07 mov al,byte ptr ds:[esi+7] ; 取"ae1a7d23be0511f6a1b15d75c4a2bef9"的第八个字符'3',放入al中
00409B1E |. 884424 1C mov byte ptr ss:[esp+1C],al ; 将机器码的第九个字符'I'用'3'替换
00409B22 |> 8A440C 14 /mov al,byte ptr ss:[esp+ecx+14] ; 该处循环继续对机器码进行处理,ecx作为计数器
00409B26 |. 3C 30 |cmp al,30
00409B28 |. 7C 0C |jl short DirWatch.00409B36
00409B2A |. 3C 39 |cmp al,39
00409B2C |. 7F 08 |jg short DirWatch.00409B36
00409B2E |. B2 69 |mov dl,69
00409B30 |. 2AD0 |sub dl,al
00409B32 |. 88540C 14 |mov byte ptr ss:[esp+ecx+14],dl
00409B36 |> 3C 41 |cmp al,41
00409B38 |. 7C 0C |jl short DirWatch.00409B46
00409B3A |. 3C 5A |cmp al,5A
00409B3C |. 7F 08 |jg short DirWatch.00409B46
00409B3E |. B2 9B |mov dl,9B
00409B40 |. 2AD0 |sub dl,al
00409B42 |. 88540C 14 |mov byte ptr ss:[esp+ecx+14],dl
00409B46 |> 3C 61 |cmp al,61
00409B48 |. 7C 0C |jl short DirWatch.00409B56
00409B4A |. 3C 7A |cmp al,7A
00409B4C |. 7F 08 |jg short DirWatch.00409B56
00409B4E |. B2 DB |mov dl,0DB
00409B50 |. 2AD0 |sub dl,al
00409B52 |. 88540C 14 |mov byte ptr ss:[esp+ecx+14],dl
00409B56 |> 41 |inc ecx
00409B57 |. 83F9 14 |cmp ecx,14
00409B5A |.^ 7C C6 \jl short DirWatch.00409B22 ; 循环结束后,机器码变为:ZYvW2UTS6QPOE38V19G1
00409B5C |. 8A4424 15 mov al,byte ptr ss:[esp+15] ; 取机器码第二位'Y'放入al中
00409B60 |. 8A4C24 21 mov cl,byte ptr ss:[esp+21] ; 取机器码第十四位'3'放入cl中
00409B64 |. 8A5424 1E mov dl,byte ptr ss:[esp+1E] ; 取机器码第十一位'P'放入dl中
00409B68 |. 884424 21 mov byte ptr ss:[esp+21],al ; 用机器码第二位'Y'替换第十四位'3'
00409B6C |. 8A4424 17 mov al,byte ptr ss:[esp+17] ; 取第四位'W'
00409B70 |. 8BAC24 900000>mov ebp,dword ptr ss:[esp+90] ; 将假码“78787878”放入ebp中
00409B77 |. 884424 1E mov byte ptr ss:[esp+1E],al ; 用第四位'W'替换第十一位'P'
00409B7B |. 8A4424 19 mov al,byte ptr ss:[esp+19] ; 取第六位‘U’放入al
00409B7F |. 884C24 15 mov byte ptr ss:[esp+15],cl ; 用第十四位'3'替换第二位
00409B83 |. 8A4C24 20 mov cl,byte ptr ss:[esp+20] ; 十三位'E'放入cl
00409B87 |. 884424 20 mov byte ptr ss:[esp+20],al ; 从00409B5C到00409BAF为对机器码的第二次处理,不再详细分析,请读者自行分析
00409B8B |. 8A4424 1B mov al,byte ptr ss:[esp+1B]
00409B8F |. 885424 17 mov byte ptr ss:[esp+17],dl
00409B93 |. 8A5424 22 mov dl,byte ptr ss:[esp+22]
00409B97 |. 884C24 19 mov byte ptr ss:[esp+19],cl
00409B9B |. 8A4C24 23 mov cl,byte ptr ss:[esp+23]
00409B9F |. 884424 22 mov byte ptr ss:[esp+22],al
00409BA3 |. 8A4424 1D mov al,byte ptr ss:[esp+1D]
00409BA7 |. 885424 1B mov byte ptr ss:[esp+1B],dl
00409BAB |. 884C24 1D mov byte ptr ss:[esp+1D],cl
00409BAF |. 884424 23 mov byte ptr ss:[esp+23],al ; 此步结束后机器码变为Z3vP2ET86VWOUYSQ19G1
00409BB3 |. 8BCD mov ecx,ebp ; 假码放入ecx
00409BB5 |. 8D5424 14 lea edx,dword ptr ss:[esp+14] ; 取机器码第一位'Z'
00409BB9 |. 33C0 xor eax,eax
00409BBB |. 2BCA sub ecx,edx
00409BBD |> 8D7C04 14 /lea edi,dword ptr ss:[esp+eax+14] ; \
00409BC1 |. 33DB |xor ebx,ebx ; |
00409BC3 |. 0FBE1439 |movsx edx,byte ptr ds:[ecx+edi] ; |
00409BC7 |. 8A1F |mov bl,byte ptr ds:[edi] ; |
00409BC9 |. 3BD3 |cmp edx,ebx ; |此处循环逐位取假码与变形后的机器码比较,取至第16位,不等则跳向失败,eax为计数器
00409BCB 0F85 B7000000 jnz DirWatch.00409C88 ; |
00409BD1 |. 40 |inc eax ; |
00409BD2 |. 83F8 10 |cmp eax,10 ; |
00409BD5 |.^ 7C E6 \jl short DirWatch.00409BBD ; /
00409BD7 |. 8A46 1F mov al,byte ptr ds:[esi+1F] ; 取"ae1a7d23be0511f6a1b15d75c4a2bef9"最后一位'9'放入al
00409BDA |. A2 18F94300 mov byte ptr ds:[43F918],al
00409BDF |. 8A4E 0F mov cl,byte ptr ds:[esi+F] ; 取"ae1a7d23be0511f6a1b15d75c4a2bef9"的第十六位'6'放入cl
00409BE2 |. 880D 19F94300 mov byte ptr ds:[43F919],cl
00409BE8 |. 8A56 07 mov dl,byte ptr ds:[esi+7] ; 取"ae1a7d23be0511f6a1b15d75c4a2bef9"的八位'3'放入dl
00409BEB |. 8815 40FB4300 mov byte ptr ds:[43FB40],dl
00409BF1 |. 8A5E 03 mov bl,byte ptr ds:[esi+3] ; 取"ae1a7d23be0511f6a1b15d75c4a2bef9"的第四位'a'放入bl
00409BF4 |. 3C 61 cmp al,61 ; 继续对后四位进行处理
00409BF6 |. 881D 41FB4300 mov byte ptr ds:[43FB41],bl ; 以下代码均比较简单,不再继续分析
00409BFC |. 72 0B jb short DirWatch.00409C09
00409BFE |. 3C 7A cmp al,7A
00409C00 |. 77 07 ja short DirWatch.00409C09
00409C02 |. 2C 20 sub al,20
00409C04 |. A2 18F94300 mov byte ptr ds:[43F918],al
00409C09 |> 80F9 61 cmp cl,61
00409C0C |. 72 0E jb short DirWatch.00409C1C
00409C0E |. 80F9 7A cmp cl,7A
00409C11 |. 77 09 ja short DirWatch.00409C1C
00409C13 |. 80E9 20 sub cl,20
00409C16 |. 880D 19F94300 mov byte ptr ds:[43F919],cl
00409C1C |> 80FA 61 cmp dl,61
00409C1F |. 72 0E jb short DirWatch.00409C2F
00409C21 |. 80FA 7A cmp dl,7A
00409C24 |. 77 09 ja short DirWatch.00409C2F
00409C26 |. 80EA 20 sub dl,20
00409C29 |. 8815 40FB4300 mov byte ptr ds:[43FB40],dl
00409C2F |> 80FB 61 cmp bl,61
00409C32 |. 72 0E jb short DirWatch.00409C42
00409C34 |. 80FB 7A cmp bl,7A
00409C37 |. 77 09 ja short DirWatch.00409C42
00409C39 |. 80EB 20 sub bl,20
00409C3C |. 881D 41FB4300 mov byte ptr ds:[43FB41],bl ; 到这里,根据上面的分析,注册码后四位应为963A,完整的注册码为Z3vP2ET86VWOUYSQ963A
00409C42 |> 0FBE45 10 movsx eax,byte ptr ss:[ebp+10] ; 取假码的第十七位
00409C46 |. 8B0D 18F94300 mov ecx,dword ptr ds:[43F918]
00409C4C |. 81E1 FF000000 and ecx,0FF
00409C52 |. 3BC8 cmp ecx,eax ; 真假比较,不等就跳向失败
00409C54 |. 75 4A jnz short DirWatch.00409CA0
00409C56 |. 0FBE55 11 movsx edx,byte ptr ss:[ebp+11] ; 取假码的第十八位
00409C5A |. 33C0 xor eax,eax
00409C5C |. A0 19F94300 mov al,byte ptr ds:[43F919]
00409C61 |. 3BC2 cmp eax,edx ; 真假比较,不等就跳向失败
00409C63 |. 75 3B jnz short DirWatch.00409CA0
00409C65 |. 0FBE4D 12 movsx ecx,byte ptr ss:[ebp+12] ; 取假码的第十九位
00409C69 |. 33D2 xor edx,edx
00409C6B |. 8A15 40FB4300 mov dl,byte ptr ds:[43FB40]
00409C71 |. 3BD1 cmp edx,ecx ; 真假比较,不等就跳向失败
00409C73 |. 75 2B jnz short DirWatch.00409CA0
00409C75 |. 0FBE45 13 movsx eax,byte ptr ss:[ebp+13] ; 取假码的第二十位
00409C79 |. 33C9 xor ecx,ecx
00409C7B |. 8ACB mov cl,bl
00409C7D |. 3BC8 cmp ecx,eax ; 真假比较,不等就跳向失败
00409C7F |. 75 1F jnz short DirWatch.00409CA0
00409C81 |. BE 01000000 mov esi,1
00409C86 |. EB 1A jmp short DirWatch.00409CA2
00409C88 |> 8D4C24 10 lea ecx,dword ptr ss:[esp+10] ; A-------->失败从这里走过
00409C8C |. C78424 880000>mov dword ptr ss:[esp+88],-1 ; B-总的来说,有两处判断注册码的关键跳转,一处是对注册码的前16位进行判断,失败将跳向上面的A处
00409C97 |. E8 D4EE0100 call DirWatch.00428B70 ; C-另一处是对注册码后四位进行的判断,失败跳向下面的F处
00409C9C |. 33C0 xor eax,eax ; D-如果要对该软件进行爆破的话,这里绝对是一处风景秀丽的爆破点:将A--F这6行全部给无情的NOP掉
00409C9E |> EB 18 jmp short DirWatch.00409CB8 ; E-这样爆破后软件首次运行仍为未注册版,需要试注册一次,再次重新启动,才可用。
00409CA0 |> 33F6 xor esi,esi ; F-------->失败从这里走过
00409CA2 |. 8D4C24 10 lea ecx,dword ptr ss:[esp+10] ; 成功从这里开始!
00409CA6 |. C78424 880000>mov dword ptr ss:[esp+88],-1
00409CB1 |. E8 BAEE0100 call DirWatch.00428B70
00409CB6 |. 8BC6 mov eax,esi
00409CB8 |> 8B8C24 800000>mov ecx,dword ptr ss:[esp+80]
00409CBF |. 5F pop edi
00409CC0 |. 5E pop esi
00409CC1 |. 5D pop ebp
00409CC2 |. 5B pop ebx
00409CC3 |. 64:890D 00000>mov dword ptr fs:[0],ecx
00409CCA |. 83C4 7C add esp,7C
00409CCD \. C2 0400 retn 4
本机的注册码:
MacID:
ABCDEFGHIJKLV61E80T8
RegSerial:
Z3vP2ET86VWOUYSQ963A
算法之外;
该软件的注册信息保存在注册表里,另外会在C:\Program Files目录下生成名为Dir800621.ini的文件。
试用版程序会从注册表里获取安装时间,同时获取Dir800621.ini文件的创建时间,将两个时间进行比较,取其较早的时间与当前系统时间比较,来判断试用期已经过了多少。
试用期满的话可将注册表[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft]目录下的SelfDePro项和C:\Program Files目录下的Dir800621.ini文件同时删除,即可重新获得15天的试用时间。
------------------------------------------------------------------------
【破解总结】
该软件的算法比较简单,用到了MD5算法,没有亮点。
软件作者对软件进行升级时没有更新算法,注册机是跟踪该软件的4.0版时写的,没想到4.1版完全适用...
CrAcKeD By DeMoV
2011-2-9
------------------------------------------------------------------------
【版权声明】本文原创于吾爱破解论坛, 转载请注明作者并保持文章的完整, 谢谢!
KeyGen.zip
(3.42 KB, 下载次数: 242)
|
|