新160个crackme - 087-d4ph1-crackme2

运行分析

在这里插入图片描述

  • 需破解Name和Serial

PE分析

在这里插入图片描述

  • ASM程序,32位,无壳

静态分析&动态调试

在这里插入图片描述

  • ida找到关键字符串

INT_PTR __stdcall DialogFunc(HWND hDlg, UINT a2, WPARAM a3, LPARAM a4)
{
  HICON IconA; // eax
  int v5; // edi
  unsigned int v6; // ebx
  char v7; // al
  int v8; // ecx
  char v9; // al
  int v10; // ecx
  int v11; // ecx
  int v12; // eax
  int v13; // ebx
  int v14; // edi
  int v15; // esi
  int v16; // ebp
  int v17; // ebx
  int v18; // esi
  unsigned int v19; // ecx
  unsigned int v20; // edx
  unsigned int v21; // eax
  int v22; // ecx
  int v23; // esi
  int v24; // edx
  char v25; // al
  int v26; // esi
  char v27; // al
  char Name_i; // [esp-Ch] [ebp-Ch]
  unsigned int v30; // [esp-8h] [ebp-8h]
  unsigned int Name_len; // [esp-4h] [ebp-4h]

  switch ( a2 )
  {
    case 0x110u:
      GetDlgItem(hDlg, 1002);
      GetDlgItem(hDlg, 1003);
      IconA = LoadIconA(hInstance, (LPCSTR)0x68);
      SendMessageA(hDlg, 0x80u, 0, (LPARAM)IconA);
      break;
    case 0x10u:
      SendMessageA(hDlg, 0x111u, 0x3EEu, 0);
      break;
    case 0x111u:
      switch ( (_WORD)a3 )
      {
        case 0x3EE:
          PostQuitMessage(0);
          break;
        case 0x3EF:
          MessageBoxA(0, Text, Caption, 0x40u);
          break;
        case 0x3ED:
          Name_len = SendDlgItemMessageA(hDlg, 1002, 0xDu, 0x40u, (LPARAM)Name);
          sub_401032();
          Name_len_ = Name_len;
          if ( Name_len <= 4 )
          {
            if ( !Name_len )
            {
              MessageBoxA(0, aNoNameDetected, Caption, 0x10u);
              return 1;
            }
          }
          else if ( Name_len < 33 )             // Name长度小于33
          {
            v5 = 0;
            v6 = 2 * Name_len_;
            do                                  // 循环1:将Name[i]//16和Name[i]%16的数拼接得到Name_encode_1,若得到结果不是数字则+7
            {
              Name_i = Name[v5];
              v7 = plus_0_or_7((unsigned __int16)Name_i / 16u);
              Name_encode_1[v8] = v7;
              v9 = plus_0_or_7((unsigned __int16)Name_i % 16u);
              Name_encode_1[v10] = v9;
              ++v5;
            }
            while ( v10 + 1 < v6 );
            v11 = 0;
            v12 = 0;
            v13 = 0;
            v14 = 0;
            v15 = 1;
            v16 = 0;
            n = 0;
            do                                  // 循环2:对Name_encode_1进行计算取得Name_encode_2
            {
              LOBYTE(v12) = Name_encode_1[v16 + v11];
              LOBYTE(v13) = Name_encode_1_1[v16 + v11];
              if ( v12 == v13 )
              {
                ++v15;
                ++n;
                ++v16;
                if ( n != 1 )
                {
                  v14 -= 2;
                  ++v15;
                }
              }
              else
              {
                if ( (unsigned __int8)n > 1u )
                  v14 -= 2;
                n = 0;
                v15 = 1;
              }
              *(_WORD *)((char *)&Name_encode_2 + v14) = ((_WORD)v12 << 8) + v15;
              v14 += 2;
              ++v11;
            }
            while ( Name_encode_1[v16 + v11] );
            sub_401097();
            SendDlgItemMessageA(hDlg, 1003, 0xDu, 0x40u, (LPARAM)Serial);
            HIWORD(v17) = 0;
            v18 = 1;
            v19 = 1;
            do                                  // 循环3:提取Name和Name_encode_2进行计算,得到Name_encode_3
            {
              LOWORD(v17) = *(_WORD *)(v18 + 0x40321B);// 提取Name_encode_1
              v20 = (v17 + *(char *)(v19 + 0x403157) - v19) % v19;
              v21 = (v17 + *(char *)(v19 + 0x403157) - v19) / v19 - Name_len_4;
              v17 += v19;
              Name_encode_3[v19] = v17 ^ (v20 + v21);
              if ( ++v18 >= Name_len_4 )
                v18 = 1;
              ++v19;
            }
            while ( v19 <= Name_len_ );
            v22 = 0;
            v23 = 0;
            v24 = 2 * Name_len_;
            do                                  // 循环4:提取通过Name_encode_3每一位进行计算,得到Name_encode
            {
              v30 = Name_encode_3_1[v22];
              v25 = ((v30 >> 4) & 0xF) + 48;
              if ( v25 > 57 )
                v25 = ((v30 >> 4) & 0xF) + 55;
              Name_encode[v23] = v25;
              v26 = v23 + 1;
              v27 = (v30 & 0xF) + 48;
              if ( v27 > 57 )
                v27 = (v30 & 0xF) + 55;
              ++v22;
              Name_encode[v26] = v27;
              v23 = v26 + 1;
            }
            while ( v23 != v24 );
            if ( (unsigned __int8)cmp(0) )      // 比较Name_encode和Serial是否相等
              MessageBoxA(0, aTheSerialYouEn, Caption, 0x10u);
            else
              MessageBoxA(0, aWowYouDidItNow, aCrackedSuccess, 0x30u);// 成功
            return 1;
          }
          MessageBoxA(0, aNameIsNotValid, Caption, 0x10u);
          break;
      }
      break;
    default:
      return 0;
  }
  return 1;
}
  • 进行动调调试,注释如上,一共4个循环计算,得到Name_encode,最后Name_encode需要等于Serial

