新160个crackme - 014-Splish

news2025/2/24 12:09:53

运行分析

在这里插入图片描述

  • 需要破解Hard Coded和Name+Serial

PE分析

在这里插入图片描述

  • ASM程序,32位,无壳

静态分析&动态调试

Hard Coded

在这里插入图片描述

  • ida发现关键字符串,进入Hard Code函数

LRESULT __stdcall sub_401178(HWND hWndParent, UINT Msg, WPARAM wParam, LPARAM lParam)
{
  const char *v4; // eax
  CHAR *i; // ebx

  switch ( Msg )
  {
    case 2u:
      PostQuitMessage(0);
      break;
    case 1u:
      CreateWindowExA(0, aStatic, aHardCoded, 0x50000080u, 10, 2, 100, 25, hWndParent, (HMENU)6, hInstance, 0);
      CreateWindowExA(0, aStatic, aName, 0x50000080u, 10, 65, 100, 25, hWndParent, (HMENU)7, hInstance, 0);
      CreateWindowExA(0, aStatic, aSerial, 0x50000080u, 10, 105, 100, 25, hWndParent, (HMENU)7, hInstance, 0);
      hWnd = CreateWindowExA(0x200u, aEdit, 0, 0x50800080u, 101, 0, 175, 25, hWndParent, (HMENU)3, hInstance, 0);
      dword_403494 = CreateWindowExA(
                       0x200u,
                       aEdit,
                       0,
                       0x50800080u,
                       101,
                       60,
                       175,
                       25,
                       hWndParent,
                       (HMENU)4,
                       hInstance,
                       0);
      dword_403498 = CreateWindowExA(
                       0x200u,
                       aEdit,
                       0,
                       0x50800080u,
                       101,
                       100,
                       175,
                       25,
                       hWndParent,
                       (HMENU)5,
                       hInstance,
                       0);
      SetFocus(hWnd);
      dword_403488 = (int)CreateWindowExA(
                            0,
                            aButton,
                            aCheckHardcoded,
                            0x50000001u,
                            75,
                            30,
                            140,
                            25,
                            hWndParent,
                            (HMENU)1,
                            hInstance,
                            0);
      dword_40348C = (int)CreateWindowExA(
                            0,
                            aButton,
                            aNameSerialChec,
                            0x50000001u,
                            75,
                            130,
                            140,
                            25,
                            hWndParent,
                            (HMENU)2,
                            hInstance,
                            0);
      break;
    case 0x111u:
      if ( (_WORD)wParam == 1 )                 // 第一个按钮
      {
        if ( !HIWORD(wParam) )
        {
          GetWindowTextA(hWnd, String, 32);     // 获得Hard Code
          v4 = "HardCoded";
          for ( i = String; ; ++i )
          {
            if ( !*v4 )
            {
              MessageBoxA(0, "Congratulations, you got the hard coded serial", Caption, 0);
              return 0;
            }
            if ( *v4 != *i )                    // Hard Code = "HardCoded"
              break;
            ++v4;
          }
          MessageBoxA(0, aSorryPleaseTry, Caption, 0);
        }
      }
      else if ( (_WORD)wParam == 2 )            // 第二个按钮
      {
        if ( !HIWORD(wParam) )
          sub_4015E4(dword_403494, dword_403498);// Name和Serial函数
      }
      else if ( wParam == 1000 )
      {
        SendMessageA(hWndParent, 0x112u, 0xF060u, 0);
      }
      else if ( wParam == 1100 )
      {
        MessageBoxA(0, aYourMissionIsT, Caption, 0);
      }
      break;
    default:
      return DefWindowProcA(hWndParent, Msg, wParam, lParam);
  }
  return 0;
}
  • Hard Coded明文出现了,为HardCoded

在这里插入图片描述


Name & Serial

  • 通过sub_4015E4(dword_403494, dword_403498);进入Name和Serial判断函数

