吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1870|回复: 6
收起左侧

[原创] 002-abexcm5(Crack练习)

  [复制链接]
supercat1 发表于 2022-11-2 15:09
本帖最后由 supercat1 于 2022-11-2 15:36 编辑

打开abexcm5.exe可执行文件
002-abexcm5.rar (1.17 KB, 下载次数: 10)

1.png


随便输入一串数字查看一下运行效果,可以看到返回一个窗口显示注册码错误


2.png

查一下文件信息看到是使用汇编写的,无壳

3.png

OllyDbg打开abexcm5.exe,搜索字符串可以找到刚才消息框中弹出的字符串,点进去看一下代码

4.png

分析代码段可以看到这里调用了GetDigitemTextA、GetVolumeInformation、lstrcat、MessageBoxA等函数,004010FF处还有一处相等跳转转到MessageA显示注册码正确,所以这里就很轻松找到了关键代码。可以将je改成jmp进行强行跳转,实现任意注册码进入。

5.png


下面我们分析验证码算法实现用C语言写一个简易注册机

在关键代码入口点0040106C按F2打上断点,运行程序,程序停在断点处后输入任意数字提交。
6.png

按F8单步运行
运行完GetDigitemTextA可以在栈帧窗口看到我输入的数字123456存储在00402324

7.png


接着单步运行到下个函数GetVolumeInformation

栈帧窗口中出现了GetVolumeInformation中参数,百度看一下这个函数的信息

BOOL GetVolumeInformationA(
[IN]  LPCTSTR lpRootPathName,                                //卷所在的根目录,如:"C:\", 如果为NULL,表示当前目录
[OUT]  LPTSTR lpVolumeNameBuffer,                       // 输出参数,存放卷名缓冲区
[IN]  DWORD nVolumeNameSize,                              // 卷名缓冲区长度
[OUT]  LPDWORD lpVolumeSerialNumber,                // 卷序列号
[OUT]  LPDWORD lpMaximumComponentLength,     // 最大文件文件名组件长度,随文件系而变化
[OUT]  LPDWORD lpFileSystemFlags,                       // 文件系统的一些属性,通常为一些宏的组合
[OUT]  LPTSTR lpFileSystemNameBuffer,                 // 说明何种文件系统,例如NTFS,  FAT等
[IN]  DWORD nFileSystemNameSize                         // 文件系统缓冲区长度
);

8.png

接着运行到下个函数lstrcatA可以看到函数在0040225C(存放的是卷名Windows)后追加了4562-ABEX

9.png
10.png


再接着运行到下一段,经过观察可以发现是一个do..while..循环

循环2次,每次循环分别在下面4个地址的值加1

11.png

循环过后查看一下内存窗口可以看到前4位分别加了2
12.png


再接着运行到下一个函数lstrcatA,和前面一样,将L2C-5781加在了00402000的位置
13.png


再接着运行到下一个函数lstrcatA,还是一样的,将00402225C加在00402000后
14.png


此时00402000的数据是这样的

L2C-5781Ykpfows4562-ABEX

15.png

然后就可以看到用户输入的数据在与L2C-5781Ykpfows4562-ABEX做比较,如果相等就跳转到正确窗口,反之就跳到错误窗口。因此可以判断L2C-5781Ykpfows4562-ABEX就是我本机的注册码。

16.png


输入L2C-5781Ykpfows4562-ABEX就可以看到显示注册码正确!

17.png

然后我按照分析出来的算法用C写一个注册机,代码如下:

#include <stdio.h>

#include<Windows.h>

int main() {
        char szVolumeNameBuf[MAX_PATH] = { 0 };
        DWORD dwVolumeSerialNum;
        DWORD dwMaxComponentLength;
        DWORD dwSysFlags;
        char szFileSystemBuf[MAX_PATH] = { 0 };
        DWORD dwFileSystemBuf = MAX_PATH;
        char serial[MAX_PATH] = { 0 };
        int i = 2;
               
        BOOL bGet = GetVolumeInformationA("C:\\",
                szVolumeNameBuf,
                MAX_PATH,
                &dwVolumeSerialNum,
                &dwMaxComponentLength,
                &dwSysFlags,
                szFileSystemBuf,
                MAX_PATH);
        lstrcatA(szVolumeNameBuf,"4562-ABEX");

        do
        {
                szVolumeNameBuf[0]++;
                szVolumeNameBuf[1]++;
                szVolumeNameBuf[2]++;
                szVolumeNameBuf[3]++;
               
        } while (--i);
        lstrcatA(serial, "L2C-5781");
        lstrcatA(serial, szVolumeNameBuf);
        printf("注册码:");
        printf(serial);
        return 0;
}

运行效果:
18.png

参考资料:

[https://blog.csdn.net/pjf_1806339272/article/details/107368909](https://blog.csdn.net/pjf_1806339272/article/details/107368909)

免费评分

参与人数 1威望 +1 吾爱币 +20 热心值 +1 收起 理由
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

头像被屏蔽
xiadongming 发表于 2022-11-2 16:21
提示: 作者被禁止或删除 内容自动屏蔽
Hmily 发表于 2022-11-2 15:28
markdown格式需要点击MD那个按钮,把内容输入进去点确定才行。
 楼主| supercat1 发表于 2022-11-2 15:29
Hmily 发表于 2022-11-2 15:28
markdown格式需要点击MD那个按钮,把内容输入进去点确定才行。

好的好的,我是在别的地方写的笔记,想粘贴到52来,第一次发帖

点评

现在挺好的,那个代码可以用代码框处理一下,会更好看。  详情 回复 发表于 2022-11-2 15:44
Hmily 发表于 2022-11-2 15:44
supercat1 发表于 2022-11-2 15:29
好的好的,我是在别的地方写的笔记,想粘贴到52来,第一次发帖

现在挺好的,那个代码可以用代码框处理一下,会更好看。
metoo2 发表于 2022-11-3 11:00
很实用,谢谢分享
16713720339 发表于 2022-11-3 11:47
感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 16:28

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表