251's Workshop

This blog is not worth reading.

[Archive] Hwidgen Manual Method

  1. Get GatherOsState.exe from Windows 10 17134 ISO
  2. Get latest version of slshim from https://github.com/vyvojar/slshim/releases
  3. Extract slshim32.dll (for gatherosstate from x86 ISO) or slshim64.dll (for gatherosstate from x64 ISO)
  4. Place gatherosstate and extracted slshim dll in the same directory
  5. Rename slshim dll to slc.dll
  6. Import this to registry:

6.1. Set the real value for %sku% from beneath list.

edition=Cloud sku=178

edition=CloudN sku=179

edition=Core sku=101

edition=CoreCountrySpecific sku=99

edition=CoreN sku=98

edition=CoreSingleLanguage sku=100

edition=Education sku=121

edition=EducationN sku=122

edition=Enterprise sku=4

edition=EnterpriseN sku=27

edition=EnterpriseS sku=125

edition=EnterpriseSN sku=126

edition=Professional sku=48

edition=ProfessionalEducation sku=164

edition=ProfessionalEducationN sku=165

edition=ProfessionalN sku=49

edition=ProfessionalWorkstation sku=161

edition=ProfessionalWorkstationN sku=162

Replace the 'XXX' with the needed sku value. If using REG make sure the string is 7 digits long, the CMD will take the value from above.


reg add "HKLM\SYSTEM\Tokens" /v "Channel" /t REG_SZ /d "Retail" /f reg add "HKLM\SYSTEM\Tokens\Kernel" /v "Kernel-ProductInfo" /t REG_DWORD /d XXX /f reg add "HKLM\SYSTEM\Tokens\Kernel" /v "Security-SPP-GenuineLocalStatus" /t REG_DWORD /d 1 /f or REG:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\Tokens] "Channel"="Retail"

[HKEY_LOCAL_MACHINE\SYSTEM\Tokens\Kernel] "Kernel-ProductInfo"=dword:0000XXX

[HKEY_LOCAL_MACHINE\SYSTEM\Tokens\Kernel] "Security-SPP-GenuineLocalStatus"=dword:00000001 (When using the REG make shure the XXX are peplaced by shown ID from above list)

    1. Enter default Retail/OEM key from products ini

Key list from 17134.1 products.ini:

Site: https://pastebin.com/rYakstDc

if you have Enterprise N or LTSB 2016 N use this in elevated Powershell:


((Get-Content '.\gatherosstate.exe') -replace "``0" | Select-String -Pattern "(.....-){4}C372T" -AllMatches).Matches | Select-Object -ExpandProperty Value`


((Get-Content '.\gatherosstate.exe') -replace "``0" | Select-String -Pattern "(.....-){4}VMJWR" -AllMatches).Matches | Select-Object -ExpandProperty Value`

this will gather the key from within gatherosstate.exe

    1. Run gatherosstate. After a few seconds you should get GenuineTicket.xml
    1. (optional) Remove HKEY_LOCAL_MACHINE\SYSTEM\Tokens from registry.


reg delete "HKLM\SYSTEM\Tokens" /f


Windows Registry Editor Version 5.00


    1. Place the created genuineticket at the root of c:\ and in admin CMD:

clipup -v -o -altto c:\

    1. then force activation with:

cscript /nologo %windir%\system32\slmgr.vbs -ato

DONE. Congrats.

[Archive] Why you should not use Google Cloud.

># UPDATE (2-July-2018):

>Thanks to the people from GCP support team who have reached out and assured us these incidents will not repeat.

>Here’s a direct message from them … “there is a large group of folk (within GCP) interested in making things better, not just for you but for all GCP customers.”

>Follow discussions here.

>HACKERNEWS: https://news.ycombinator.com/item?id=17431609

>REDDIT: https://www.reddit.com/r/programming/comments/8v4wrh/why_you_should_not_use_google_cloud_this_is_about/

>Note: This post is not about the quality of Google Cloud products. They are excellent, on par with AWS. This is about the “no-warnings-given, abrupt way” they pull the plug on your entire systems if they (or the machines) believe something is wrong. This is the second time this has happened to us.


