Xshell 6 plus
下载
左边是需要输入注册码的,右边是30天的评估版,随意填写,使用临时邮箱就可以接收下载链接了,产品的下载链接路径是一样的,不同版本的xshell在于最后面附加标号(r、p):
https://cdn.netsarang.net/30486508/Xshell-6.0.0193r.exe plus版本
https://cdn.netsarang.net/30486508/Xshell-6.0.0193.exe 评估版本
https://cdn.netsarang.net/30486508/Xshell-6.0.0193p.exe 教育版
这次针对的是plus版本的分析。
分析
安装xshell,plus版本需要输入注册码才会安装,这里并没有计算注册码是否过期,主要是提取注册码的时间和一些其他标识信息。注册码只要是真是注册码即可,所以可以随意百度一个来使用,区别就是标识会有所不同,不影响功能正常使用。我就偷懒用了百度的第一个 180807-116568-999990
。
输入序列号,进入下一步
如果不输入序列号是不让你进行下一步的,也就无法安装了,这里我就用默认安装路径了,也可以自行修改一下。
安装完成后,应该是这样的,如果你以前安装过的话。如果是第一次安装,运行一次后,关闭再运行即可,主要是触发本地校验程序,校验你的序列号为过期并提示你未激活
这里的 License Type
、Number of License
、Issue Date
是根据序列号来的标识,所以使用不同的序列号,会呈现不一样的数据,目前没发现有啥影响的。
从License Type
后边的 (Not Activated)
入手,用x32dbg调试(这是一个32位程序)xshell.exe
在反汇编窗口查看上下文代码,得知是从上面的je跳转过来的,我们往上找到函数入口,下个断点,方便一会儿观察上下文。
点击关于触发断点,往下执行会发现 (Registered)
字样,这个时候还没有变成 (Not Activated)
。继续往下单步步过。
这里就发现了一个长跳转,这个长跳转跳过了 (Not Activated)
,跳转上部是 (Registered)
,但这个跳转并未执行,那么就会到 (Not Activated)
赋值去。
00F8F401 | FFB5 ACFBFFFF | push dword ptr ss:[ebp-454] |
00F8F407 | 8B9D 9CFBFFFF | mov ebx,dword ptr ss:[ebp-464] | [ebp-464]:&L"alee\r\nnature\r\nLicense Type: Xmanager Power Suite (Registered)\r\nNumber of Licenses: 999\r\n\r\n"
00F8F40D | FFB5 B8FBFFFF | push dword ptr ss:[ebp-448] |
00F8F413 | FFB5 A0FBFFFF | push dword ptr ss:[ebp-460] | [ebp-460]:L"Number of Licenses: 999\r\n"
00F8F419 | FFB5 B0FBFFFF | push dword ptr ss:[ebp-450] | [ebp-450]:L"Xmanager Power Suite (Registered)"
00F8F41F | FFB5 A8FBFFFF | push dword ptr ss:[ebp-458] | [ebp-458]:L"nature\r\n"
00F8F425 | FFB5 A4FBFFFF | push dword ptr ss:[ebp-45C] | [ebp-45C]:L"alee\r\n"
00F8F42B | 68 00780501 | push xshell.1057800 | 1057800:L"%s%sLicense Type: %s\r\n%s%s\r\n%s"
00F8F430 | 53 | push ebx | ebx:&L"alee\r\nnature\r\nLicense Type: Xmanager Power Suite (Registered)\r\nNumber of Licenses: 999\r\n\r\n"
00F8F431 | FFD7 | call edi |
00F8F433 | 83C4 20 | add esp,20 |
00F8F436 | FFD6 | call esi |
00F8F438 | 8B40 04 | mov eax,dword ptr ds:[eax+4] |
00F8F43B | 83B8 2C010000 00 | cmp dword ptr ds:[eax+12C],0 |
00F8F442 | 75 12 | jne xshell.F8F456 |
00F8F444 | FFD6 | call esi |
00F8F446 | 8B40 04 | mov eax,dword ptr ds:[eax+4] |
00F8F449 | 83B8 38010000 00 | cmp dword ptr ds:[eax+138],0 |
00F8F450 | 0F85 C2000000 | jne xshell.F8F518 | 关键跳转
00F8F456 | 8D8D BCFBFFFF | lea ecx,dword ptr ss:[ebp-444] |
00F8F45C | FF15 7C050401 | call dword ptr ds:[<&Ordinal#316>] |
00F8F462 | 8D8D B4FBFFFF | lea ecx,dword ptr ss:[ebp-44C] |
00F8F468 | FF15 7C050401 | call dword ptr ds:[<&Ordinal#316>] |
00F8F46E | C645 FC 09 | mov byte ptr ss:[ebp-4],9 | 9:'\t'
00F8F472 | FFD6 | call esi |
00F8F474 | 8B40 04 | mov eax,dword ptr ds:[eax+4] |
00F8F477 | 83B8 2C010000 00 | cmp dword ptr ds:[eax+12C],0 |
00F8F47E | 74 38 | je xshell.F8F4B8 |
00F8F480 | FFD6 | call esi |
00F8F482 | 8B40 04 | mov eax,dword ptr ds:[eax+4] |
00F8F485 | 8D8D BCFBFFFF | lea ecx,dword ptr ss:[ebp-444] |
00F8F48B | 83B8 30010000 01 | cmp dword ptr ds:[eax+130],1 |
00F8F492 | 75 12 | jne xshell.F8F4A6 |
00F8F494 | 68 40780501 | push xshell.1057840 | 1057840:L"(Activated Locally)"
00F8F499 | FF15 88050401 | call dword ptr ds:[<&Ordinal#1516>] |
00F8F49F | 68 80780501 | push xshell.1057880 | 1057880:L"(Concurrent, Activated)"
00F8F4A4 | EB 28 | jmp xshell.F8F4CE |
00F8F4A6 | 68 68780501 | push xshell.1057868 | 1057868:L"(Activated)"
00F8F4AB | FF15 88050401 | call dword ptr ds:[<&Ordinal#1516>] |
00F8F4B1 | 68 80780501 | push xshell.1057880 | 1057880:L"(Concurrent, Activated)"
00F8F4B6 | EB 16 | jmp xshell.F8F4CE |
00F8F4B8 | 68 B0780501 | push xshell.10578B0 | 10578B0:L"(Not Activated)"
00F8F4BD | 8D8D BCFBFFFF | lea ecx,dword ptr ss:[ebp-444] |
00F8F4C3 | FF15 88050401 | call dword ptr ds:[<&Ordinal#1516>] |
00F8F4C9 | 68 D0780501 | push xshell.10578D0 | 10578D0:L"(Concurrent, Not Activated)"
00F8F4CE | 8D8D B4FBFFFF | lea ecx,dword ptr ss:[ebp-44C] |
00F8F4D4 | FF15 88050401 | call dword ptr ds:[<&Ordinal#1516>] |
00F8F4DA | FFB5 BCFBFFFF | push dword ptr ss:[ebp-444] |
00F8F4E0 | 8BCB | mov ecx,ebx | ebx:&L"alee\r\nnature\r\nLicense Type: Xmanager Power Suite (Registered)\r\nNumber of Licenses: 999\r\n\r\n"
00F8F4E2 | 68 08790501 | push xshell.1057908 | 1057908:L"(Registered)"
00F8F4E7 | FF15 84060401 | call dword ptr ds:[<&Ordinal#12595>] |
00F8F4ED | FFB5 B4FBFFFF | push dword ptr ss:[ebp-44C] |
00F8F4F3 | 8BCB | mov ecx,ebx | ebx:&L"alee\r\nnature\r\nLicense Type: Xmanager Power Suite (Registered)\r\nNumber of Licenses: 999\r\n\r\n"
00F8F4F5 | 68 24790501 | push xshell.1057924 | 1057924:L"(Concurrent Registered)"
00F8F4FA | FF15 84060401 | call dword ptr ds:[<&Ordinal#12595>] |
00F8F500 | 8D8D B4FBFFFF | lea ecx,dword ptr ss:[ebp-44C] |
00F8F506 | FF15 78050401 | call dword ptr ds:[<&Ordinal#1039>] |
00F8F50C | 8D8D BCFBFFFF | lea ecx,dword ptr ss:[ebp-444] |
00F8F512 | FF15 78050401 | call dword ptr ds:[<&Ordinal#1039>] |
00F8F518 | 8D8D A8FBFFFF | lea ecx,dword ptr ss:[ebp-458] | [ebp-458]:L"nature\r\n"
观察上下文,跳转判断来自 cmp dword ptr ds:[eax+12C],0
,这里下断,将数据地址修改为1,再运行得出如下结果:
那么在这里下一个硬件存取断点,重载程序,观察断下的位置: 第一处:这里看到了一大串置空操作,并没有类似判断函数加跳转这类操作,应该不是启动自检,更像是为自检提前准备空间,继续运行。
第二处:这里有一个 NSACTIVATE_CheckOffline
函数。字面意思很明显,离线检查,结果赋值给数据段,然后进行判断跳转。
修改数据值为1,然后运行程序
看来找对地方了。
形成补丁
进入函数,寻找eax的最后赋值点,修改为1,即可。
从图中可以看到eax本来就是1,但是esi为0,这里将eax赋值为0了,最小化修改:
10006DB5 | 8BC6 | mov eax,esi |
修改为:
10006DB5 | B0 01 | mov al,1 |
直接nop掉也是可以的,看个人习惯。
保存补丁请注意补丁文件名为:nsactivate.dll