逆向学习crackme160题-016-fty_crkme3 的 weite up

简介: 逆向学习crackme160题-016-fty_crkme3 的 weite up

016-fty_crkme3 的 weite up

1. 程序的执行

2. 查壳

有壳脱壳

3. 分析

将程序拖入OD的时候,右键智能搜索字符串,滑到最下面,然后找到关键的提示字符串,如下图:

双击进入跟踪,可以看到一根跳转的红线,有很多的跳转都来到了这里,如下图:

所以我们可以学一个新的技能就是右键地址处,加标签,加完标签后地址就会变红色字体如图:

所以我们就可以看到这些跳转都会显示<错误处>,而不是一个地址,便于分析,这是一个小技巧,如下图:

然后我们往上滑就可以看到函数的入口点,我们下断点然后运行到这里开始正式分析,如下图:

解释:上图划线分成了三部分。第一部分是堆栈平衡,第二部分主要是判断输入的是否为空,第三部分主要就是确用户数输入的只能是0-9的数字或者是字符“-”。

继续往下单步执行分析如下图:

解释:上图划线也分成了三部分。第一部分:判定输入字符串长度必须在0x9~0xB之间,然后后面的算法计算大概意思差不多,所以我们后面只用字符串长度为0x9时举例。第二部分:当字符串长度为0x9时,第三个字符和第七个字符必须为“-”,否则直接跳转到错误处。第三部分,后面很大一块就是将字符串中的的数字提取出来拼接成一串纯数字。

继续往下分析如下图:

解释:这就是加密算法的主要部分了,主要的流程就是把输入正确长度的字符串进行纯数字的提取,将这些纯数字字符串以十六进制保存在esi中,然后依次把这些纯数字取单个进行七次方的运算,每次得到的运算结果都要累加起来,最后储存在edi中。

最后的关键跳如下图,就是对比esi和edi中的结果,如果相同则正确:

4. 注册机的编写

//me 写的小白程序

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

void generatekey();
main()
{
  generatekey();
  system("pause");
  return 0;
}
void generatekey()
{
  char arr[10]={ '0','1','2','3','4','5','6','7','8','9' };
  char key[10] = { 0 };
  char serialkey[10] = { 0 };
  int serial = 0;
  int edi = 0;
  int length = 10;
  int ar = 0;
  for (int i = 0; i < 10; i++)
  {
    for (int j = 0; j < 10; j++)
    {
      for (int n = 0; n < length; n++)
      {
        for (int m = 0; m < length; m++)
        {
          for (int a = 0; a < length; a++)
          {
            for (int b = 0; b < length; b++)
            {
              for (int c = 0; c < length; c++)
              {
                key[0] = arr[i];
                key[1] = arr[j];
                key[2] = arr[n];
                key[3] = arr[m];
                key[4] = arr[a];
                key[5] = arr[b];
                key[6] = arr[c];
                for (int d = 0; d < 7; d++)
                {
                  char str = { 0 };
                  str = key[d] - '0';
                  //ar = pow(a, 7);//pow()是双精度的次方运算,在这里不可用
                  edi = edi + (str * str * str * str * str * str * str);//计算次方的函数
                }
                serial = atoi(key);//将字符串转化为十进制数
                if (serial == edi)
                {
                  serialkey[0] = arr[i];
                  serialkey[1] = arr[j];
                  serialkey[2] = '-';
                  serialkey[3] = arr[n];
                  serialkey[4] = arr[m];
                  serialkey[5] = arr[a];
                  serialkey[6] = '-';
                  serialkey[7] = arr[b];
                  serialkey[8] = arr[c];
                  printf("serialkey: %s\n", serialkey);
                }
          
              }
            }
          }
        }
      }
    }
  }
  return 0;
}

//极安御信写的

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <Windows.h>

int main()
{
    for (int i = 1000000; i < 9999999; i++)
    {
        int sum = 0;
        char tmp[8] = { 0 };
        _itoa(i, tmp, 10);

        for (int j = 0; j < 7; j++) sum += pow(tmp[j] - '0', 7);
        if (i == sum)std::cout << i << std::endl;
    }
}


相关文章
|
存储 缓存 固态存储
时序数据库 InfluxDB(四)
时序数据库 InfluxDB(四)
332 1
|
缓存 关系型数据库 MySQL
MySQL并发支撑底层Buffer Pool机制详解
【10月更文挑战第18天】在数据库系统中,磁盘IO操作是性能瓶颈之一。为了提高数据访问速度,减少磁盘IO,MySQL引入了缓存机制。其中,Buffer Pool是InnoDB存储引擎中用于缓存磁盘上的数据页和索引页的内存区域。通过缓存频繁访问的数据和索引,Buffer Pool能够显著提高数据库的读写性能。
540 2
|
9月前
|
存储 Linux
linux中的目录操作函数
本文详细介绍了Linux系统编程中常用的目录操作函数,包括创建目录、删除目录、读取目录内容、遍历目录树以及获取和修改目录属性。这些函数是进行文件系统操作的基础,通过示例代码展示了其具体用法。希望本文能帮助您更好地理解和应用这些目录操作函数,提高系统编程的效率和能力。
348 26
|
Java 大数据 API
别死脑筋,赶紧学起来!Java之Steam() API 常用方法使用,让开发简单起来!
分享Java Stream API的常用方法,让开发更简单。涵盖filter、map、sorted等操作,提高代码效率与可读性。关注公众号,了解更多技术内容。
501 5
|
网络协议 安全 网络安全
Android Termux安装SSH结合内网穿透实现远程SFTP文件传输
Android Termux安装SSH结合内网穿透实现远程SFTP文件传输
|
监控 搜索推荐 数据挖掘
ERP系统中的客户关系管理与客户满意度调查解析
【7月更文挑战第25天】 ERP系统中的客户关系管理与客户满意度调查解析
725 1
|
存储 缓存 程序员
C++一分钟之-缓存行与伪共享问题
【7月更文挑战第11天】在计算机科学中,缓存是一个至关重要的概念,它能够显著提高数据访问速度。然而,缓存的使用并非没有问题,其中最著名的问题之一就是伪共享。
160 1
|
存储 安全 网络安全
网络安全威胁——计算机病毒
网络安全威胁——计算机病毒
|
JSON Java fastjson
|
Prometheus 监控 Kubernetes
(二)ACK prometheus-operator之 配置自定义组件监控
使用ack-prometheus-operator 在阿里云ACK专有版集群里,默认未采集 etcd / scheduler/ kcm/ccm/kube-proxy等管理组件的监控数据,需要手动配置证书、采集等配置。本文目的在于解决由于不正确的配置带来的监控异常,也顺便扫盲“更新Prometheus Server的配置prometheus.yml&quot;这几个词在operator体系中的具体配置步骤。
1981 0
(二)ACK prometheus-operator之 配置自定义组件监控