hjm666 发表于 2018-5-31 17:28

练手 160个CrakeMe程序之032

本帖最后由 hjm666 于 2018-5-31 18:51 编辑

继续熟悉熟悉下keyfile模式软件


一、基础信息


   
         


开头是一个NAG也是一个keyfile 验证,解决了keyfile 后才能进入到软件, 序列号验证窗口中 有两个按钮,一个不显现





有加 UPX壳。。。 还没遇过这个版本的UPX壳·


二、脱壳
    不管有没有遇过,先大esp定律上来,断下点后一个大跳,到达OEP
(ps:esp 定律不懂度娘····)

   脱下了壳···是Delphi 写的软件





   补充软件的关键事件信息 有5个事件需要注意一下,,但并没有找到用户名输入的输入框的事件··


三、keyfile解决
NAG窗口上提醒我们让我们找Reg.dat 会在哪个文件夹上
   果断在CrakeMe的文件夹新建Reg.dat随便输入写什么,再打开后keyfile直接解决
后来我花了大时间去追为什么是这个路径等等问题···················
   发现程序在OD还没有进行任何操作时,在堆栈窗口中我就已经翻到了CrakeMe的路径已经在堆栈了····
   而且也并未对Reg.dat 文件中的数据进行任何操作。。只要存在这一个名字的文件就好···
       (没意思啊。。。。。。)
四、暴力破解


断下5个断点后发现 OK 事件没什么帮助 4 个序列号事件都调用了同一个call
00437CBB    83FE 05         cmp esi,0x5
00437CBE^ 75 E5         jnz short 1.00437CA5
00437CC0    EB 05         jmp short 1.00437CC7
00437CC2    B9 01000000   mov ecx,0x1
00437CC7    85C9            test ecx,ecx                           ; ecx 要等于 0
00437CC9    75 14         jnz short 1.00437CDF                     ; 关键跳转
00437CCB    A1 28A74300   mov eax,dword ptr ds:
00437CD0    8B80 E0010000   mov eax,dword ptr ds:
00437CD6    B2 01         mov dl,0x1
00437CD8    E8 7B54FEFF   call 1.0041D158
00437CDD    EB 12         jmp short 1.00437CF1
00437CDF    A1 28A74300   mov eax,dword ptr ds:
00437CE4    8B80 E0010000   mov eax,dword ptr ds:
00437CEA    33D2            xor edx,edx                              ; ntdll.KiFastSystemCallRet



关键跳转处修改标志位直接暴力破解掉。。
五、注册机探究
只剩下4个事件了,妥妥的关键地方在共用的那个call
00437BD8    55            push ebp                                  ; 关键点
00437BD9    8BEC            mov ebp,esp
00437BDB    6A 00         push 0x0
00437BDD    6A 00         push 0x0
00437BDF    53            push ebx
00437BE0    56            push esi
00437BE1    33C0            xor eax,eax
00437BE3    55            push ebp
00437BE4    68 0C7D4300   push 1.00437D0C
00437BE9    64:FF30         push dword ptr fs:
00437BEC    64:8920         mov dword ptr fs:,esp
00437BEF    8D55 FC         lea edx,dword ptr ss:
00437BF2    A1 28A74300   mov eax,dword ptr ds:
00437BF7    8B80 0C020000   mov eax,dword ptr ds:
00437BFD    E8 BE55FEFF   call 1.0041D1C0                           ; 压入用户名
00437C02    8B45 FC         mov eax,dword ptr ss:
00437C05    E8 6EBDFCFF   call 1.00403978                           ; 计算子符长度
00437C0A    83F8 05         cmp eax,0x5                               ; 大于5个字符
00437C0D    0F8C AF000000   jl 1.00437CC2
00437C13    8B45 FC         mov eax,dword ptr ss:
00437C16    0FB600          movzx eax,byte ptr ds:               ; 用户名第1个
00437C19    B9 0A000000   mov ecx,0xA
00437C1E    99            cdq
00437C1F    F7F9            idiv ecx                                  ; 除以A
00437C21    A3 2CA74300   mov dword ptr ds:,eax
00437C26    8B45 FC         mov eax,dword ptr ss:
00437C29    0FB640 02       movzx eax,byte ptr ds:         ; 用户名第3个
00437C2D    B9 0A000000   mov ecx,0xA
00437C32    99            cdq
00437C33    F7F9            idiv ecx                                  ; 除以A
00437C35    A3 30A74300   mov dword ptr ds:,eax
00437C3A    8B45 FC         mov eax,dword ptr ss:
00437C3D    0FB640 03       movzx eax,byte ptr ds:         ; 用户名第4个
00437C41    B9 0A000000   mov ecx,0xA
00437C46    99            cdq
00437C47    F7F9            idiv ecx                                  ; 除以A
00437C49    A3 34A74300   mov dword ptr ds:,eax
00437C4E    8B45 FC         mov eax,dword ptr ss:
00437C51    0FB640 04       movzx eax,byte ptr ds:         ; 用户名第5个
00437C55    B9 0A000000   mov ecx,0xA
00437C5A    99            cdq
00437C5B    F7F9            idiv ecx                                  ; 除以A
00437C5D    A3 38A74300   mov dword ptr ds:,eax
00437C62    BE 01000000   mov esi,0x1
00437C67    BB 2CA74300   mov ebx,1.0043A72C
00437C6C    8D55 F8         lea edx,dword ptr ss:
00437C6F    8B03            mov eax,dword ptr ds:
00437C71    E8 8AECFCFF   call 1.00406900
00437C76    8B45 F8         mov eax,dword ptr ss:            ; kernel32.7C817080
00437C79    E8 FABCFCFF   call 1.00403978
00437C7E    48            dec eax
00437C7F    74 0C         je short 1.00437C8D
00437C81    8B03            mov eax,dword ptr ds:
00437C83    B9 0A000000   mov ecx,0xA
00437C88    99            cdq
00437C89    F7F9            idiv ecx                                  ; 除以A
00437C8B    8903            mov dword ptr ds:,eax
00437C8D    46            inc esi
00437C8E    83C3 04         add ebx,0x4
00437C91    83FE 05         cmp esi,0x5
00437C94^ 75 D6         jnz short 1.00437C6C
00437C96    BE 01000000   mov esi,0x1
00437C9B    B8 2CA74300   mov eax,1.0043A72C
00437CA0    BA 3CA74300   mov edx,1.0043A73C                        ; ebx==0043A73C
00437CA5    8B0A            mov ecx,dword ptr ds:
00437CA7    3B08            cmp ecx,dword ptr ds:
00437CA9    74 07         je short 1.00437CB2                     ; 要跳
00437CAB    B9 01000000   mov ecx,0x1
00437CB0    EB 15         jmp short 1.00437CC7
00437CB2    33C9            xor ecx,ecx
00437CB4    46            inc esi
00437CB5    83C2 04         add edx,0x4
00437CB8    83C0 04         add eax,0x4
00437CBB    83FE 05         cmp esi,0x5
00437CBE^ 75 E5         jnz short 1.00437CA5
00437CC0    EB 05         jmp short 1.00437CC7
00437CC2    B9 01000000   mov ecx,0x1
00437CC7    85C9            test ecx,ecx                              ; ecx 要等于 0
00437CC9    75 14         jnz short 1.00437CDF                      ; 关键跳转