We have a project running in production on Google Cloud (GCP) that is used to monitor hundreds of wind turbines and scores of solar plants scattered across 8 countries. We have control centers with wall-to-wall screens with dashboards full of metrics that are monitored 24/7. Asset Managers use this system to monitor the health of individual wind turbines and solar strings in real time and take immediate corrective maintenance. Development and Forecasting teams use the system to run algorithms on data in BigQuery. All these actions translate directly to revenue. We deal in a ‘wind/solar energy’ — a perishable commodity. If we over produce, we cannot store and sell later. If we under produce, there are penalties to be paid. For this reason assets need to be monitored 24/7 to keep up/down with the needs of the power grid and the power purchase agreements made.

What happened.

Early today morning (28 June 2018) i receive an alert from Uptime Robot telling me my entire site is down. I receive a barrage of emails from Google saying there is some ‘potential suspicious activity’ and all my systems have been turned off. EVERYTHING IS OFF. THE MACHINE HAS PULLED THE PLUG WITH NO WARNING. The site is down, app engine, databases are unreachable, multiple Firebases say i’ve been downgraded and therefore exceeded limits.

Image Text

Image Text

Image Text

It’s a lonely cloud.

Customer service chat is off. There’s no phone to call. I have an email asking me to fill in a form and upload a picture of the credit card and a government issued photo id of the card holder. Great, let’s wake up the CFO who happens to be the card holder.

Image Text

We will delete project within 3 business days.

“We will delete your project unless the billing owner corrects the violation by filling out the Account Verification Form within three business days. This form verifies your identity and ownership of the payment instrument. Failure to provide the requested documents may result in permanent account closure.”

What if the card holder is on leave and is unreachable for three days? We would have lost everything — years of work — millions of dollars in lost revenue.

I fill in the form with the details and thankfully within 20 minutes all the services started coming alive. The first time this happened, we were down for a few hours. In all we lost everything for about an hour. An automated email arrives apologizing for ‘inconvenience’ caused. Unfortunately The Machine has no understanding of the ‘quantum of inconvenience’ caused.

Image Text

You just can’t turn things off and then ask for an explanation.

I understand Google’s need to monitor and prevent suspicious activity. But how you handle things after some suspicious activity is detected matters a lot. You need a human element here — one that cannot be replaced by any amount of code/AI. You just can’t turn things off and then ask for an explanation. Do it the other way round.

This is the first project we built entirely on the Google Cloud. All our previous works were built on AWS. In our experience AWS handles billing issues in a much more humane way. They warn you about suspicious activity and give you time to explain and sort things out. They don’t kick you down the stairs.

I hope GCP team is listening and changes things for better. Until then i’m never building any project on GCP.

Original Article by Punch a Server on Medium

How to get rid of Chrome's most visited when creating a new tab

Google didn't want users to change that. So Google sucks.

Here are some alternative ways:

1. Super Evil New Tab

You can customize your new tab with html + css + js. Yes, it's opensource.

Chrome Store

2. Show Apps in new tab

Just redirect your new tab page to apps page, then move all your apps in to the second page.

Now you get a full background of your theme.

Chrome Store

Java 的一些笔记


Java 字节码(英语:Java bytecode)是Java虚拟机执行的一种指令格式(Java 编译以后的中间形式)。

对 Java 的 Internet 程序设计为何十分重要?

不编译成字节码怎么跑呢(可移植性和安全性) java的Internet程序是J2EE



封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”。 被继承的类称为“基类”、“父类”或“超类”。 继承的过程,就是从一般到特殊的过程。 要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。 在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。


Ø 实现继承是指使用基类的属性和方法而无需额外编码的能力;

Ø 接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;

Ø 可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。

在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee 是一个人,Manager 也是一个人,因此这两个类都可以继承 Person 类。但是 Leg 类却不能继承 Person 类,因为腿并不是一个人。 抽象类仅定义将由子类创建的一般属性和方法,创建抽象类时,请使用关键字 Interface 而不是 Class。 OO开发范式大致为:划分对象→抽象类→将类组织成为层次化结构(继承和合成) →用类与实例进行设计和实现几个阶段。

