破解Device Monitor心得

来源:互联网 发布:音频压缩算法公式 编辑:程序博客网 时间:2024/04/29 07:04

破解Device Monitor

作者RockHwnd
时间:2004.8.10
网址:http://blog.csdn.net/rockhwnd

Device Monitor在启动的时候读取他目录下的一个叫做license.dm的文件,根据内容用来判断是否已经注册,根据跟踪发现读取文件并分析文件内容的代码在
C:/Program Files/Common Files/HHD Software/Device Monitor/silk.dll文件里面
于是下CreateFile断点

:67F917AF FF15D041F967            Call dword ptr [67F941D0] //CreateFile打开文件
:67F917B5 8BF8                    mov edi, eax
:67F917B7 83FFFF                  cmp edi, FFFFFFFF    //打开文件失败?
:67F917BA 745D                    je 67F91819          //失败就结束了!
:67F917BC 53                      push ebx             //接收文件大小缓存地址进栈
:67F917BD 57                      push edi             //获得的文件句柄进栈
:67F917BE FF15AC41F967            Call dword ptr [67F941AC]   //GetFileSize
:67F917C4 8BD8                    mov ebx, eax                //eax=79c文件大小保存到bx
:67F917C6 53                      push ebx                    //bx进栈
:67F917C7 E87A120000              Call 67F92A46                //申请储存缓存区
:67F917CC 83C404                  add esp, 00000004           
:67F917CF 6A00                    push 00000000
:67F917D1 8D5584                  lea edx, dword ptr [ebp-7C] 
:67F917D4 52                      push edx                     //EDX=NULL
:67F917D5 53                      push ebx                     //读取的文件大小
:67F917D6 50                      push eax                     //保存文件的缓存地址!重要!以后要密切关注
:67F917D7 57                      push edi                     //文件句柄
:67F917D8 8945C0                  mov dword ptr [ebp-40], eax
:67F917DB FF156841F967            Call dword ptr [67F94168]       //调用ReadFile函数
:67F917E1 57                      push edi
:67F917E2 FF15D441F967            Call dword ptr [67F941D4]        //关闭了文件,这时查看EAX所指向的内存,的确为license.dm文件内容
:67F917E8 8B7508                  mov esi, dword ptr [ebp+08]
:67F917EB 83C634                  add esi, 00000034
:67F917EE E82DF2FFFF              call 67F90A20                   ////关键函数1,程序在这里进行了文件的内容检查
:67F917F3 8B7DC0                  mov edi, dword ptr [ebp-40]
:67F917F6 8B45B4                  mov eax, dword ptr [ebp-4C]
:67F917F9 53                      push ebx
:67F917FA 57                      push edi
:67F917FB 50                      push eax
:67F917FC E86FF8FFFF              call 67F91070                    //关键函数2,程序在这里进行了文件的内容检查
:67F91801 57                      push edi
:67F91802 8BF0                    mov esi, eax
:67F91804 E843120000              Call 67F92A4C                   
//释放内存,之所以知道前面那个是文件内容的检查,主要是根据这里释放的获得的文件的那块内存,既然释放,说明程序已经检验完毕了,因此前面两个函数是重点
:67F91809 83C404                  add esp, 00000004
:67F9180C 85F6                    test esi, esi
//返回文件是不是正确的?
:67F9180E 0F8568010000            jne 67F9197C //未注册的话就往下去地狱了,注册了就去天堂咯:)天堂地址是67F9197C哦,那在这里把他换个方向吧改成jmp
:67F91814 8B750C                  mov esi, dword ptr [ebp+0C] //以下都是显示未注册了
:67F91817 33DB                    xor ebx, ebx
.....

:67F9197C 8B7508                  mov esi, dword ptr [ebp+08]  //注册成功后执行的代码
:67F9197F 33FF                    xor edi, edi
:67F91981 397E40                  cmp dword ptr [esi+40], edi
:67F91984 C745BC00000000          mov [ebp-44], 00000000
:67F9198B 761D                    jbe 67F919AA
:67F9198D 33DB                    xor ebx, ebx
:67F9198F 90                      nop
:67F91990 8B563C                  mov edx, dword ptr [esi+3C]
:67F91993 8B45D4                  mov eax, dword ptr [ebp-2C]
:67F91996 8B08                    mov ecx, dword ptr [eax]
:67F91998 03D3                    add edx, ebx
:67F9199A 52                      push edx
:67F9199B 50                      push eax
:67F9199C FF510C                  call [ecx+0C]
:67F9199F 83C701                  add edi, 00000001
:67F919A2 83C310                  add ebx, 00000010
:67F919A5 3B7E40                  cmp edi, dword ptr [esi+40]
:67F919A8 72E6                    jb 67F91990

 

注意修改67F9180E 0F8568010000            jne 67F9197C这句的时候有两种方案
一种是改成je但是这样的话如果注册码是有效的话反而不起作用,另一种方案是改成jmp但是这样由于
0f85 68010000 jnz silk.67f9197c
e9 69010000 jmp silk.67f9197c 由于缺失一个字节,会产生不对称的情况,因此一定记得在jmp命令后再加一个nop命令,这样代码对称