Windows的EXE文件,何时自动添加盾牌(UAC)小图标

开启了UAC后,很多exe程序就给自动标识了UAC小盾牌图标。

到底Windows系统是如何判定呢?

参见:Windows Vista Application Development Requirements for User Account Control (UAC)

老应用程序,大致这么判断:

  • Filename includes keywords such as “install,” “setup,” and “update.”
  • Keywords in the following Versioning Resource fields: Vendor, Company Name, Product Name, File Description, Original Filename, Internal Name, and Export Name.
  • Keywords in the side-by-side application manifest embedded in the executable.
  • Keywords in specific **StringTable** entries linked in the executable.
  • Key attributes in the resource file data linked in the executable.
  • Targeted sequences of bytes within the executable.

说白了就是,对老程序,Windows既没有“沙盒”运行来判定程序所需权限,也不会静态反汇编分析程序权限,只是根据一些特征字判断……

新程序,大概需要:

When developing new installation programs, much like developing programs for Windows Vista, be sure to embed an application manifest with an appropriate requestedExecutionLevel element (see Step 6: Create and Embed an Application Manifest in downloadable Help file). When the requestedExecutionLevel is present in the embedded application manifest, it overrides Installer Detection.

最近很火的益智玩具--迷宫大追捕的谜题穷举(02)

解决类似Scott骨牌谜题,有个比较快速的方法:

Dancing Links aka 跳舞链

这个算法产生自1979年(没错,那会时间戳还很短呢)。主要目标就是搜索特定0,1矩阵中的一些行,这些行“叠加”起来,可以保证每一列有且只有一个1。

基于双向链表的一个特点:

1
2
3
4
5
6
7
删除一个节点:
x.left.right ← x.right;
x.right.left ← x.left;
恢复刚被删除的节点:
x.left.right ← x;
x.right.left ← x;

对一个由双向链表组成的矩阵,利用上面的特点可以快速删除、恢复一个节点乃至一整行or一整列。

这样,利用递归,就可以在搜索中轻易舍弃某些行、列,然后在搜索结束后,迅速的恢复现场。

具体的原理,参考这个

Wiki

中文翻译(PS:很好的翻译,虽然排版方式老旧点,单绝对用心)

OK,在了解DLX后,对我们的谜题–迷宫大追捕,如何搞定呢?

继续阅读···

最近很火的益智玩具--迷宫大追捕的谜题穷举(01)

最近这个玩具很火,娃也很喜欢。质量也不错,塑料一看就比较高级,手感好,无味道,还挺皮实。

购买链接:点这里

先领红包:点这里

在聪明伶俐的程序员带领下(某些人还不如娃玩的好),娃很快把60个基本谜题和60个高级谜题做完了(偷看答案次数也不少)。

200多块钱的玩具,难道1个月就作废?不能够……

继续阅读···

hexo插入Youtube视频

hexo写文章的时候,插入视频很简单,在YouTube的“共享”中,选择嵌入即可获取类似这样的链接:

1
<iframe width="100%" height="100%" src="https://www.youtube.com/embed/P2r9U4wkjcc" frameborder="0" allowfullscreen></iframe>

Android的官方ADB独立绿色套件

之前都是从网上下载”绿色“版。总有那么点不放心。

现在Google发布了官方版本,自带changelog,方便的很。

这里是访问连接:点此访问

当然,直接下载最新版也可以:

系统 下载地址
Windows 点此
Mac 点此
Linux 点此

考虑到以上网址需要翻墙,有人无法访问,这里给出网盘链接:

更新日期 : 2017/12/04

链接: https://pan.baidu.com/s/1jIrJjc6

密码: zasp

flask的数据库操作-防范sql注入

最近写代码,用flask的次数比较多。

这货还真是挺好用的,简单方便。

不过,写web程序,一切用户数据都是脏数据,需要防范各种攻击(xss啦,sqlinjection啦)。

sql注入(sql injection)是最最常见的web攻击方式了。查看

刚熟悉写flask的时候(其实也就是几天前),代码都是这样的:

1
2
3
con = get_db()
c = con.cursor()
c.execute("update user set email='{}',password='{}'".format(email,password))

看起来就怪怪的……

果然,查阅文档后:

Security Note

Be sure to use question marks when building SQL statements, as done in theexample above. Otherwise, your app will be vulnerable to SQL injection when you use string formatting to build SQL statements.See Using SQLite 3 with Flask for more.

所以说,还是这种方式会安全:

1
2
3
con = get_db()
c = con.cursor()
c.execute("insert or IGNORE INTO user (email,password,level) values (?,?,1)" , [email,password])

算是个小tips吧~

ShadowSocks自助系统使用教程

服务器被封,已经停止发放了……

最近share给别人的shadowsocks账号被滥用。流量一扫光……md,2T啊……

不得已,需要分隔账号并控制流量。

