首页
社区
课程
招聘
[原创]WinCHM 再探索!
2022-9-28 17:51 6040

[原创]WinCHM 再探索!

2022-9-28 17:51
6040

WinCHM

https://bbs.pediy.com/thread-274560.htm

 

看到zenix大佬发帖后,有感而发。

 

从下面这个网站下载安装以后,将winchm.exe拖入IDA。

 

http://www.softany.com/winchm/

 

根据zenix大佬的汇编描述,这里有个常量0x2705,然后我们在IDA通过搜索立即数,立刻定位到了关键代码位置。

1
0058CB2A    BB 0F270000     mov ebx,0x270F                           ; 9999 用户,也就是无限用户授权

立即数搜索框

 

 

下面是搜索结果

 

 

根据官网的购买界面,确实是证书类型。

 

 

看不太明白,上Windbg和retsync。

1
2
3
4
5
6
!process 0 0 winchm.exe
!process ffffa10d782cd300
.reload
.process /i ffffa10d782cd300
bp 0058C9E4
.load F:\github\ret-sync\ext_windbg\sync\x64\Release\sync.dll

IDA 启动ret-sync插件,然后windbg执行!sync

 

接下来输入用户名和注册码,windbg就能断下来了。

 

 

 

与此同时ida会进行同步

 

 

此刻进行调试中,常用命令

1
dc,dd,r eax

边调试边看,调试时发现这里有个小循环。

 

 

F5后也就是这样

 

 

我们的算完之后是0xbd6

 

试着改动一下

 

 

g运行,发现注册成功了。

 

 

此时重新运行后,windbg需要重新下断才能断下来,而且windbg preview的寄存器窗口是错误的。

1
2
.process /i ffffa10d782cd300
bp 0058C0E0 // 我们直接下断在小循环起始处。

例如eax寄存器

 

 

此时可以确定的是,我们的寄存器eax代表v2,也就是注册码的长度,ebp-8取出来的是注册码的地址。

 

 

由dc可以看出字符是按两个字节编码的。因此我们重命名后就是这样

 

 

用C++实现一下就是这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <string>
 
using namespace std;
 
int main(){
    std::wstring code = L"1234567890";
    int64_t licenseKey = 0;
    for (int i = 0; i < code.length(); i++) {
        licenseKey += (i+1) * code.data()[i];
    }
    printf("License key: 0x%x\n", licenseKey);
    system("pause");
}

接下来可以写个标准版注册机。

 

 

注册

 

 

Ok!

 

 

https://github.com/BeneficialCode/WinCHMStandardKeygen


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
点赞5
打赏
分享
最新回复 (2)
雪    币: 2290
活跃值: (1192)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
zenix 1 2022-9-29 16:54
2
1
要不要再来一个专业版注册机?
雪    币: 4195
活跃值: (5634)
能力值: ( LV7,RANK:116 )
在线值:
发帖
回帖
粉丝
VirtualCC 2022-9-29 18:10
3
1
zenix 要不要再来一个专业版注册机?
不来嘞,学习其他的知识。
游客
登录 | 注册 方可回帖
返回