WinCHM
看到zenix大佬发帖后,有感而发。
从下面这个网站下载安装以后,将winchm.exe拖入IDA。
根据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!
更多【WinCHM 再探索!】相关视频教程:www.yxfzedu.com