xiaoyu2032 发表于 2022-8-6 18:23

练习笔记之160Crackme-032

# 160CM-032

## 1. 算法分析

  首先拖入PE看一下,有UPX的壳,先把壳拖了,由于是delphi程序,用IDR打开,可以很容易的确定程序结构,找到主事件函数`437D1C`,同时可以导出map文件,以便在OD或IDA中载入,便于分析代码。主事件函数中,先判断四个密码输入框哪个有变化,然后将其数字存入指定地址中,最后再调用`437BD8`函数进行校验。



  `437BD8`函数的校验过程也不算复杂,但用IDA生成伪代码还是更方便一些。从伪代码来看,对输入的用户名,取其第1、3、4、5个字符,以字符的ASCII码值除以10,得到的数字(大于10取十位数的数字)与密码进行比较,全部一致则使OK按钮可用。



  使用vs2015编写VC注册机程序如下:

```cpp
#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>
#include <math.h>

int _tmain(int argc, _TCHAR* argv[])
{
        char name;
        int code;
        char temp;
        int i;
        printf("请输入用户名(长度5~20):");
        scanf_s("%s", name, 20);

        if (strlen(name) < 5)
        {
                printf("输入的字符串长度小于5\n");
        }
        else
        {
                code = *(BYTE *)name / 10;
                code = *(BYTE *)(name + 2) / 10;
                code = *(BYTE *)(name + 3) / 10;
                code = *(BYTE *)(name + 4) / 10;
                i = 0;
                do
                {
                        _itoa_s(code, temp, 10);
                        if (strlen(temp) != 1)
                        {
                                code = code/10;
                        }
                        i++;
                } while (i != 4);
                printf("序列号为:%d %d %d %d\n", code, code, code, code);
        }
        system("pause");
        return 0;
}
```

  运行注册机程序,输入用户名`ad18A`,可得密码为`9456`,输入程序输入框,验证正确。



## 2. 总结

  这道题也不算难,借助IDR、IDA、OD三个软件,分析起来还是比较顺利的。

liyu0828 发表于 2022-8-6 18:53

一直学不会哈哈

cc0207 发表于 2022-8-6 18:58

好教程。学习下:lol

xtkj4382 发表于 2022-8-6 19:08

hf123qwe 发表于 2022-8-7 12:45

谢谢分享,学习了。{:1_893:}一定支持的

foxfoxfoxfox 发表于 2022-8-7 14:52

好厉害,过来学习一下。

yuanting 发表于 2022-8-7 17:19

厉害厉害

戰龍在野 发表于 2022-8-7 19:49

谢谢提供分享,一定支持的

howchi 发表于 2022-8-7 23:52


谢谢分享,学习了。

RomanceBin 发表于 2022-8-8 22:06

好教程。学习下
页: [1] 2
查看完整版本: 练习笔记之160Crackme-032