沉默的小光 发表于 2016-4-25 15:22

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 12:19

狄八哥 发表于 2016-4-27 10:47
LZ,你这些CrackMe程序都是哪里弄的啊? 给个地址练练呗!

下载地址: http://pan.baidu.com/s/1xUWOY密码: jbnq

沉默的小光 发表于 2016-4-25 15:49

黑袜子 发表于 2016-4-25 15:30
小弟好羡慕啊,啥时候有结果啊,看着教程一步一步来都会出错,郁闷到极致了。

哪一步?我可以给你详细指导。

黑袜子 发表于 2016-4-25 15:30

第五个账号 发表于 2016-4-25 15:36

我就来看看 我一点都不懂www.52wsb.com

Shiny 发表于 2016-4-25 19:12

lanyueliang 发表于 2016-4-25 20:13

向你学习哦。很佩服你哦。

沉默的小光 发表于 2016-4-25 21:29

Shiny 发表于 2016-4-25 19:12
Shiny
3784363319

好厉害,你是怎么做到的,算法是怎样的呢?

沉默的小光 发表于 2016-4-25 21:31

lanyueliang 发表于 2016-4-25 20:13
向你学习哦。很佩服你哦。

加油,你也可以的

会飞的拖拉机 发表于 2016-4-25 22:09

黑袜子 发表于 2016-4-26 17:19

页: [1] 2
查看完整版本: CrackMe160系列之023探究