int __stdcall sub_4015E4(HWND a1, HWND hWnd)
{
  int WindowTextA; // eax
  int v3; // eax
  int v4; // ebx
  int v5; // edx
  int v6; // ebx
  int i; // ebx

  WindowTextA = GetWindowTextA(hWnd, Serial, 32);
  if ( !WindowTextA )
    return MessageBoxA(0, aPleaseEnterYou_0, Caption, 0);// 弹窗'Please enter your serial number.'
  dword_403467 = WindowTextA;
  v3 = GetWindowTextA(a1, Name, 11);            // Name最大取11位
  if ( !v3 )
    return MessageBoxA(0, aPleaseEnterYou, Caption, 0);// 弹窗'Please enter your name.'
  Name_length = v3;
  v4 = 0;
  do
  {
    v5 = (v4 ^ (Name[v4] % 10)) + 2;
    if ( (char)v5 >= 10 )
      LOBYTE(v5) = (v4 ^ (Name[v4] % 10)) - 8;
    res_Name[v4++] = v5;
  }
  while ( v4 != Name_length );                  // 通过上述计算得到res_Name
  v6 = 0;
  do
  {
    res_Serial[v6] = Serial[v6] % 10;
    ++v6;
  }
  while ( v6 != dword_403467 );                 // 通过上述计算得到res_Serial
  for ( i = 0; ; ++i )
  {
    if ( i == Name_length )
      return MessageBoxA(0, aGoodJobNowKeyg, Caption, 0);// 弹窗'Good job, now keygen it.'
    if ( res_Name[i] != res_Serial[i] )         // 若res_Name == res_Serial,则弹出上面弹窗
      break;
  }
  return MessageBoxA(0, aSorryPleaseTry, Caption, 0);// 弹窗'Sorry, please try again.'
}
  • 通过一系列计算得到res_Name和res_Serial
  • 若res_Name == res_Serial,则弹窗破解成功

算法分析

Name = 'concealbear'
Serial = ''
res_Name = []
res_Serial = []

# 通过Name计算res_Name
for v4 in range(len(Name)):
    v5 = (v4 ^ (ord(Name[v4]) % 10)) + 2
    if (v5 >= 10):
        v5 = (v4 ^ (ord(Name[v4]) % 10)) - 8
    res_Name.append(v5)

# 逆向计算Serial
res_Serial = res_Name
for i in range(len(res_Serial)):
    res_Serial[i] = res_Serial[i] + 100         # 因为是求余,res_Serial都是各位数字,ascii码值中个位数字+100都是小写字母
    Serial += chr(res_Serial[i])

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

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

  • 通过算法,输入任意Name得到Serial,验证成功

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue elementui 上传视频 以及上传视频失败重新上传没反应的处理方法

<template><el-drawertitle"上传视频"size"50%":visible.sync"drawer":direction"direction"><div class"content"><div class"upload-box" v-if"!secondStep"><!--on-exce…

谷粒商城实战笔记-72-商品服务-API-属性分组-获取分类属性分组

文章目录 一&#xff0c;后端接口开发Controller层修改接口接口测试 二&#xff0c;前端开发 这一节的内容是开发获取分类属性分组的接口。 一&#xff0c;后端接口开发 Controller层修改接口 修改AttrGroupController接口。 RequestMapping("/list/{catelogId}")p…

Linuxnat网络配置

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…

python—pandas基础(3)

文章目录 虚拟变量变换数值变量分段数据分组基于拆分进行筛选分组汇总使用 agg 函数进行汇总引用自定义函数 长宽格式转换长宽型格式的自由互转 多个数据源的合并数据的横向合并concat 命令一维的Series拼接df对象拼接两个df对象拼接&#xff0c;按列进行拼接两个df对象拼接&am…

55事务、批处理、CBLOB

day55 事务 MySQL&#xff1a;每一条语句都属于独立事务,默认自动管理提交的。 如果需要把多条语句当成一个整体&#xff0c;那么就需要把多条语句放在一个事务里面 开启事务&#xff1a;start transaction 提交事务&#xff1a;commit; 回滚事务&#xff1a;rollback 封装事务…

【安装笔记-20240727-Windows-OpenWrt 23.05 docker 安装 wordpress】

安装笔记-系列文章目录 安装笔记-20240727-Windows-OpenWrt 23.05 docker 安装 wordpress 文章目录 安装笔记-系列文章目录安装笔记-20240727-Windows-OpenWrt 23.05 docker 安装 wordpress 前言一、调试环境操作系统&#xff1a;Windows 10 专业版调试环境 二、安装步骤测试版…

基于SpringBoot的商业航班执飞飞机机型信息管理

目录 前言 一、数据库模型的设计与实现 1、表结构设计 2、数据去重和消歧 二、后台应用程序设计 1、实体类设计 2、业务层及控制层设计与实现 3、视图层的实现 三、系统成果展示 1、飞机机型管理列表 2、机型信息编辑 四、总结 前言 在之前的信息中&#xff0c;我们对…

流媒体服务器二:RTMP协议详解 以及 RTMP学习到什么程度算是合格?

一个问题&#xff1f; 在上一节我们使用SRS搭建了RTMP环境&#xff0c;那么在企业开发中&#xff0c;是否使用第三方的RTMP服务器&#xff08;例如上一节的SRS&#xff09;就可以了呢&#xff1f;或者说&#xff1a;作为一个音视频开发人员&#xff0c;就会配置就OK了呢&#…

windows USB 设备驱动开发-创建安装 Winusb.sys 的驱动程序包