多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。 实现多态,有二种方式,覆盖,重载。 覆盖,是指子类重新定义父类的虚函数的做法。 重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。 其实,重载的概念并不属于“面向对象编程”,重载的实现是:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。对于这两个函数的调用,在编译器间就已经确定了,是静态的(记住:是静态)。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!真正和多态相关的是“覆盖”。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态(记住:是动态!)的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚邦定)。结论就是:重载只是一种语言特性,与多态无关,与面向对象也无关!引用一句Bruce Eckel的话:“不要犯傻,如果它不是晚邦定,它就不是多态。” 那么,多态的作用是什么呢? 我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。

Java 程序从何处开始执行?

从 main() 开始执行。




// Single Line

/* First Line Second Line */

If 语句和 For 循环的基本形式

If (condition) statement;

For (initialization; condition; iteration) statement; // for (初始化; 条件; 重复) 状态;


{ // System.out.println("Hello World!") }





Java 为什么要严格指定基本类型的取值范围和行为?

Java 严格指定其简单类型的取值范围和行为是为了确保跨平台的可移植性。

Java 的字符类型是什么,与其他大多数程序设计语言的字符类型的不同之处是什么?

Java 的字符类型是 char Java 采用 Unicode 编码格式而不是 ASCII 格式

因为任何非0值都为 true,所以 boolean 值可以取任何想要的值,对吗?



One Two Three

使用一个字符串来显示生成以上输出的 println() 语句。



for (i = 0; i < 10; i++) {
    int sum;
	sum = sum + i;
	System.out.println("Sum is: " + sum);
  1. sum 在 for 循环内会被创建两次(1.创建代码块输入的时候 2.最终销毁的时候),迭代期间无法保存它的值。
  2. sum 在 for 外没有被声明。


i: 先执行自增操作,然后可以将结果用于表达式的其他部分。 i: 先在自增之前获得值。

说明短路 AND 是如何用于防止除0错误的

如果检测到除数为0,那么程序不会继续执行下去。 if (b != 0 && (val / b))...

在表达式中, byte 和 short 升级为什么类型?

byyte -> int short -> int


  • 不兼容的类型之间转换
  • 窄域转换发生时

编写程序找出 2 到 100之间的所有素数。

// Find prime numbers between 1 and 100. public class Prime { public static void main(String args[]) { int i, j; boolean isprime;

    for (i = 2;i < 100; i++) {
        isprime = true;

        // see if the number is evenly divisible
        for (j = 2; j <= i / j; j++)
            // 把每个数的2倍 3倍 4倍都排除
            // 比如 j=2 的时候4 6 8 10……就都可以排除了
            // if it is, then it's not prime
            if ((i % j) == 0)
                // 是否整除就是余数=0
                isprime = false;

        if (isprime)
            System.out.println(i + " is prime.");

} // page 74

关于上面的 for (j = 2; j <= i / j; j++)

So the i loop represents the candidates, and the j loop represents the potential divisors. Take the number 15 as an example of i.

Start j with 2. i/j is 15/2 which is 7. 2 &lt; 7, so we go inside the loop.
    Is 2 a divisor of 15? No, it isn't. Nothing is done.
j is now 3. i/j is 15/3 which is 5. 3 &lt; 5, so we continue.
    Is 3 a divisor of 15? Yes! So set isprime=false.
j is now 4. i/j is 15/4 which is 3. 4 &lt; 3 is false, so we stop.

As you can see, the step with j=3 above set isprime as false, so we do not print it - it is not prime.

Now let's take a real prime number, like 13:

Start j with 2. i/j is 13/2 which is 6. 2 &lt; 6, so we go inside the loop.
    Is 2 a divisor of 13? No, it isn't. Nothing is done.
j is now 3. i/j is 13/3 which is 4. 3 &lt; 4, so we continue.
    Is 3 a divisor of 13? No, it isn't. Nothing is done.
j is now 4. i/j is 13/4 which is 3. 4 &lt; 3 is false, so we stop.

None of the steps set isprime to false. It is still true, so the number 13 is prime and we print it. link: https://stackoverflow.com/questions/29623123/how-does-this-program-for-finding-prime-numbers-work 其实可以写成 for ( j = 2; j <= Math.sqrt(i); j++ )





[Archive] 电信监控并记录网民上网记录原理分析及案例分析

电信网页访问监控原理分析 近段时间,一个在电信上班的朋友经常说,他们有办法知道一个NAT 网关内部的电脑主机 数,而且能够记录里面任何人的上网记录,听得我是心痒痒的,可问他方法,他又死活不说, 郁闷。今天比较闲,脑袋里又想起了这事,想来想去,认为电信很可能采用欺骗客户端的方 法,让客户端的信息首先发到监控主机,然后再发到目标服务器。 为证实推断是否合理,抱着试试的心态,立即在自己的机器上做了以下实验,步骤如下:

  1. 打开机器上的科来网络分析系统。
  2. 添加一个图1 所示的过滤器,为的是只捕获我的机器(和网关 (00:D0:41:26:3F:9E)以及外网的数据通讯,即不捕获我与内部网之间的通讯。

Picture 1

(图1 设置过滤器)

  1. 为减少数据干扰,在关闭本机上运用的其它应用程序后,开始捕获。
  2. 在本机上访问一个网页,这里以访问www.colasoft.com 为例。
  3. 在页面出来后,停止捕获,并开始分析系统捕获到的数据包。
  4. 此次网页访问系统共捕获到了22 个数据包,原始数据包的列表如图2 所示。

Picture 2

(图2 原始数据包列表)

从图2 中可知,编号1,2,3 的数据包是TCP 的三次握手数据包,第4 个数据包是客户端 发起的HTTP GET 请求,后面是服务器端的返回数据。从这些数据包来看, 感觉通讯是正常的,于是切换到矩阵视图,查看通讯的节点情况,如图3。

Picture 3

(图3 访问www.colasoft.com 的矩阵图)

在图3 中,发现了一个奇怪的地址220.167.29.102,由于我此次的操作仅仅只访问了 www.colasoft.com,所以是不应该出现这个地址的。这个220.167.29.102 引起了我的 注意,会不会这个地址在作怪呢? 7. 再切换到数据包视图,发现客户端(的确存在和220.167.29.102 的通讯。 奇怪了,为什么192.168.0.88 会主动和220.167.29.102 进行通讯呢,会不会是有人在 伪造数据包呢?为确定是否存在伪造数据包的情况,我强制显示数据包的IP 层摘要信息, 在图2 所示的数据包视图中,单击右键,在弹出的菜单中选择“数据包摘要->IP 摘要”, 查看这些数据包IP 层的信息,如图4。

Picture 4

(图4 通过IP 层摘要查看220.167.29.102 的伪造数据包)

从图4 可知,TCP 三次握手的服务器返回数据包(编号2)的生存时间是48,而第5 个数 据包的生存时间却是119,同一个服务器返回的两个数据包生存时间差别如此之大,表示 它们经过的路由存在较大的差异,这与正常通讯的状态明显不符,由此我们怀疑编号为5 的数据包可能是某个主机伪造的。 查看该数据包的解码(图4中间,红色圈住部份),发现该数据包是由220.267.29.102发 起的,这表示220.267.29.102主动向192.168.0.88发起了一个欺骗数据包,双击第5个 数据包,打开该数据包的详细解码窗口,如图5。

Picture 5

(图5 伪造的数据包的详细解码信息)

从图5解码信息中可知,该数据包的TCP标记中,同时将确认位、急迫位、终止位置为1, 这表示这个数据包想急于关闭连接,以防止客户端(收到服务器 (www.colasoft.com)的正常响应,它这样做的目的是获取客户端(传 输的数据信息,其获得的信息如图4中的右下角红色圈住部份,这是一个base64的编码信 息,其具体的信息我会在后面进行详细说明。 8. 由于客户端(被220.167.29.102 伪造的数据包5 欺骗,所以它向 服务器(www.colasoft.com)确认并发送一个关闭连接请求的数据包,也就是第6 和第7 这两个数据包 9. 第9 和第10 这两个数据包,也是220.167.29.102 伪造的重置连接数据包,它的目 的是欺骗客户端(关闭连接。 10. 接着,客户端(主动向220.167.29.102 发起TCP 的三次握手,即 第8,11,12 这三个数据包,以和220.167.29.102 建立连接。 11. 13,14,15,17 这几个数据包,是客户端(和220.167.29.102 之间 的数据通讯。从第15 这个数据包的解码中,可以清楚地看到220.167.29.102 将重 新将访问重定向到www.colasoft.com,从而让客户端( ) 向 www.colasoft.com 再次发起页面访问请求,以让客户端(完成正 常的网页访问,其解码如图6。

Picture 6

(图6 向192.168.0.88 发起的数据包)

  1. 16,18,19 是客户端(向服务器(www.colasoft.com)发起三次握 手数据包。
  2. 20,21,22 是三次握手成功后,客户端和服务器正常的HTTP 通讯数据包,也就是传递 客户端所请求的页面,这里是www.colasoft.com。
  3. 查看会话,选择TCP,发现此次的网页访问共连接起了3 个连接,如图7。这三个连 接的TCP 流重组信息分别如图7,8,9,通过流的重组信息,我们也可以较为清楚地看 到客户端和服务器(www.colasoft.com),以及客户端和220.167.29.102 之间的 数据通讯信息。

Picture 7

(图7 此次网页访问产生的三个TCP 连接及第一个连接的TCP 流信息)

图7中,客户端(向www.colasoft.com发起GET请求,但从服务器端返 回的数据可知,返回服务器是220.167.29.102,且带了一串base64编码的参数, “ABcHJvdmluY2VpZD04Jm随机删除部份 MTIwNDExJnNvdXJjZXVybD13d3cuY29sYXNvZnQuY29tLw==”, 对其进行反编译后的内容如下: “provinceid=8&cityid=2&classid=1000541&username=adsl拨号用名 &sourceurl=www.colasoft.com/” 注意:上面的红色删除部份和adsl拨号用户名已经过笔者更改。 这里很清楚了吧, 主动欺骗客户端让客户端告诉220.167.29.102 自己 的相关信息。客户端在收到此请求后, 由于不知道被欺骗, 所以它会立即主动和 建立连接,并发送相关信息给220.167.29.102,从而导致信息被电信 监控,让电信可以轻易的知道我们的网页访问情况。

Picture 8

(图8 欺骗客户端的TCP 流信息)

图8 即客户端(主动向220.167.29.102 发起的连接,并告知其相应的 信息。在图中的下面我们可以看到, 在收到相应的信息后,再次强客户 端的请求重定向到www.coalsoft.com,即用户需要访问的页面。

Picture 9

(图9 客户端和www.colasoft.com 第二次连接的TCP 流信息)

图9 即是客户端在被220.167.29.102 欺骗后,再次向www.colasoft.com 发起GET 请 求,且服务器正常返回数据的信息,这让电信在不知不觉中完成了对用户网页访问的监控。 至此,访问www.colasoft.com 的过程全部分析完毕。从该分析中,我们明白了电信监控 我们普通用户访问网页的具体方法,其访问流程如图10 所示。

Picture 10

(图10 客户端实际的访问流程图)

  1. 客户端主机(向www.colasoft.com 发起正常的访问网页请求。
  2. 监控服务器(这里是220.167.29.102,不同地方该服务器可能不同)就立刻向客户 端发起一个伪造数据包,这个数据包的源地址被伪造成客户端请求的服务器地址,同时 该数据包的内容是预先设定好的。
  3. 客户端主机在收到该数据包后,以为是服务器端返回的,于是它根据收到的伪造数据包 的要求,主动向220.167.29.102 发起连接,并向220.167.29.102 传输一些客户 端的私人敏感信息,如客户端的拨号用户名、访问的网址、NAT 内网主机数等信息。
  4. 再次将访问重定向的指令发给192.168.0.88。
  5. 客户端根据第4 步中收到的指令,再次向www.colasoft.com 发起正常的访问网页请 求。
  6. www.coalsoft.com 将客户端请求的页面传给客户端(,让客户端成 功完成网页访问。 以上便是电信网页访问监控原理的简单分析过程,注意实验的环境是内部通过NAT 方式, 并使用ADSL 拨号上网,对于其它的连接方式以及其它的ISP 接入,由于没有相应的环境, 并未进行测试。 CSNA 网络分析论坛 菜鸟人飞 2006 年4 月21 日