Acrylic WiFi Pro 研究

科技是第一生产力

Posted by 恋 on March 24, 2019

在多次访问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()”。

(未完,但是太菜了可能续不上了)