-
-
[原创]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会进行同步
此刻进行调试中,常用命令
边调试边看,调试时发现这里有个小循环。
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 | 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虚拟机自动化脱壳的方法