(一)分析

运行一下这个程序发现,这个程序没有确认按钮,推测是实时获取用户输入,然后在文本框中显示输入是否正确。
OD中打开,自动定位到了主函数。

GetModuleHandle获取窗口句柄,ExitProcess函数是退出程序的进程,中间那个401023函数就是程序运行的主体部分,F7步入,看到一些加载图标,加载光标,注册窗口的api函数等等,

直到ShowWindow函数,才显示出窗口,前面一直是在进行一些窗口的初始化操作

后面一个大循环,在循环里面看到GetMessage函数,这个函数可以实现获取源源不断的消息,因为所有在窗口上的输入消息,都会放到应用程序的消息队列里,然后再发送给窗口回调函数处理。

目的是了解程序如何对用户输入的文本进行操作,势必要跳出循环。
Ctrl+F2重新加载,这次直接按F9让程序跑飞,这样才能输入测试数据。

输入完测试数据之后,可以注意到在循环的下一步,程序开始获取文本框的输入,有个GetDlgItemInt函数,给它下个断点,点一下文本框,程序便停在了这个函数的位置,这样就可以看程序对数据做了什么处理。
首先要弄清楚输入文本都被存入了哪里。

MSDN文档查找一下GetDlgItemInt函数,这个函数意在实现int型读取用户输入文本框的内容并返回。pSuccess指向用户输入的序列号所在的内存单元的地址,即0x0018F920。
GetWindowTextA函数就是获取文本框的文本,把文本存入了Buffer指向的内存(从OD看出Buffer指向的地址是0x0040316C)

下拉发现在对用户名跟序列号处理的代码下面一些奇怪的汇编指令,且没有跳转指向输入正确的提示。推测这里是SMC。
先分析一下程序对数据的处理。

004012A3    .  A1 0B304000     mov     eax, dword ptr [40300B];常量0x58455443存入eax
004012A8    . BB6C314000       mov     ebx,0040316C           ;ASCII "123456"004012AD    >  0303            add     eax, dword ptr [ebx]
004012AF    .  43              inc     ebx
004012B0    .  81FB 7C314000   cmp     ebx, 0040317C
004012B6    .^ 75 F5           jnz     short 004012AD;输入的用户名“123456”循环16次每次读取4个字节累加到常量0x58455443004012B8    .  5B              pop     ebx;输入的序列号存入ebx
004012B9    .  03C3            add     eax, ebx
004012BB    .  3105 D9124000   xor     dword ptr [4012D9], eax;常量0x584554(0x4012D9处的字节码)跟累加后的值异或【SMC】
004012C1    .  C1E8 10         shr     eax, 10;异或后右移16位
004012C4    .  66:2905 D9124  >sub     word ptr [4012D9], ax;异或后的值减去累加后的值,可以注意到0x4012D9指向的不是数据,而是那一段奇怪的代码的地址,明显在对0x4012D9的代码进行修改。【SMC】

现在分析一下这部分SMC,之所以没有跳转指令跳转到提示正确的字符的位置,推测是因为SMC自修改出来的代码就是缺失的跳转语句。
但跳转到自修改出的跳转语句之前,还有一部分bx跟ax异或0x3E次的,
这边有个lods 取串指令(把源串中的元素(字或字节)逐一装入AL或AX中),从si寄存器存放的地址处,也就是0x4011EC处开始取串,然后必须要异或出固定的值0xAFFCCFFB才会有后来的跳转。

这里的循环后期写注册机的时候其实是可以忽略的,因为这个循环主要的作用是进一步验证SMC出的代码是不是jmp到yes字符串,而破解的话只要前面的数据处理就能爆破出来了。

理清程序的大体过程之后可以写注册机。

(二)注册机

源代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string>
using namespace std;
int main()
{   char usrname[20] = { 0 };int serial = 0x58455443, temp = 0, temp1 = 0,n;printf("username:");scanf("%s", usrname);for (int i = 0; i < 16; i++)serial += *(int *)(usrname + i);for (int j = 0; j < 0xFFFFFFFF; j++){temp = (0x584554 ^ (serial + j))-((serial + j) >> 16);if (temp == 0x585426EB){printf("serial:%u", j);break;}}return 0;
}

后来发现temp = (0x584554 ^ (serial + j))-((serial + j) >> 16);这一步可以优化,用分步运算,
先算高四位的值

(0x58 ^ ((serial + j)>>16))==0x5854,

后算第四位的值,

(0x4554 ^ ((serial + j)&0x0000FFFF))-((serial + j) >> 16)==0x26EB

可以看出最后序列号与累加后的用户名的和其实等于一个常数,优化之后的程序源码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string>
using namespace std;
int main()
{   char usrname[20] = { 0 };int serial = 0x58455443, temp = 0, temp1 = 0,n;printf("username:");scanf("%s", usrname);for (int i = 0; i < 16; i++)serial += *(int *)(usrname + i);printf("Serial:%u\n", 0x580C3BA3 - serial);return 0;
}