算法分析

Name = 'concealbear'

# 第一个循环
def plus_0_or_7(a1):
    result = (a1 & 0xF) + 0x30
    if (result > 0x39):
        result += 7;
    return result;

Name_encode_1 = []
for i in range(len(Name)):
    Name_encode_1.append(plus_0_or_7(ord(Name[i]) // 16))
    Name_encode_1.append(plus_0_or_7(ord(Name[i]) % 16))
Name_encode_1.append(0)

# 第二个循环
Name_encode_2 = [0] * len(Name_encode_1) * 2
v11 = 0;
v12 = 0;
v13 = 0;
v14 = 0;
v15 = 1;
v16 = 0;
n = 0;
for i in range(0,10000):
  v12 = Name_encode_1[v16 + v11];
  v13 = Name_encode_1[v16 + v11 + 1];

  if ( v12 == v13 ):
    ++v15;
    ++n;
    ++v16;
    if ( n != 1 ):
      v14 -= 2;
      ++v15;
  else:
    if ( n > 1):
      v14 -= 2;
    n = 0;
    v15 = 1;
  Name_encode_2[v14] = int(hex((v12 << 8) + v15)[4:],16);
  Name_encode_2[v14 + 1] = int(hex((v12 << 8) + v15)[2:4],16);
  v14 += 2;
  v11 += 1
  if v13:
      pass
  else:
      break


# 循环3
Name_encode_3 = [0] * len(Name) * 2
v18 = 1;
v19 = 1;
for v19 in range(1,len(Name) + 1):
    v17 = int(hex(Name_encode_2[v18])[2:].zfill(2) + hex(Name_encode_2[v18-1])[2:].zfill(2),16);
    v20 = (v17 + ord(Name[v19-1]) - v19) % v19;
    v21 = (v17 + ord(Name[v19-1]) - v19) // v19 - (len(Name) * 4);
    v17 += v19;
    Name_encode_3[v19] = (v17 ^ (v20 + v21))&0xff;
    v18 += 1
    if ( v18 >= (len(Name) * 4) ):
        v18 = 1;

# 循环4
Name_encode = [0] * len(Name) * 2
v22 = 0;
v23 = 0;
for v22 in range(len(Name)):
    v30 = Name_encode_3[v22+1];
    v25 = ((v30 >> 4) & 0xF) + 48;
    if ( v25 > 57 ):
        v25 = ((v30 >> 4) & 0xF) + 55;
    Name_encode[v23] = v25;
    v26 = v23 + 1;
    v27 = (v30 & 0xF) + 48;
    if ( v27 > 57 ):
        v27 = (v30 & 0xF) + 55;
    Name_encode[v26] = v27;
    v23 = v26 + 1;

Serial = "".join([chr(i)for i in Name_encode])

print(Name + '的Serial为:\n' + Serial)

在这里插入图片描述
在这里插入图片描述

  • 验证成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/904566.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 303.区域和检索-数组不可变

1.题目要求: 2.题目代码: class NumArray { public:vector<int> array;NumArray(vector<int>& nums) {array nums;}int sumRange(int left, int right) {int sum 0;while(left < right){sum array[left];left;}return sum;} };/*** Your NumArray obje…

【SVM手把手推导】对偶问题应用之支持向量机SVM(Hard Margin)

1. 对偶问题应用之支持向量机SVM 1.1 SVM 设给定数据集&#xff1a; { ( s i , y i ) : y i ∈ { 1 , − 1 } , i 1 , ⋯ , m } \{(\mathbf{s}^i,y^i):y^i\in\{1,-1\},i1,\cdots,m\} {(si,yi):yi∈{1,−1},i1,⋯,m}&#xff0c;我们想要找到一个决策超平面&#xff08;decis…

大数据技术的前景如何?

在当今数字化迅猛发展的时代&#xff0c;大数据技术的前景显得尤为广阔。随着数据量的激增&#xff0c;如何有效利用这些数据成为了各行各业关注的焦点。未来五年&#xff0c;大数据技术的发展趋势可以从市场规模、技术融合、行业应用和政策支持等多个方面进行深入分析。 1. 市…

【STM32】单片机ADC原理详解及应用编程

本篇文章主要详细讲述单片机的ADC原理和编程应用&#xff0c;希望我的分享对你有所帮助&#xff01; 目录 一、STM32ADC概述 1、ADC&#xff08;Analog-to-Digital Converter&#xff0c;模数转换器&#xff09; 2、STM32工作原理 二、STM32ADC编程实战 &#xff08;一&am…

推荐一款全新的视频编辑软件:CapCut剪映国际版

CapCut是一款全新的视频编辑应用程序&#xff0c;提供了各种功能和工具&#xff0c;让用户可以轻松地创建专业级别的视频。这款应用程序非常易于使用&#xff0c;功能强大&#xff0c;可供任何水平的用户使用。 CapCut包含了各种视频编辑工具&#xff0c;可以添加各种特效、滤镜…

提升用户体验优化全攻略

内容概要 用户体验&#xff08;UX&#xff09;在当今数字化时代扮演着举足轻重的角色。良好的用户体验不仅决定了用户对产品的满意度&#xff0c;还有助于提高转化率与客户忠诚度。因此&#xff0c;深入理解用户体验的重要性是每一个设计师和产品经理必须掌握的基础。在这一部…

关于springboot跨域与拦截器的问题

今天写代码的时候遇到的一个问题&#xff0c;在添加自己设置的token拦截器之后&#xff0c;报错&#xff1a; “ERROR Network Error AxiosError: Network Error at XMLHttpRequest.handleError (webpack-internal:///./node_modules/axios/lib/adapters/xhr.js:112:14) at Axi…

SDK和API

什么是SDK&#xff1f; SDK就像是一个超级工具箱&#xff0c;里面装满了各种工具、说明书和配件&#xff0c;帮你快速、方便地完成一项工作。比如&#xff0c;你要搭建一个乐高模型&#xff0c;SDK就是那个包含了所有乐高积木、拼装图纸、甚至一些特殊工具的大盒子。 什么是A…

【错误描述:“L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误”】

解决办法&#xff1a; 一、检查并更改网络协议 &#xff08;如果网络协议更改完成&#xff0c;还是链接失败&#xff0c;直接看 第二点&#xff09; 1、打开网络和Internet 设置 2、找到更改适配器选项 3、先择你要链接VPN&#xff0c;右键选择属性&#xff0c;之后选择安…

【网络】2.TCP通信

TCP通信 server1. 创建套接字2. 填充套接字3. 将套接字和监听文件描述符绑定4. 将_listensock设置为监听状态5. 启动服务器accept()函数read()函数 Server启动client1. 创建套接字2. 填充套接字connect()函数 3. 通过文件描述符向服务端发送信息 client启动 server server的启…

【ArcGISPro】宣布推出适用于 ArcGIS 的 AI 助手

此次分享了ESRI正在开发新的“AI 助手”来扩展ArcGIS应用程序&#xff0c;并且使用经过专门培训、提示工程和 LLM的“AI 助手”为这些应用程序提供特定技能。并且以视频的方式展示了如何使用生成式 AI 在ArcGIS应用程序中自动化和加速工作流。最后表示这些 “AI 助手”将在 202…

Ansible基本使用

目录 介绍 安装 inventory-主机清单 分组 子组 modules-模块 command shell script file copy systemd yum get_url yum_repository user mount cron 介绍 ansible是基于python开发的自动化运维工具。架构相对比较简单&#xff0c;仅需通过ssh连接客户机执行…

volatile如何保证可见性和禁止指令重排序?

当线程对volatile修饰的变量进行写操作时&#xff0c;JMM会插入一个写屏障&#xff0c;会强制的将本地内存中的数据写到主内存中 当线程对volatile修饰的变量进行读操作时&#xff0c;JMM会插入一个读屏障&#xff0c;会强制的让本地内存中数据失效&#xff0c;重新到主内存中读…

AUTOSAR_EXP_ARAComAPI的6章笔记(4)

☞返回总目录 相关总结&#xff1a;《AUTOSAR 自适应应用中原始数据流传输的使用方法》总结 6.4 原始数据流传输的使用方法 本章描述了原始数据流&#xff08;RawDataStreams&#xff09;在 AUTOSAR 自适应应用程序中的使用方法。 目前&#xff0c;原始数据流传输在单播 / …

input子系统的框架和重要数据结构详解

#1024程序员节 | 征文# 往期内容 I2C子系统专栏&#xff1a; 专栏地址&#xff1a;IIC子系统_憧憬一下的博客-CSDN博客具体芯片的IIC控制器驱动程序分析&#xff1a;i2c-imx.c-CSDN博客 – 末篇&#xff0c;有往期内容观看顺序 总线和设备树专栏&#xff1a; 专栏地址&#…

【Linux:网络基础】

网络协议&#xff1a; 协议实际上可以称为一种“约定”&#xff0c;通过网络通信中的数据约定&#xff0c;不同主机必须遵循相同的网络协议才可以实现通信。 协议即为通信双方都认识的结构化的数据类型 协议分层 协议的本质也是软件&#xff0c;在设计上为了更好的进行模块…

C++刷怪笼(9)继承

目录 1.前言 2.正文 2.1继承的概念和定义 2.1.1继承的概念 2.1.2继承的定义 ​编辑 2.1.3继承类模板 2.2基类和派生类间的转换 2.3继承中的作用域 2.3.1隐藏规则 2.4派⽣类的默认成员函数 2.4.1个常⻅默认成员函数 2.4.2实现⼀个不能被继承的类 2.5继承与友元 2.…

QT中使用图表之QChart概述

在Qt中使用QChart类可以快速绘制一个图表出来&#xff0c;比如折线图、饼图、柱状图等 QChart类用来管理图表中的图形、图例、轴等 QChartView是专门用来显示图表的类&#xff0c;相当于一个QWidget或者窗口&#xff0c;用来显示QChart 即总的步骤就是 1、创建QChartView的…

codeforces _ 补题

C. Ball in Berland 传送门&#xff1a;Problem - C - Codeforces 题意&#xff1a; 思路&#xff1a;容斥原理 考虑 第 i 对情侣组合 &#xff0c;男生为 a &#xff0c;女生为 b &#xff0c;那么考虑与之匹配的情侣 必须没有 a | b &#xff0c;一共有 k 对情侣&#x…

零基础学西班牙语,柯桥专业小语种培训泓畅学校

No te comas el coco, seguro que te ha salido bien la entrevista. Ya te llamarn. 别瞎想了&#xff01;我保证你的面试很顺利。他们会给你打电话的。 这里的椰子是"头"的比喻。在西班牙的口语中&#xff0c;我们也可以听到其他同义表达&#xff0c;比如&#x…