Crackme023

接单狂魔
• 阅读 1191

Crackme023 的逆向分析

1.程序观察

Crackme023
当输入的序列号正确的时候,下面的状态应该会变。

2.简单查壳

Crackme023
使用汇编语言写的,没有壳。

3.程序分析

使用 OD 载入程序,搜索字符串
Crackme023

可以看到状态栏的字符串出现在了里面,我们进入对应的代码空间
Crackme023

在地址 004012B3 处有一个比较语句,如果 eax 的值为 0x10,则程序跳转到正确提示处;如果 eax 的值不等于 0x10,程序则会跳转到错误提示处。

看来这里就是关键的比较了,那么 eax 的值是从哪里来的呢?
在地址 00401299 处可以看到,程序将内存 403166 处的值赋给了 eax。
那么问题又来了,内存 403166 处的值又是怎么来的呢?

我们在程序中查找常量 403166
Crackme023

和内存 403166 有关的语句共有8句,有4句命令是让内存 403166 的值加4。
因为前面比较是让 403166 的值和 0x10 作比较,所以需要这四条命令全部执行才行。
这四处,分别是用来求得用户名,求得序列号,计算序列号,验证序列号。

求得用户名:
Crackme023

程序先得到输入的用户名,然后求得用户名长度。接着使用循环将用户名后面一定长度的值清零。最后进行判断,如果用户名长度为0,则清零内存 403166 的值;如果不为0,则将内存 403166 的值加 0x4。

求得序列号:
Crackme023
程序使用函数获取输入的序列号,如果函数返回值为0,也就是序列号为空的话,就会直接返回;如果序列号不为空,将内存 403166 的值加 0x4。

计算序列号:
Crackme023
这是一个循环,循环次数要进行 0x10 次,内存 403166 处的值才会加 0x4。
在循环中:

  1. 程序得到用户名
  2. 用户名左移 i 位,i 为循环次数
  3. 求得输入的序列号
  4. 将序列号加1
  5. 让序列号和移位后的用户名进行异或运算
  6. 将计算出来的值存入内存 403188 处

验证序列号:
Crackme023
将内存 401388 处序列号取出,加上 0x9112478,看结果是否为0。如果为0,就是正确的;如果非0,就是错误的。所以计算出来的序列号一定是 0 - 0x9112478 = 0xF6EEDB88。

4.注册机

#include <stdio.h>
#include <string.h>
#include <Windows.h>

int Key()
{
    unsigned long serial = 0xF6EEDB88;
    char szName[20] = { 0 };
    unsigned long* p;

    printf("请输入用户名:");
    scanf_s("%s", szName, 20);

    for (int i = 15; i >= 0; i--)
    {
        p = (unsigned long*)& szName[i];
        serial ^= *p;
        serial--;
    }

    printf("%u", serial);
    return 0;
}

int main(int argc, char* argv[])
{
    Key();
    return 0;
}

Crackme023

相关文件在我的 Github

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Frida在windows上的玩法
一、目标frida玩了很久,andriod和ios下都玩的不错。不过飞哥其实是混windows出道的,那frida能不能分析winPE呢?今天介绍下Windows下的玩法,要点如下:HookWindowsApi修改参数和返回值主动调用WindowsApi二、步骤打开心爱的MFC写个demo小程序,密码是1234,输入正确提示"密码正确"
李志宽 李志宽
3年前
重拳出击!我是这样对灰产外挂下手的
分析外挂样本一般的步骤1.对外挂样本进行简单的信息分析。2.分析还原外挂样本具体功能实现方式。3.分析外挂样本的反检测功能。1.对外挂样本进行简单的信息分析查看文件属性,灰产及外挂的标配语言“易语言”通过ExeinfoPe查壳工具进行对外挂样本查壳,看看发现是没加壳的应用程序。(心里突然咯噔了下,收费的外挂竟然都不做点保护,不对自己的程序负
Wesley13 Wesley13
3年前
FD
!(https://oscimg.oschina.net/oscnet/27b94bba9f88488dba7d397aa3cc4f00.gif)
Stella981 Stella981
3年前
React Hooks 从入门到上手
!clipboard.png(https://oscimg.oschina.net/oscnet/upb75ae8e61fcec15ce541e3e1d28eb8c3.png"clipboard.png")HooksareanewadditioninReact16.8.Theyletyouusestateandot
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Duang,HUAWEI DevEco IDE全面升级啦
想感受全新UI带来的视觉及交互体验、HiKey970开发板调测、HiAIAPI推荐和收藏、深度AI模型分析等新功能,体验高清晰度和流畅度的远程AI真机调测吗?!(https://oscimg.oschina.net/oscnet/f4e1bb24ff00b8c6ea27f75370a53bfbacd.jpg)全新的UI设计
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
暗箭伤人 暗箭伤人
1年前
【www.ithunter.club】 20230922下午
不容易的2023年,我们一起努力【www.ithunter.club】(2023092208:00:00.8872062023092216:00:00.887206)1.人事招聘专员数名(可选远程或入职)2.招聘向坐标东京Yahoo、Shift、L
铁扇公主 铁扇公主
1年前
spss专业统计分析推荐 IBM SPSS Statistics中文激活最新
spssstatistics27增强功能比例和差异的Z检验和置信区间:对于单样本、配对样本、独立样本分析。在分析比较均值菜单下找到,新的比例程序允许用户测试总体比例的差异,并针对每种类型的分析使用各种方法构建观察到的差异的置信区间。可靠性分析增强:麦当劳O
接单狂魔
接单狂魔
Lv1
绿杨烟外晓寒轻,红杏枝头春意闹。
文章
3
粉丝
0
获赞
0