First crackMe
Lixu
2020年2月1日 20:57:22
这是来自《看雪》的一个crack,小弟也是一个菜鸟,第一次做Crack的详细分析,还望大佬批评指点,
工具:OD,peid
1. 使用peid进行查壳
很显然是vc6编写的一个crackme,没壳直接进OD
2. 拖进OD
前面都是一些预处理,向下滑很快找到主函数的入口403C2E,
进入之后可以看到几个常见的API函数,很容易找到获取文本框句柄的函数GetDlgItem和对话框MessageBox,很显然,在获取文本框内句柄后进行了一些处理,所以推测401081处所执行的call就是我们所找的主要call
下面分析这个call,分析结果如注释;
获取第一个文本框文本后进行算法加密后,在第二次获取第二个文本框的内容和第一次的计算结果进行比较,最后决定提示框的内容。
算法一:进行右移,左移,或运算
算法二;进行左移,右移,或运算
但值得注意的是因为windows是小端存储模式,所以在写注册机的时候需要进行大小端转逆,在程序中比较的时候因为都是小端模式,所以不用管。
请输入Name(大于等于3,小于等于35):yanmeng
Serial:ae388d0ea3e7df5fe0e0b80c548c4b07
Press any key to continue
注册机代码:仅供参考,希望大佬指点
#include "stdafx.h"
#include "string.h"
#include <stdlib.h>
void main()
{ unsigned long a,b,c,d;
unsigned long sn1,sn2,sn3,sn4;
char serial1[9],serial2[9],serial3[9],serial4[9];
int len,num=0;
char str[50];
printf("请输入Name(大于等于3,小于等于35):");
scanf("%s",str);
len=strlen(str);
for (int i=0;i<len;i++)
num+=str[i];
a=(num*0x10325476)^(num*0x67452301);
b=num*0x10325476;
c=(num-0x10325477)^(num*0x67452301);
d=num*0x67452301;
a=(a>>0x1B)|(a<<0x5);
b=b<<0x1;
c=(c<<0x13)|(c>>0xD);
d=(d>>0xf)|(d<<0x11);
sn1=(a<<0x18)|(a<<0x8&0xff0000)|(a>>0x8&0xff00)|(a>>0x18&0xff);
sn2=(d<<0x18)|(d<<0x8&0xff0000)|(d>>0x8&0xff00)|(d>>0x18&0xff);
sn3=(c<<0x18)|(c<<0x8&0xff0000)|(c>>0x8&0xff00)|(c>>0x18&0xff);
sn4=(b<<0x18)|(b<<0x8&0xff0000)|(b>>0x8&0xff00)|(b>>0x18&0xff);
ltoa(sn1,serial1,16);
ltoa(sn2,serial2,16);
ltoa(sn3,serial3,16);
ltoa(sn4,serial4,16);
printf("Serial:%s%s%s%s",serial1,serial2,serial3,serial4);
printf("\n");
getchar();
}