好友
阅读权限25
听众
最后登录1970-1-1
|
本帖最后由 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
[Asm] 纯文本查看 复制代码 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:[0x43A728]
00437CD0 8B80 E0010000 mov eax,dword ptr ds:[eax+0x1E0]
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:[0x43A728]
00437CE4 8B80 E0010000 mov eax,dword ptr ds:[eax+0x1E0]
00437CEA 33D2 xor edx,edx ; ntdll.KiFastSystemCallRet[/size]
[size=5]
关键跳转处修改标志位直接暴力破解掉。。
五、注册机探究
只剩下4个事件了,妥妥的关键地方在共用的那个call
[Asm] 纯文本查看 复制代码 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:[eax]
00437BEC 64:8920 mov dword ptr fs:[eax],esp
00437BEF 8D55 FC lea edx,dword ptr ss:[ebp-0x4]
00437BF2 A1 28A74300 mov eax,dword ptr ds:[0x43A728]
00437BF7 8B80 0C020000 mov eax,dword ptr ds:[eax+0x20C]
00437BFD E8 BE55FEFF call 1.0041D1C0 ; 压入用户名
00437C02 8B45 FC mov eax,dword ptr ss:[ebp-0x4]
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:[ebp-0x4]
00437C16 0FB600 movzx eax,byte ptr ds:[eax] ; 用户名第1个
00437C19 B9 0A000000 mov ecx,0xA
00437C1E 99 cdq
00437C1F F7F9 idiv ecx ; 除以A
00437C21 A3 2CA74300 mov dword ptr ds:[0x43A72C],eax
00437C26 8B45 FC mov eax,dword ptr ss:[ebp-0x4]
00437C29 0FB640 02 movzx eax,byte ptr ds:[eax+0x2] ; 用户名第3个
00437C2D B9 0A000000 mov ecx,0xA
00437C32 99 cdq
00437C33 F7F9 idiv ecx ; 除以A
00437C35 A3 30A74300 mov dword ptr ds:[0x43A730],eax
00437C3A 8B45 FC mov eax,dword ptr ss:[ebp-0x4]
00437C3D 0FB640 03 movzx eax,byte ptr ds:[eax+0x3] ; 用户名第4个
00437C41 B9 0A000000 mov ecx,0xA
00437C46 99 cdq
00437C47 F7F9 idiv ecx ; 除以A
00437C49 A3 34A74300 mov dword ptr ds:[0x43A734],eax
00437C4E 8B45 FC mov eax,dword ptr ss:[ebp-0x4]
00437C51 0FB640 04 movzx eax,byte ptr ds:[eax+0x4] ; 用户名第5个
00437C55 B9 0A000000 mov ecx,0xA
00437C5A 99 cdq
00437C5B F7F9 idiv ecx ; 除以A
00437C5D A3 38A74300 mov dword ptr ds:[0x43A738],eax
00437C62 BE 01000000 mov esi,0x1
00437C67 BB 2CA74300 mov ebx,1.0043A72C
00437C6C 8D55 F8 lea edx,dword ptr ss:[ebp-0x8]
00437C6F 8B03 mov eax,dword ptr ds:[ebx]
00437C71 E8 8AECFCFF call 1.00406900
00437C76 8B45 F8 mov eax,dword ptr ss:[ebp-0x8] ; 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:[ebx]
00437C83 B9 0A000000 mov ecx,0xA
00437C88 99 cdq
00437C89 F7F9 idiv ecx ; 除以A
00437C8B 8903 mov dword ptr ds:[ebx],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:[edx]
00437CA7 3B08 cmp ecx,dword ptr ds:[eax]
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到全局变量的变化,感觉有点烦···(一开始我便是),程序分别取了用户名的第一 ,第三 ,第四,第五位分别进行了 除以 0xA 操作,
至于序列号如果上述的操作结果还是两位数,就再进行一次除以 0xA 操作,这操作后的4位个数就是序列号
(程序序列号点小按钮最多加到9 ,也可以提供分析思路···)
[C] 纯文本查看 复制代码 #include<stdio.h>
#include<string.h>
#include<iostream>
int main()
{
int b;
int key[4]={0};
char name[20]={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[0]=name[0]/10;
if(key[0]>9) key[0]=key[0]/10;
key[1]=name[2]/10;
if(key[1]>9) key[1]=key[1]/10;
key[2]=name[3]/10;
if(key[2]>9) key[2]=key[2]/10;
key[3]=name[4]/10;
if(key[3]>9) key[3]=key[3]/10;
}
printf("This key is :");
for(int i=0;i<4;i++)
{
printf("%d",key[i]);
}
printf("\n");
system("pause");
return 0;
}
CrakeMe :
genocide1.zip
(114.07 KB, 下载次数: 7)
如有错误请大佬指出,小生不胜感激!!
|
免费评分
-
查看全部评分
|