(三)实现


[160CRACKME]Chafe.2相关推荐

  1. 160 - 24 Chafe.2

    环境: Windows xp sp3 工具 exeinfope OllyDBG 查壳 用exeinfope查壳,发现是没有壳的. 测试 可以看出是从红色框框里面的内容判断serial是否有效 OD载入 ...

  2. 160 - 23 Chafe.1

    环境 Windows xp sp3 工具 exeinfope ollydbg 查壳 用exeinfoe查壳 测试 可以从左下角状态栏看出serial是无效的 直接OD载入字符串搜索 00401274 ...

  3. javaweb添加拦截器

    js请求后台代码添加拦截器: package com.ctzj.biz.isale.deploy.controller; import java.io.IOException; import java ...

  4. 160个Crackme047

    文章目录 校验步骤 条件一 条件二 条件三 条件四 条件五 注册机的编写 [软件名称]:Dope2112.2.exe [软件大小]:12.0 KB [下载地址]:自行搜索下载 [加壳方式]:无壳 [保 ...

  5. 160个Crackme045

    文章目录 导入符号 用CE寻找切入点 分析算法 写出注册机 校验结果 [软件名称]:Dope2112.2.exe [软件大小]:171kb [下载地址]:自行搜索下载 [加壳方式]:无壳 [保护方式] ...

  6. 160个Crackme044

    文章目录 寻找切入点 算法分析 基础校验 第一部分 第二部分 校验部分 写出注册机 校验结果 [软件名称]:Dope2112.1.exe [软件大小]:178KB [下载地址]:自行搜索下载 [加壳方 ...

  7. 160个Crackme041之无源码修改Delphi程序

    文章目录 前言 软件概况 分析程序 栈回溯分析About点击事件 获取必要的API 添加区段 配置区段 添加区段数据 植入代码 修改目标函数 校验结果 [软件名称]:defiler.1.exe [软件 ...

  8. 160个Crackme040

    文章目录 分析程序 找到响应事件 添加签名 导出map文件 分析算法 写出注册机 校验结果 [软件名称]:DaNiEl-RJ.1.exe [软件大小]:216KB [下载地址]:https://git ...

  9. 160个Crackme039

    文章目录 查壳 寻找突破口 分析算法 第一部分 第二部分 写出注册机 校验结果 [软件名称]:damn.exe [软件大小]:30KB [下载地址]:https://github.com/TonyCh ...

最新文章

  1. 解决安装Tensorflow时的setup-tool错误
  2. quercus mysql_14.5 Quercus 原理及展望
  3. 额,你在main.xml中加了一个id以后,要右键点save,才会将这个id加入到R中,否则是没有的。。。R里的东西是程序自动生成的~~~...
  4. kail利用msf工具对ms17-010(永恒之蓝)漏洞入侵渗透Win7
  5. 2.3_ 1_ 进程同步、进程互斥
  6. 几何级数 函数 matlab,matlab 实验05数据的统计分析
  7. Emlog文章海报插件
  8. RocketMq学习笔记001---Kafka,ActiveMQ、RabbitMQ、RocketMQ消息中间件的对比
  9. Android之提交数据到服务端方法简单封装
  10. CES现场直击 AI让你现场获得虚拟双胞胎
  11. zotero中pdf-translate插件的使用
  12. php $act,PHP_php Undefined index和Undefined variable的解决方法,$act=$_POST['act']; 用以上代码总 - phpStudy...
  13. 图解大数据 | 大数据分析挖掘-Spark初步
  14. 视频聊天软件的快速开发(QT5.3)
  15. Linus 一生只为寻找欢笑(下)-转
  16. js删除节点的坑(删不完),以li为列
  17. 什么?!NEON还要优化?
  18. VTK绘制螺钉螺纹线
  19. 如何进行需求分析评审
  20. 屏幕小于6英寸的手机_有什么6英寸以下的小屏手机推荐?

热门文章

  1. 邮箱html页面无法显示图片,邮箱内嵌入html页面需要注意的
  2. EasyExcel合并相同内容单元格及动态标题功能的实现
  3. 奥维 最新 图源2023
  4. 恐怖的ChatGPT!
  5. Windows Subsystem for Android (WSA) 下载:在 Windows 11 上运行 Android 应用
  6. 舌尖上的中国第二季整理笔记
  7. 【Visual Studio 2019 - Unknown override specifier error】Problems when compiling dbghelp.h
  8. C语言中6HZ怎么算,C语言基础课First作业
  9. 用编程Python赚钱的5个方法
  10. 计算机塑性成形论文,6061铝合金的高温变形的力学性能及热塑性成形工艺研究...