之前看shadowsocks的manager功能,感觉可以,也自己定制了点功能,于是就花了些时间自制了个自助系统。

(额,重新做轮子的原因是,类似系统都是收费用的,修改太麻烦了,自己做反而简单)

以下是自助系统的简单教程。前端苦手,勿喷,为这货特意学了点BootStrap库(这货有点玄学……)

继续阅读···

Shadowsocks的Manager功能

shadowsocks的代码中,包含了Manager功能。可以:

  • 动态增删端口
  • 接收统计信息
  • 检测运行状态(心跳)

大概的启动方式,就是指定--manager-port。然后ss会进入manager mode,并在manager-port上启动一个UDP服务,等待命令。

命令格式大概就是command: {json}

所以,可以比较自由的添加功能。

如:

  • 每端口的流量统计信息(单独查询)
  • 动态更改密码(删除后重新加载)

这块蛮好玩的,试试看~

Win10下打开telnet功能

昨天调试一个tcp的控制协议,懒得自写测试程序。反正是基于字符串的协议,telnet理论就够了。

可是,nnd,win10竟然没有默认安装这货! 用putty,情何以堪……

1
dism /online /Enable-Feature /FeatureName:TelnetClient

以上命令输入到命令行(管理员权限的),即可打开win10的自带telnet功能。

继续阅读···

Win10微软输入法调教

老实说,现在输入法真的很不让人放心,一不小心就给大数据了。

IME在windows系统中,是天然的键盘logger。国内厂商的操守让人着急……

Win10中自带的微软输入法,问题起始不少,但是调教下,也能使用。

主要就是词频调整和记录之前输入的功能需要加强下。

继续阅读···

SQLite的Online Backup备份处理

SQLite的python自带接口里面,是没有在线备份功能的。

所以,一般来说,备份方案使用这种方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import sqlite3
from StringIO import StringIO
def init_sqlite_db(app):
# Read database to tempfile
con = sqlite3.connect(app.config['SQLITE_DATABASE'])
tempfile = StringIO()
for line in con.iterdump():
tempfile.write('%s\n' % line)
con.close()
tempfile.seek(0)
# Create a database in memory and import from tempfile
app.sqlite = sqlite3.connect(":memory:")
app.sqlite.cursor().executescript(tempfile.read())
app.sqlite.commit()
app.sqlite.row_factory = sqlite3.Row

大概的核心,也是使用connection的iterdump功能。

不过,如果引用一个库,sqlitebck,使用起来会简单很多。

1
$ pip install sqlitebck

调用接口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# Basic usage example - memory database saved into file:
>>> import sqlite3
>>> conn = sqlite3.connect(':memory:')
>>> curr = conn.cursor()
# Create table and put there some data:
>>> curr.execute('CREATE TABLE foo (bar INTEGER)')
<sqlite3.Cursor object at 0xb73b2800>
>>> curr.execute('INSERT INTO foo VALUES (123)')
<sqlite3.Cursor object at 0xb73b2800>
>>> curr.close()
>>> conn.commit()
>>> import sqlitebck
# Save in memory database (conn) into file:
>>> conn2 = sqlite3.connect('/tmp/in_memory_sqlite_db_save.db')
>>> sqlitebck.copy(conn, conn2)
>>> conn.close()
>>> curr2 = conn2.cursor()
# Check if data is in file database:
>>> curr2.execute('SELECT * FROM foo');
<sqlite3.Cursor object at 0xb73b2860>
>>> curr2.fetchall()
[(123,)]
# If you want to load file database into memory, just call:
>>> sqlitebck.copy(conn2, conn)

另,为了提高性能,sqlite的内存数据库名字,可以使用保留的:memory:

真★随机数-Random.org

一般编程,使用的随机数大多是伪随机。Random.org提供在线的真随机数服务。

种类很多,大致说说:

  • 范围内的随机整数
  • 给定字符串序列乱序输出
  • 随机图片
  • 字符串随机生成
  • 密码服务
  • ……

网络获取也比较简单:

1
2
curl "https://www.random.org/integers/?num=1&min=1&max=100&col=1&base=10&format=plain&rnd=new"
>> 16

当然,也可以用比较正规的api服务:api.random.org

估计到今年(2017)年中收费。

PS:年会抽奖就用这个东西。保证公平公正。(网站提供数字签名服务,铁证)

京东联盟推广多了一个协议选项

看看吧,如果是使用phantomjs的话,就需要多加一些点击事件。

1
2
3
4
5
driver.find_element_by_id("adtType_4").click()
driver.find_element_by_xpath("//div[@id='adtTypeDiv']/div/label[4]").click()
driver.find_element_by_id("protocol_1").click()
driver.find_element_by_xpath("//div[@id='protocollDiv']/div/label[1]").click()

用python的requests的话,就需要在post里面,添加新字段。

1
protocol=2