• 标 题:文件加锁王 8.1算法分析
  • 作 者:onlyu
  • 时 间:2003年12月11日 10:09
  • 链 接:http://bbs.pediy.com

文件加锁王 8.1算法分析
 文件加锁王 8.1算法分析
 作者:onlyu[FCG][DFCG]
【软件名称】文件加锁王 8.1
【下载地址】http://hnpy.onlinedown.net/down/lockFile.rar
【应用平台】Win9x/NT/2000/XP
【软件大小】297k
【软件限制】20次限次版
【破解声明】破解只是感兴趣,无其它目的。失误之处敬请诸位大侠赐教!
【破解工具】regshot v1.10,trw2000 v1.22
【软件简介】文件保护工具
【分析过程】运行软件,发现是20次限次版本,先看一下它把使用次数记录在哪里,运行regshot ,先进行一次扫描,运行软件,再关闭,用regshot 进行第二次扫描,比较,得到如下结果:

**Original contents Maybe deleted or modified**H.L.KSoftwareMicrosoftWindowsRuntimes: 
"2"H.U.DEFAULTSoftwareMicrosoftWindowsCurrentVersionPoliciesExplorerNoLogoff: 
0x00000000H.U.DEFAULTSoftwareMicrosoftWindowsCurrentVersionPoliciessystemDisableTaskMgr: 
0x00000000H.U.DEFAULTSoftwareMicrosoftWindowsCurrentVersionPoliciessystemDisableLockWorkstation: 
0x00000000H.U.DEFAULTSoftwareMicrosoftWindowsCurrentVersionPoliciessystemDisableChangePassword:
 0x00000000**Keys&values Modified | Added in the 
2ndShot**H.L.KSoftwareMicrosoftWindowsRuntimes: "3"H.U.DEFAULTSoftwareMicrosoftWindowsCurrentVersionPoliciesExplorerNoLogoff: 
0x00000001H.U.DEFAULTSoftwareMicrosoftWindowsCurrentVersionPoliciessystemDisableTaskMgr: 
0x00000001H.U.DEFAULTSoftwareMicrosoftWindowsCurrentVersionPoliciessystemDisableLockWorkstation: 
0x00000001H.U.DEFAULTSoftwareMicrosoftWindowsCurrentVersionPoliciessystemDisableChangePassword: 0x00000001

