CrackMe160系列之023探究
从上个月以来,我基本上一直坚持每天破解一两个crackMe,基本上都是靠找到注册机为最终目的的。今天给大家分享一下我破解第23的思路
直接进入主题吧
打开我们要破解的程序
看来唯一的提示是第三行的“Status”,输入了正确的密码后会改变
打开OD,Alt+E,找到程序模块,右键,跟随入口
进入之后直接搜索字符串
会找到第三行的提示信息,双击跟入
很快就能找到被爆破的点了,不过我们的目标是注册机,而程序中的About也明确说了不让爆破,因此继续分析
把这个模块大致浏览一遍,会发现很多窗口的API函数,像SetTimer,SetWindowText之类的,这是典型的窗口回调函数模式(还好之前有一些VC的GUI编程基础)
程序是按TIMER来检测的,在WM_TIMER下断,能直接断下来,稍微分析一下,能知道是用403167和0x10作比较,相等才算成功
在代码中查找常量403167,找到所有修改这个值的地方,最后来到这里
从这里看是对name进行一定的“加工”再和serial比较,成功就会在窗口中有所显示,
对403167的修改还来自这里(先改变403166,再把403166赋值到403167里)
这已经明示了,要使403188变量的值为值0x9112478的相反数
回到上一张图里,这是一个循环,不断改变edi,来做计算,经过分析之后,发现它的结构如下:
初始取serial的十六进制数到403188里,再对403188做操作
{
先对403188自加1
再与作异或运算
到16次时停止
}
根据这个算法写出了我们的注册机代码
#include<stdio.h>
#include<string.h>
unsigned int getIntFromChar4(char str[]);
void main()
{
int x = 0xf6eedb88;
int i;
printf("Name:\t");
char name={0};
//gets(name);
strcpy(name,"燩燩燩燩燩");
for(i=0;i<strlen(name);i++)
printf("%x ",(unsigned char)(name));
printf("\n");
/*name = 0xa0;
name = 0x50;
name = 'a';
name = 'd';
puts(name);*/
for(i=15;i>=0;i--)
{
x = x ^ getIntFromChar4(name+i);
x-=1;
printf("i:%d\t%x\n",i,x);
}
printf("%d\n",x);
}
unsigned int getIntFromChar4(char str[])
{
unsigned char a = (unsigned char)str;
unsigned char b = (unsigned char)str;
unsigned char c = (unsigned char)str;
unsigned char d = (unsigned char)str;
unsigned int e = 0;
e|=d;
e<<=8;
e|=c;
e<<=8;
e|=b;
e<<=8;
e|=a;
return e;
}
虽然算法已经找到,但是合适的name却不好找:
中间一直对403188作异或运算,如果输入普通的字母、数字的话,其ASCII码为正数
不管怎么异或都不会使403188变成负数(程序中不让输入负数)
于是我想到用汉字,试了几个汉字,它们虽然都是用两个字符的空间来存储的
而且也是负值,但是两个字节都是负值,这导致403188又变回正值了,依然不行
于是我用手动赋值NAME中的字节来看是什么汉字,再赋值成这个汉字,最后选用了“燩”,它由0xa0,0x50组成,一个正一个负,正合适
向程序里输入
成功
狄八哥 发表于 2016-4-27 10:47
LZ,你这些CrackMe程序都是哪里弄的啊? 给个地址练练呗!
下载地址: http://pan.baidu.com/s/1xUWOY密码: jbnq 黑袜子 发表于 2016-4-25 15:30
小弟好羡慕啊,啥时候有结果啊,看着教程一步一步来都会出错,郁闷到极致了。
哪一步?我可以给你详细指导。 我就来看看 我一点都不懂www.52wsb.com 向你学习哦。很佩服你哦。 Shiny 发表于 2016-4-25 19:12
Shiny
3784363319
好厉害,你是怎么做到的,算法是怎样的呢? lanyueliang 发表于 2016-4-25 20:13
向你学习哦。很佩服你哦。
加油,你也可以的
页:
[1]
2