要将 WinUSB 用作设备的功能驱动程序&#xff0c;请创建一个驱动程序包。 驱动程序包必须包含以下文件&#xff1a; WinUSB 辅助安装程序 (Winusbcoinstaller.dll)&#xff1b;KMDF 辅助安装程序 (WdfcoinstallerXXX.dll)&#xff1b;一个 .inf 文件&#xff0c;用于将 Winusb…

MYSQL 第三次作业

1、第三次作业 01、SELECT * FROM student; SELECT * FROM score; 02、SELECT * FROM student LIMIT 1, 3; 03、SELECT * FROM student WHERE department IN (计算机系, 英语系); 04、SELECT * FROM student WHERE birth_year > 1998; 05、SELECT department, COUNT(*) as c…

Corel VideoStudio 会声会影2023旗舰版视频软件

使用新版 Corel VideoStudio 会声会影2023是 一次激活永久使用。 享受有趣轻松的视频编辑体验。通过数百种滤镜、效果、标题、过渡和图形 — 包括新增面部追踪贴纸 — 探索拖放创意。运用直观的工具和即时项目模板&#xff0c;几分钟即可创建出色的视频&#xff01;探索有趣简单…

【JUC】CAS(轻量级加锁)

文章目录 原子类没有CAS之前使用CAS之后CAS是什么&#xff1f;compareAndSet 源码 CAS底层原理&#xff1f;谈谈对Unsafe类的理解&#xff1f;Unsafei是线程不安全的&#xff0c;AtomicInteger.getAndIncrement()如何保证原子性&#xff1f; 源码分析底层汇编语言面试回答 原子…

OriginPro 2024b (学习版) 绘制3D坐标下 边际直方图

OriginPro 2024b (学习版) 绘制3D坐标下 边际直方图 时间 2024年7月27日 1.导入数据 需要3列数据&#xff0c;分别作为x,y,z, 其中z值随便设置。快速设置z值的方法&#xff1a;在第4行“F(x)”输入1&#xff0c;这一列的值全设置为1了。 设置x,y,z的方法如下&#xff1a;点击…

【机器学习】周志华《机器学习》西瓜书勘误:按章节排序整理(截至2024年1月第45次印刷)

文章目录 按章节排序第 1 章 绪论第 2 章 模型评估与选择第 3 章 线性模型第 4 章 决策树第 5 章 神经网络第 6 章 支持向量机第 7 章 贝叶斯分类器第 8 章 集成学习第 9 章 聚类第10章 降维与度量学习第11章 特征选择与稀疏学习第12章 计算学习理论第13章 半监督学习第14章 概…

使用两台虚拟机分别部署前端和后端项目

使用两台虚拟机分别部署前端和后端项目 1 部署方案2 准备两台虚拟机&#xff0c;并配置网络环境3 部署后端项目3.1 打包服务3.2 上传jar包到服务器3.3 集成Systemd3.3.1 移动端服务集成Systemd3.3.2 后台管理系统集成Systemd 4 配置域名映射5 部署前端项目5.1 移动端5.1.1 打包…

JVM系列(二) -类的加载过程

一、背景介绍 我们知道 Java 是先通过编译器将.java类文件转成.class字节码文件&#xff0c;然后再通过虚拟机将.class字节码文件加载到内存中来实现应用程序的运行。 那么虚拟机是什么时候加载class文件&#xff1f;如何加载class文件&#xff1f;class文件进入到虚拟机后发…

ARCH和GARCH模型★★

该博客为个人学习清风建模的学习笔记&#xff0c;部分课程可以在B站&#xff1a;【强烈推荐】清风&#xff1a;数学建模算法、编程和写作培训的视频课程以及Matlab等软件教学_哔哩哔哩_bilibili 该节是针对时间序列分析中对证券指数分析不能使用传统时间序列模型做出的模型&a…

C++ 基础(类和对象下)

目录 一. 再探构造函数 1.1. 初始化列表&#xff08;尽量使用列表初始化&#xff09; 二. static成员 2.1static成员初始化 三.友元 3.1友元&#xff1a;提供了⼀种 突破类访问限定符封装的方式. 四.内部类 4.1如果⼀个类定义在另⼀个类的内部&#xff0c;这个内部类就叫…

数据结构第三讲:单链表的实现

数据结构第三讲&#xff1a;单链表的实现 1.什么是单链表2. 节点3.单链表的实现3.1节点的结构3.2打印单链表3.3申请一个新节点3.4单链表尾部插入3.5单链表头部插入3.6单链表的尾部删除3.7单链表头部删除3.8查找3.9在指定位置之前插入数据3.10在指定位置之后插入数据3.11删除pos…

全国区块链职业技能大赛样题第9套前端源码

后端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746050 前端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746216 智能合约+数据库表设计:https://blog.csdn.net/Qhx20040819/article/details/140746646 登录 ​ 用户管理