总结:
          其实这个需要分析的也比较简单,不过有些带有迷惑性,没有GET到全局变量的变化,感觉有点烦···(一开始我便是{:301_1008:}),程序分别取了用户名的第一 ,第三 ,第四,第五位分别进行了 除以 0xA 操作,
至于序列号如果上述的操作结果还是两位数,就再进行一次除以 0xA 操作,这操作后的4位个数就是序列号
(程序序列号点小按钮最多加到9 ,也可以提供分析思路···)




#include<stdio.h>
#include<string.h>
#include<iostream>
int main()
{
      int b;
      int key={0};
      char name={0};
      printf("Input yous name:\n");
      scanf("%s",&name);
      int len =strlen(name);
      if(len<5)
      {
                printf("Sorry, your name is too small!! \n");
      }      
      else
      {      
                key=name/10;
                if(key>9) key=key/10;
                key=name/10;
                if(key>9) key=key/10;
                key=name/10;
                if(key>9) key=key/10;
                key=name/10;
                if(key>9) key=key/10;
      }
      printf("This key is :");
      for(int i=0;i<4;i++)
      {
                printf("%d",key);
      }
      printf("\n");
      system("pause");
      return 0;
}





   CrakeMe :




如有错误请大佬指出,小生不胜感激!!

hjm666 发表于 2018-5-31 18:56

cotmx7 发表于 2018-5-31 18:46
大哥我想破解个软件有偿啊不行了我

可以发来看看哇,可以试试看啊,我也技术不是很好

↘。⒈木拖鞋 发表于 2018-5-31 19:46

cotmx7 发表于 2018-5-31 18:46
大哥我想破解个软件有偿啊不行了我

已举报,禁止发布求破解内容

cotmx7 发表于 2018-5-31 19:28

hjm666 发表于 2018-5-31 18:56
可以发来看看哇,可以试试看啊,我也技术不是很好

2196373 我QQ

cotmx7 发表于 2018-5-31 19:42

hjm666 发表于 2018-5-31 18:56
可以发来看看哇,可以试试看啊,我也技术不是很好

我加你也行啊

kgwei1 发表于 2018-5-31 21:51

禁止求破求QQ哦

lanyueliang 发表于 2018-6-1 11:26

感谢分享。

性感的醉人 发表于 2018-6-1 17:16


感谢分享。

168pojie 发表于 2018-6-1 18:24

谢谢分享。

harygary 发表于 2018-6-3 08:13

感谢分享
页: [1] 2
查看完整版本: 练手 160个CrakeMe程序之032