在多次访问Bilibili却遭遇超低网速后,我觉得是WiFi有问题。然而我并不能对路由器做什么,于是就想着换个(别人家的)WiFi… 然后想起了高中时接触到的Arcylic工具,感觉里面好像有一些现成的功能可以按品牌很方便的爆密码(???)。感觉是.NET的,于是决定自己研究一下。
Intro
起因就是这样了。我直接试了一下,发现只有沙雕CIK的密码是MAC地址。我记得Shaw似乎也是,然而不知道为什么我总是连不上我附近的Shaw。然后就是一大堆的Telus了,完全不知道Telus的密码是咋搞的… 去网上搜了下,发现是数字字母混合十来位的高科技默认密码。您诗人吗?
十分显然,以我的水平并不可能根据公开的这一点儿信息猜测出密码(除了CIK)。想起我高中时似乎Arcylic可以写脚本而且自带了很多不同品牌的破解密码的脚本,于是想试试。
Home版是个残废,只能看WiFi的SSID、信道、MAC、加密、速度(上限)和几个不明(所有WiFi都一样)的值。Pro版就是正常的功能:查看各种值、所有设备、抓所有的网络内容(由于网卡限制,其他WiFi只能抓到Broadcast的bacon)、使用不明的脚本做似乎是破解密码的操作。搜了一下感觉没看到什么很可信的破解版,决定自己试一下… 虽然多半会失败。
第一次尝试
沙雕的我直接楞着头冲了上去(???)。直接打开来以后发现并不能做什么我想要的操作,这玩意儿不知道怎么搞的变成Native的了(???)。Dump不行,dnSpy无法附加,自然也不能直接直接搞到解密后的程序集(喂人家根本没有解密后的程序集啊!)。我乖乖地回去掏出了d4d,把主程序解了。d4d表示,这是个Crypto Obfuscator保护的程序集。(似乎还有点名?但是没印象了)
然而并没有什么卵用:主程序里还是一大堆delegate(大部分公共的方法都变成了一个独立的MulticastDelegate类,然后名字全变成了EnableLicenseClient,大概长这样
internal sealed class ClassName : MulticastDelegate
{
public extern ClassName(object, IntPtr);
static ClassName()
{
DecryptCall(1234567, 123456789, 12345678);
}
public extern T Invoke();
public static T EnableLicenseClient()
{
return ClassName.nextCrypto();
}
internal static readonly ClassName nextCrypto;
}
这就让人非常难受了。我还不如直接用dnSpy启动一行行调试过去。
和正常想的一样,这玩意儿在某个地方throw了一个System.Exception { "Debugger was found - this software cannot be executed under the Debugger." }
。这个位置是Tarlogic.Gui.MemoryDesigner(啊,这个命名让人整个都不好了。我去看了下Crypto Obfuscator的官方网站,他们说这是个feature!fake but realistic names like Domain/Log/Stream/etc (for classes) or Open/Close/Clear/Delete/etc for methods and so on
您们诗人吗???精神攻击?)
我看了一下这里,也没看懂发生了啥。
internal static void EnableLicenseClient()
{
try
{
if (MemoryDesigner.EnableLicenseClient())
{
for (;;)
{
switch (6)
{
case 0:
continue;
}
break;
}
if (!true)
{
RuntimeMethodHandle runtimeMethodHandle = methodof(MemoryDesigner.EnableLicenseClient()).MethodHandle;
}
string text = VendorStream.EnableLicenseClient(24111);
throw UndefinedActiveDictionary.EnableLicenseClient(SeenDADesigner.EnableLicenseClient(VendorStream.EnableLicenseClient(24128), text));
}
}
catch (Exception ex)
{
string text;
PaneSet.EnableLicenseClient(ex, text);
throw;
}
}
这可真是太素质了,EnableLicenseClient。不过有一点东西暴露了:try尾部的局部变量text的内容是Debugger
(dnSpy调试的时候发现的)。那么看起来就有一点儿明确了:VendorStream.EnableLicenseClient是个邪恶的字符串解密!这是个很标准(被d4d通杀)的字符串解密,所以我去看了下这个方法的Token:0x06000193。
借助强无敌的--strtyp delegate --strtok 06000193
的帮助,可怜的字符串加密被杀掉了。这个方法的真实代码出来了(emmmmm)
internal static void EnableLicenseClient()
{
string text = default(string);
try
{
if (MemoryDesigner.EnableLicenseClient())
{
text = "Debugger";
throw UndefinedActiveDictionary.EnableLicenseClient(SeenDADesigner.EnableLicenseClient("{0} was found - this software cannot be executed under the {0}.", text));
}
}
catch (Exception ex)
{
PaneSet.EnableLicenseClient(ex, (object)text);
throw;
}
}
好吧。中规中矩。不过另一个MemoryDesigner.EnableLicenseClient的代码也出来了:LoadLibrary(“kernel32.dll”), GetCurrentProcessId, OpenProcess, IsDebuggerPresent, CheckRemoteDebuggerPresent
LoadLibrary(“user32.dll”), EnumWindows, 然后做了不知道是啥的事。(我虽然不知道是啥,但是也猜出来了… 这个类的另一个方法里来了个new string[1] { "OLLYDBG" }
……)
那MemoryDesigner看起来就很简单了。但是还发现了另一个方法:PaneSet.ExitPane。(为什么我会说这个有问题?因为这段代码在检查自己的StackFrame…)
对不起,是我咸鱼了,这tm是crash了以后把StackFrame修好发报告回去…
IL Patch了MemoryDesigner,无法启动。看了一下,System.InvalidCastException { "Unable to cast object of type 'System.Reflection.RuntimeConstructorInfo' to type 'System.Reflection.MethodInfo'." }
。感觉没看出发生了什么,先咸鱼一会儿。局部变量(要cast的目标)是”Tarlogic.DependantVisualControls.ScansSettings..ctor()”。
(未完,但是太菜了可能续不上了)