首页
社区
课程
招聘
[原创]crackme-分析算法写算号器
发表于: 2010-6-15 14:05 4609

[原创]crackme-分析算法写算号器

2010-6-15 14:05
4609
呼~~~这个crackme用了我将近5小时,因为遇到了很多以前不懂得问题。不过写这篇帖子时我把我走的弯路都省略了。。。
点此下载
===================================程序分析=====================================
用od载入,在代码框(也许不叫代码框)中右键单击->查找->所有参考文本字串,看到这样一行:

双击进入,在上方发现了关键跳转。

在关键跳转前面的那个call上下断点,输入用户名phrain,序列号123456,点OK,然后停下来了:

同时注意到寄存器窗口:

可以确定"phrain",和"123456"是其参数。
现在F7单步进入,一路F8到这里:

注意EAX保存了"phrain"的指针。
再按F8,EAX=6,猜测为length函数,该函数与后面的三行一起,判断字符串是否为空。
接下来进入一个循环,这个循环对于像我们这样的汇编菜鸟来说很难理解,尤其是那个JGR和IMUL。

大致能明白它是将用户名串和"LANNYDIBANDINGINANAKEKHYANGNGENTOT"一起,来计算一个数存入EBX。
然后将EBX异或0x12345678,此时EBX=0x432F913C。
继续F8,到这里:

注意到"112790844"是该函数的返回值(事实上应该是指针或者引用),且112790844=0x432F913C=EBX。
可以推断这个函数是将数字转换为10进制表示的字符串。
继续F8到了这个循环:

实际上这只是将"112790844"倒序后进行字符替换而已:
  0123456789
  LANNY56465
得到的正确序列号为"YY6L54NAA"
继续F8:

很明显这是字符串比较函数。接下来的跟踪就不必要了。
===================================算法分析=====================================
算法已经比较明显了,以下是算号器代码(暂时不会win32编程):
//Dev-C++ 4.9.9.2下编译通过 
#include <cstdlib>
#include <cstdio>
using namespace std;
int main(){
    const char c[11]="LANNY56465";
    const char m[35]="LANNYDIBANDINGINANAKEKHYANGNGENTOT";
    char s[35],i;
    unsigned x;
    scanf("%s",s);
    i=-1;x=0;
    while(s[++i]){
        x=((x+s[i])<<8)|m[i];
        if(int(x)<0)x=-x;
    }
    x=x^0x12345678;
    while(x){
        printf("%c",c[x%10]);
        x/=10;
    }
    system("pause");
    return 0;
}

===================================总结=====================================
基础知识不扎实啊。。。比如说这个程序EAX和EDX都是表示函数参数的,我就是没看出来。
还有JGR和IMUL以及TEST的用法都费了我不少时间。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 121
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习了
谢谢楼主分享
2010-6-15 14:08
0
游客
登录 | 注册 方可回帖
返回
//