真是一目了然啊!它把使用次数信息记录在H.L.KSoftwareMicrosoftWindowsRuntimes键值中,怎么去除使用次数限制不用我说了吧。下面分析一下它的注册算法。来到注册窗口,它会告诉我的电脑ID号码:659428341。好,输入我的试练码:78787878,下万能断点:bpx hmemcpy,结果不停地黑频,**!,没办法,只能用其他方法了,按cntl+m,进入TRW,下s 0 l  -1 '78787878',找到了,为30:805c7f32(注:每次都不一样),下bpm 805c7f32。f5来到程序,点确定输入,终于截下了,下pmodule,来到: 
0167:0044A7EA  CMP      EAX,EBX
0167:0044A7EC  FNCLEX  
0167:0044A7EE  JNL      0044A808
0167:0044A7F0  MOV      ECX,[EBP+FFFFFF10]
0167:0044A7F6  PUSH     DWORD A0
0167:0044A7FB  PUSH     DWORD 00422F9C
0167:0044A800  PUSH     ECX
0167:0044A801  PUSH     EAX
0167:0044A802  CALL     `MSVBVM60!__vbaHresultCheckObj`
0167:0044A808  MOV      EAX,[EBP-28]
0167:0044A80B  LEA      EDX,[EBP-44]
0167:0044A80E  MOV      [EBP-3C],EAX
0167:0044A811  LEA      EAX,[EBP-54]
0167:0044A814  PUSH     EDX
0167:0044A815  PUSH     EAX
0167:0044A816  MOV      [EBP-28],EBX
0167:0044A819  MOV      DWORD [EBP-44],08
0167:0044A820  CALL     `MSVBVM60!rtcTrimVar`
0167:0044A826  MOV      EAX,00422260
0167:0044A82B  LEA      ECX,[EBP-54]
0167:0044A82E  MOV      [EBP+FFFFFF54],EAX
0167:0044A834  MOV      [EBP+FFFFFF44],EAX
0167:0044A83A  LEA      EDX,[EBP+FFFFFF4C]
0167:0044A840  PUSH     ECX
0167:0044A841  LEA      EAX,[EBP-64]
0167:0044A844  PUSH     EDX
0167:0044A845  PUSH     EAX
呵呵,是VB程序,还好不是Pcode的,按F10继续往下走,来到:
0167:0044A979 FF1564104000     CALL     `MSVBVM60!__vbaHresultCheckObj`
0167:0044A97F 8B8D18FFFFFF     MOV      ECX,[EBP+FFFFFF18]<------[EBP+FFFFFF18]存储我的ID号码
0167:0044A985 FF1580104000     CALL     `MSVBVM60!__vbaI4Abs`<--------求ecx的绝对值
0167:0044A98B 8BC8             MOV      ECX,EAX<-------------EAX=0
0167:0044A98D 81E969FE0B00     SUB      ECX,000BFE69<--------ECX=ECX-BFE69
0167:0044A993 0F80E0050000     JO       NEAR 0044AF79
0167:0044A999 FF1580104000     CALL     `MSVBVM60!__vbaI4Abs`<--------求ecx的绝对值EAX=|ECX|
0167:0044A99F 8BC8             MOV      ECX,EAX<----------------------ECX=EAX
0167:0044A9A1 B8D3200DD2       MOV      EAX,D20D20D3<-----------------EAX=D20D20D3
0167:0044A9A6 F7E9             IMUL     ECX<--------------------------EAX*ECX
0167:0044A9A8 03D1             ADD      EDX,ECX<----------------------EDX=EDX+ECX
0167:0044A9AA C1FA06           SAR      EDX,06<-----------------------EDX=EDX sar 6
0167:0044A9AD 8BCA             MOV      ECX,EDX<----------------------EDX里存储的就是注册码了
0167:0044A9AF C1E91F           SHR      ECX,1F
0167:0044A9B2 03D1             ADD      EDX,ECX
0167:0044A9B4 52               PUSH     EDX
0167:0044A9B5 FF1514104000     CALL     `MSVBVM60!__vbaStrI4`
0167:0044A9BB 894594           MOV      [EBP-6C],EAX<-----------------[EAX]->"8444132"我的注册码
0167:0044A9BE 8D558C           LEA      EDX,[EBP-74]
0167:0044A9C1 8D857CFFFFFF     LEA      EAX,[EBP+FFFFFF7C]
0167:0044A9C7 52               PUSH     EDX
0167:0044A9C8 50               PUSH     EAX
0167:0044A9C9 C7458C08000000   MOV      DWORD [EBP-74],08
0167:0044A9D0 FF15A8104000     CALL     `MSVBVM60!rtcTrimVar`
0167:0044A9D6 8D4DAC           LEA      ECX,[EBP-54]
0167:0044A9D9 8D954CFFFFFF     LEA      EDX,[EBP+FFFFFF4C]
0167:0044A9DF 51               PUSH     ECX
0167:0044A9E0 8D459C           LEA      EAX,[EBP-64]
0167:0044A9E3 52               PUSH     EDX
0167:0044A9E4 50               PUSH     EAX
0167:0044A9E5 C78544FFFFFF6022+MOV      DWORD [EBP+FFFFFF44],00422260
0167:0044A9EF C7853CFFFFFF0800+MOV      DWORD [EBP+FFFFFF3C],08
0167:0044A9F9 FF1540114000     CALL     `MSVBVM60!__vbaVarCat`
可以看出这个软件的注册算法极其简单,内存注册机如下:
1、程序名称:LockFile.exe 
2、添加数据: 
  中断地址:44A9BB 
    中断次数:1 
  第一字节:89 
  指令长度:3
3、选择内存方式寄存器EAX,宽字符,生成。
下面引用BKSY[DFCG]用VC编写的注册机源代码:
#include <stdio.h>

int abs(int n)
{
if(n<0) n*=(-1);
return n;
}

void main()
{
int id;
printf("input your id:");
scanf("%d",&id);
id=abs(id);
id-=0xBFE69;
id=abs(id);
__asm
{
mov ecx,id
mov eax,0xD20D20D3
imul ecx
add edx,ecx
sar edx,6
mov id,edx
}
printf("
Your code is %d
",id);
}
最后感谢BKSY[DFCG]和laoxuetong[DFCG]的帮助。