5
14
2018
24

Windows 10 中配置网络共享

有一个很讨厌的公司叫「深信服」,英文名叫「Sangfor」。它开发的私有协议的 SSL VPN 客户端 EasyConnect 终于支持 Ubuntu 了,然而我没能在 Arch Linux 上正确地把它跑起来。图形界面是 electron 之类的,这部分没有问题。但有一个会往 /usr/share 下写日志的 root 进程,应该是负责真正的 VPN 创建的,死活连不上。

那么就在 Windows 虚拟机里跑吧。所以我的 Linux 系统需要通过 Windows 访问部分网络了。只是 HTTP 的话倒是可以装个 HTTP 代理搞定,但是我还要连 ssh 的。

正文开始了。其实整个过程并不难,关键在于很难找到资料。

首先,当然是给 Windows 一张 host only 的网卡,用于两个系统之间的连接。以及,把那个 VPN 连上。

然后,打开「网络设置」,选择「更改适配器选项」。右键单击要共享的网络适配器(比如此例中是那张 Sangfor VPN 的网卡),选择「属性」。

选择「共享」选项卡,把第一个框给勾选上,下边下拉菜单选择那张 host only 的适配器。确定。

就这样,OK 了。

Windows 10 中配置网络共享

要注意的是,此操作会将网卡的 IP 强制设置为「192.168.137.1」。就像图中可以看到的那样,微软总喜欢「提供策略,而非机制」。假定你是给你的家庭共享。假定你要共享的是 Internet 连接(本例中其实是 VPN 连接)。所以它也假定了你的「家庭」网络中 Windows 可以随意选择 IP 地址,假定你需要 DHCP 服务。

Linux 这边配置起来就容易多了。Virtualbox 的 vboxnet0 接口本来用的是 192.168.56.0/24 网段,但是给它配置另外的 IP 地址,往它里边扔它不了解的目标地址的包,它也不介意的。

sudo ip a add 192.168.137.2/24 dev vboxnet0
sudo ip r add 172.16.2.9/32 via 192.168.137.1

以上给 vboxnet0 添加了 IP 地址,并且让需要走 VPN 的目标地址(172.16.2.9)走 Windows 的网络。

PS: 开着防火墙的话,Windows 10 默认是忽略 ping 的。在防火墙的「入站规则」里启用「文件和打印机共享(回显请求—ICMPv4-In)」之后才能 ping 它。

另见阿森人的《伪·如何在 Linux 下使用深信服 SSL VPN》一文。

Category: 网络 | Tags: 微软 windows 网络
1
18
2018
9

嗨 Win10,这是我的浏览器

因为腾讯的关系,不得不使用 Windows。不是QQ也不是RTX,这次 Wine 帮不上忙了。那好吧,SSD + 16G 内存,跑个 Windows 虚拟机也没多大问题。

但是问题来了:我在虚拟机里每次点击链接,会调用安装于 Windows 上的浏览器来访问。可是我登录了各种工作账号的浏览器在外面的自由世界 Linux 主系统里啊。

办法也好想:来一个远程调用,让 Windows 调用咱自己的程序打开链接,然后咱自己的程序再把链接传给外面的 Linux 就好了。理想是美满的,可是 Windows 里设置默认浏览器并不是写个 .desktop 文件那么简单!

在 Google 上找了半天资料(真的花掉了半天!),最终终于确认,需要设置以下一大堆注册表键,Windows 才会认可咱自己的浏览器:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\RemoteBrowser]
@="RemoteBrowser"

[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\RemoteBrowser\Capabilities]
"ApplicationName"="RemoteBrowser"
"ApplicationIcon"="C:\\RemoteBrowser\\launch.exe,0"
"ApplicationDescription"="RemoteBrowser"

[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\RemoteBrowser\Capabilities\StartMenu]
"StartMenuInternet"="RemoteBrowser"

[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\RemoteBrowser\Capabilities\URLAssociations]
"https"="RemoteBrowserHTML"
"http"="RemoteBrowserHTML"
"ftp"="RemoteBrowserHTML"

[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\RemoteBrowser\DefaultIcon]
@="C:\\RemoteBrowser\\launch.exe,0"

[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\RemoteBrowser\InstallInfo]
"IconsVisible"=dword:00000001
"ShowIconsCommand"="\"C:\\RemoteBrowser\\launch.exe\" --show-icons"
"HideIconsCommand"="\"C:\\RemoteBrowser\\launch.exe\" --hide-icons"
"ReinstallCommand"="\"C:\\RemoteBrowser\\launch.exe\" --make-default-browser"

[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\RemoteBrowser\shell]

[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\RemoteBrowser\shell\open]

[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\RemoteBrowser\shell\open\command]
@="\"C:\\RemoteBrowser\\launch.exe\" \"%1\""

[HKEY_LOCAL_MACHINE\SOFTWARE\RegisteredApplications]
"RemoteBrowser"="SOFTWARE\\Clients\\StartMenuInternet\\RemoteBrowser\\Capabilities"

[HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice]
"Progid"="RemoteBrowserHTML"

[HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\https]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\https\UserChoice]
"Progid"="RemoteBrowserHTML"

[HKEY_CLASSES_ROOT\RemoteBrowserHTML]
@="RemoteBrowser"
"FriendlyTypeName"="RemoteBrowser"
"URL Protocol"=""
"EditFlags"=dword:00000002

[HKEY_CLASSES_ROOT\RemoteBrowserHTML\DefaultIcon]
@="C:\\RemoteBrowser\\launch.exe,0"

[HKEY_CLASSES_ROOT\RemoteBrowserHTML\shell]
@="open"

[HKEY_CLASSES_ROOT\RemoteBrowserHTML\shell\open]

[HKEY_CLASSES_ROOT\RemoteBrowserHTML\shell\open\command]
@="\"C:\\RemoteBrowser\\launch.exe\" \"%1\""

相比之下 Linux 只需要以下这么几行:

Version=1.0
Name=Firefox
GenericName=Web Browser
Comment=Browse the Web
Exec=/usr/lib/firefox/firefox %u
Icon=firefox
Terminal=false
Type=Application
MimeType=text/html;text/xml;application/xhtml+xml;application/vnd.mozilla.xul+xml;text/mml;x-scheme-handler/http;x-scheme-handler/https;
StartupNotify=true
StartupWMClass=Firefox
Categories=Network;WebBrowser;
Keywords=web;browser;internet;

(不过真实的 firefox.desktop 有三百多行,因为各种语言的名字和描述的翻译。)

上边那个注册表文件,引用了一个 exe 文件,和里边的一个图标资源。我不知道图标使用独立的文件可不可以。加个图标并不难,上网搜一下就有了,使用 windres 命令即可。

首先准备好图标文件 icon.ico,然后写一个资源文件:

1 ICON DISCARDABLE "icon.ico"

用 windres 把它编译成 COFF 文件。因为我是在 Linux 上使用 mingw 操作,所以使用的命令叫 x86_64-w64-mingw32-windres。然后把它和其它目标文件链接到一起就可以了。因为我使用的是 Rust,它的 build.rs 脚本不支持目标文件,所以先打包成静态库,然后再链接:

x86_64-w64-mingw32-windres launch.rc -O coff -o icon.res
x86_64-w64-mingw32-ar q libres.a icon.res

然后 build.rs 脚本里说一下:

fn main() {
  println!("cargo:rustc-link-search=native=..");
  println!("cargo:rustc-link-lib=static=res");
}

然后咱的主程序,通过 TCP 把链接发到 Linux,以及 Linux 端的服务,接收链接并打开浏览器,因为很简单很常规,所以这里就不列出来了。有兴趣的去源码仓库看就好了。

exe 编译好之后,扔到之前注册表文件里提及的地方就好。然后双击那个注册表文件将其导入。接下来在默认软件的设置里就能够找到我们的「Remote Browser」了(虽然不知道为什么没有显示指定的名字,而是 exe 文件名)。

另外,那个图标资源,也可以使用 Resource Hacker 把图标文件给弄到 exe 文件里边去。

最后一步,写个用户级的 systemd 服务,把负责在浏览器里打开链接的程序给跑起来~


仓库地址在此。喜欢的话,记得 star 哦~

Category: Linux | Tags: windows 浏览器
10
26
2015
52

使用 Wine 运行 QQ 轻聊版

2021年07月11日更新:轻聊版已经不可用。

截图

Wine QQ 轻聊版 7.5

注:图中的文字方框已经解决。

安装使用

测试过的 Wine 版本为 1.7.52、1.7.54。1.7.53 是坏的。1.6 系列大概跑不起来。

Wine 环境下载地址签名,使用的新 key)。压缩包中安装的是官方完整版的 QQ 轻聊版 7.7(安装文件名 QQ7.7Light.exe)。

文件最后更新于2016年1月29日

  1. 下载文件并解压、找个地方放好(移动之后启动图标会失效)。
  2. 如果系统上没有 simsun.ttc 字体,去网上下一个放到 ~/.fonts 中。或者到解压出来的 Wine 环境里 winetricks fakechinese 也行。
  3. 运行解压出来的目录下边的install-icon.sh脚本来安装启动图标

安装好之后,在你通常找所有已安装的应用程序的地方就可以找到「Wine QQ 轻聊版」的启动图标了。你也可以运行解压出来的目录下边的qq脚本来启动,但必须在那个目录下运行。

在火狐里点击「加入QQ群」之类tencent://协议的链接时,也是可以调用到的哦~不过即使已经登录,也会开启新的 QQ 登录界面。但是不这样又会有更严重的问题,所以凑合着用吧。

其它调整,如使 QQ 无限制地访问文件系统(默认只允许访问 C 盘)、更改一些文件的存放位置、字体选择与渲染选项,请自行修改。想要 Flash 的也请自己 winetricks 安装。

已知问题

  • 记不住密码
  • 密码框需要耐心地点几下才能开始输入
  • 表情图片只有启动后的第一次使用时正常,之后弹出窗口的内容不能正常显示
  • 窗口周围部分的显示不正常(可能和 Awesome 有关)
  • 使用 Windows 内建的移动窗口功能(拖动窗口边框、标题栏)时可能会导致窗口开始避开鼠标指针(可能和 Awesome 有关)
  • 部分群文件下载能够成功,但是界面上看到的进度一直是0字节未完成状态(比较小的文件不受影响)

制作步骤

由于之前的 TM2013 已经很久没更新了,有很多功能都跟不上(比如群公告、语音消息等),所以我又 Wine 了新版本。QQ 轻聊版感觉就是 QQ 标准版去掉了广告,不用付费开通会员来去掉那些干扰广告了。

首先 winetricks 一下:

winetricks sandbox riched20

然后把 Windows 版本设置为Windows 8.1(大于 XP 即可)。不设置安装不上,因为缺少CmRegisterCallback函数。

将 QQ7.5Light.exe 安装文件链接到 C 盘内,安装。

再打开 winecfg,作如下设置:

  • 设置 Windows 版本为 Windows XP
  • 「增加程序设置」,找到 drive_c/Program Files/Common Files/Tencent/QQProtect/Bin/QQProtect.exe 文件,设置其版本为 Windows 8.1(不然会出错)
  • 回到「默认设置」,切换到「函数库」标签,添加「txplatform.exe」「函数库顶替」,并且设置为「禁用」

禁用 TXPlatform.exe 会导致tencent://链接不能在已有的 QQ 里打开。但是启用它会导致登录不了或者退出不了(卡住)的情况。

从 Windows 上复制 iphlpapi.dll,放到 system32 目录,并设置原装优先,以绕过「查找」对话框打开时卡死的问题。

修改system.reg注册表文件,设置 Tahoma 的 FontLink 项(不然部分文字乱码):

[Software\\Microsoft\\Windows NT\\CurrentVersion\\FontLink\\SystemLink] 1420549548 0
"Tahoma"="simsun.ttc,SimSun"

当然你也可以把这里的宋体替换成你想要的任何字体。

另外,这里有人在制作并维护 Wine QQ 精简版。

2015年11月12日更新:更新到 QQ 轻聊版 7.7。旧版用户以 Windows 8.1 版本号来运行 7.7 的安装程序即可更新。

旧的 QQ 轻聊版 7.5 Wine 环境下载地址签名,使用的新 key)。压缩包中安装的是官方完整版的 QQ 轻聊版 7.5(安装文件名 QQ7.5Light.exe)。

2016年3月5日更新:请禁用QQProtectUpd.exe或者将drive_c/Program Files/Common Files/Tencent/QQProtect目录及其下的所有文件设置为只读(chmod -R -w 目录),以免 QQ 自动后台更新之后崩溃。

Category: Linux | Tags: linux windows QQ wine 腾讯
3
24
2013
24

使用 Wine 运行腾讯 TM

TM 是腾讯出品的一款与 QQ 互通的即时通讯产品。用起来就是瘦过身、去过广告的 QQ。TM2009Beta3.4 是目前最新的、也是唯一能够正常使用的 TM 版本。目前最新版本为 TM2013preview1,按如下方法也可使用。TM官网。最新的 preview2 版本无法安装,请使用此地址下载 preview1 版本。

我这里使用的是 Wine 1.5.26。相比之前我运行修改版 QQ 2010 时使用的版本,此版本在 TM 输入密码时不会崩溃、没有黑影等。在线后数秒内自动变成离开状态的问题依然存在。

不像 Winhex 或者 Beyond Compare,TM / QQ 并无法在 Wine 上直接运行,需要使用 winetricks 命令安装一些东西。细节如下:

首先,因为需要使用 winetricks 安装一些东西,为干净考虑,可为 TM 设置单独的 prefix,即

$ export WINEPREFIX=$HOME/.wine4tm

我这里是 64 位的 Arch Linux,因此需要设置 Wine 使用 32 位 Windows 环境:

$ export WINEARCH=win32

注意这种情况下,不要建立未初始化的$WINEPREFIX目录。运行一下winecfg什么的,让 Wine 自己建立之。

因为是 32 位环境,所以有些库可能需要手动安装,比如 Arch 下我手动安装了以下 32 位库:

lib32-libpng lib32-libjpeg-turbo lib32-mpg123 lib32-libxml2

初次运行某个 exe 文件时,注意下终端的输出。如果其中提到某个.so文件没有找到,那么就手动安装上吧。Arch 下查询需要安装的包的方法是,使用 pkgfile 命令查询该文件名,如:

$ pkgfile libpng15.so.15
extra/libpng
multilib/lib32-libpng

lib32-开头那个即是需要安装的软件包。安装之后并不需要重新运行该 exe 文件,除非它已经导致了问题。

lib32-libpng不安装会导致部分界面显示异常,lib32-libjpeg-turbo不安装可能导致好友发送的图片无法显示。

然后使用 wine 运行 TM2009Beta3.exe 这个安装文件。同时可以开始 winetricks 相关工作。

需要使用 winetricks 安装的组件如下:

  1. riched20

    此组件将解决登陆成功后 TM 崩溃的问题。相关bug报告在此。

  2. ie6

    此组件将解决编辑消息时的崩溃。其错误消息为:

    ###!!! ABORT: Main-thread-only object used off the main thread: file /build/wine-mozilla-1.9/xpcom/base/nsCycleCollector.cpp, line 1151
    

    从 winetricks 提供的地址下载 ie6 很慢,并且有些限制。可以通过 Google 搜索「msie60.exe」得到另外的下载链接,比如这个

  3. mfc42

    此组件将解决启动时 TM 界面中的黄条警告,以及其它一些问题。

安装完毕后,在点击链接时 winebrowser 会崩溃。使用 Wine 内建的「urlmon.dll」即可。设置方法是,打开winecfg,切换到「函数库」选项卡,在「已有的函数库顶替」中编辑「urlmon.dll」项,设置其使用「内建」版本。

搞完这些,TM2009 就可以使用啦!来张高清全屏截图——

已知问题:

  • 截图仅能截取一个屏幕。快捷键仅在 Wine 程序拥有焦点时可以工作
  • 接收图片时的动画不正常
  • 输入法光标跟随无效。fcitx 输入框总是位于输入框下方(这里有补丁,据说可以修正这个问题)
  • 在 Awesome 下(特别是双显示器的扩展屏上时),鼠标拖动窗口上边缘可能导致窗口乱跑
  • 可能会卡死(线程死锁,wine 的已知 bug),特别是在打开聊天记录时
  • Awesome 下最大化等同于全屏,wibox 被遮挡
  • 数秒后会自动变成离开状态此问题已经在 Wine 1.7.6 中修复

语音和视频暂未测试。远程协助基本正常。

重要提示:TM 的截屏图片是以 JPEG 格式发送和显示的,会造成截图模糊、失真。(尽管截屏并保存的话是 PNG,从其截屏功能或者从剪贴板粘贴的、发送到会话的图片是 JPEG。)常见的可接受的截图格式只有 PNG、GIF 或 BMP。JPEG 只适合照片这种取自自然而非生成的图像。

Category: Linux | Tags: linux QQ windows wine TM 腾讯
3
18
2013
16

使用 cx_freeze 打包 Python 程序

首先,当然是给一个目标系统安装 cx_freeze。虽然 cx_freeze 是跨平台的,但没发现它支持在一个平台上打包出另一个平台的二进制文件,而且那样还得准备那个平台上的库文件。我的目标平台是 Windows XP,所以还要准备一个 Dependency Walker

其次,使用cxfreeze-quickstart向导生成配置文件setup.py。当然,如果已经有setup.py文件的话直接修改就是了。下边是一个示例:

import sys

from cx_Freeze import setup, Executable

# Dependencies are automatically detected, but it might need
# fine tuning.
buildOptions = dict(
  packages = [], excludes = [],
  include_files = ['images', 'data.sqlite'],
)

name = 'example'

if sys.platform == 'win32':
  name = name + '.exe'

base = None
if sys.platform == "win32":
    base = "Win32GUI"

executables = [
  Executable('main.py', base = base, targetName = name,
             compress = True,
            )
]

setup(name='Example',
      version = '1.0',
      description = 'An example program',
      options = dict(build_exe = buildOptions),
      executables = executables)

当然,这里有不少我改过的地方。在buildOptions变量中我加了data.sqlite文件和images目录到include_files中去。它们会被放到生成的二进制文件相同的目录。

cx_freeze 在打包 Windows 可执行文件时并不会像 gcc 那样自动添加.exe后缀,所以我要手动加上。

Executable的调用中,要写成base='Win32GUI'这样子。cxfreeze-quickstart目前直接写在第二个参数的位置上的方法是不对的。base的默认值是Console,在 Windows 下运行时是会出现黑色的cmd.exe窗口的。参见StackOverflow: Hide console window with wxPython and cxFreeze

这样还没有完成。打包后测试发现PyQt4.QtNetwork的库文件没有打包进去,可能是因为它是从共享库中引用的,cx_freeze 没有检测到这个依赖。在程序中 import 一下就可以了。另外一个问题是,在没有安装相关库的干净的目标系统上执行时还遇到以下错误信息:

DLL load failed: 找不到指定的模块
DLL load failed: The specified module could not be found.

其上还有一个 Traceback。这是因为有些(据说主要是 Microsoft Visual C++ Redistributable 的) DLL (非 Python 模块)没有被打包进去。从 Traceback 中找到引发这个错误的 DLL(或者 pyd)文件名,将其在打包系统中使用前边提到的 Dependency Walker 打开,在左边的树形库列表中找到目标系统上可能没有的库文件,将其复制到 cx_freeze 生成二进制文件的目录中即可。比如我这里需要手动添加msvcr100.dllmsvcp100.dll

最后,打包过的程序执行时__main__模块是没有__file__属性的,所以无法通过这个变量来切换到程序所在的目录,进而读取自己的数据文件。但是,打包过的程序有sys.frozen属性,程序自身的路径存放在sys.executable中,所以程序中需要作下判断:

import os
import sys

if hasattr(sys, 'frozen'):
  me = sys.executable
else:
  me = __file__
mydir = os.path.dirname(me)

参见StackOverflow: How do I get the path of the current executed file in python?

最终打出来的可执行文件和库文件比较大,PyQt 程序总共有 40M 之多。使用 7z 压缩之后能减小到 10M 多。

Category: python | Tags: python windows
6
11
2012
11

rpysh——Windows Python 命令行也要 readline!

rpysh 是为习惯 Linux 的 Pythoners 在不得不处理 Windows 上的事务时写的远程 shell。

源起

前些天,我尝试了使用 Python 控制 Word。但我对 Windows 下的交互式 Python shell 很不满意。

首先,我尝试的是 cmd.exe 那个黑窗口。太难用了!只有最基本的行编辑、在不知不觉中历史记录被窜改、复制粘贴极其麻烦。补全当然也是没有的。

于是,尝试 IDLE。这家伙我选了「IDLE Classic Unix」,但是能工作的键并不多。比如我刚刚尝试的Ctrl-u就不管用。而Ctrl-p竟然是把光标向上移动,回车才会把那行的内容取到输入命令的那行。这样一来,想再次执行最后一条语句,需要视上条命令输出的行数按几下Ctrl-p。另外,鼠标在窗口内点击后光标会被移开。这样,我使用鼠标从其它窗口切回来时,还得再手动定位光标,极其不爽。至于补全么,太智能了,所以在我输入时不时会出现这种情况:

乱七八糟的补全

还有一个问题:我查资料、做笔记、写代码都在 Linux 上,虽然Ctrl-CCtrl-V在物理机和虚拟机间能够无缝操作,但比起选中+中键粘贴的 X 主选区还是麻烦多了!

没办法,我只好重拾很久以前的想法——写个程序,在 Linux 上操作,在 Windows 上执行!

——等等!这和 ssh 差不多吗?或者 telnet?

——不不,Cygwin 的 ssh 跑不了 Windows 控制台程序,而且,不还是没 readline 支持么?

实现

毫无疑问是网络通信了。距离上一次不成功的尝试已经过去很久了,我不仅更加了解了code模块的能力,也知道 Python 命令行补全是怎么回事了。也就是说,Windows 版的 Python 是有补全的接口的,只是没有 readline 的等价物来调用。跑在 Windows 上的服务端要完成以下操作:

  1. 重写相关方法,把用户数据由标准输入改到从客户端读取
  2. 标准输出重定向到网络 socket
  3. 收到客户端的补全请求后,使用rlcompleter模块获取补全结果,再回送给客户端

对于第一点,实际上取代code.InteractiveConsole实例的raw_input方法就行。它和内建的input()函数具有相同的输入和输出形式,也就是会接收命令提示符。将这个直接发给客户端好了。

第二点很简单,直接socket.makefile然后把sys.stdout指过去。

第三点,为了简单起见,我另开了个线程和 socket,专门用于补全。需要传递的参数和返回值全部 pickle 了扔给对方就是了。

写完这些我才发现,其实我的raw_input方法和补全函数具有相似的执行逻辑:发送参数到网络,再从网络获取执行结果——也就是远程过程调用呵。

使用方法

rpyshd.py可选一个参数作为端口号,为方便起见,提供默认值8980。也是为了方便双击执行起见,我添加了.py后缀。

rpyshc相当于telnet命令了,直接接主机地址和端口号两个参数即可。

缺陷

  • 从标准输入读数据时在服务端
  • 偶尔提示符出现不及时
  • 虽然我实现了Ctrl-C,但是实际上没什么用,因为收到消息时之前的操作肯定已经执行完了
Category: python | Tags: linux python readline windows
5
12
2012
0

用 Python 控制 MS Word 之手册在哪里

通过 pywin32 模块使用Python來控制MS Word的文章不少,可是看过后我发现他们有一个共同的问题:参考手册在哪里?

因为是通过 COM 接口进行通信的,不能使用help()或者dir()命令来获取 API 帮助,所以迫切地需要详细的文档,才能知道那些对象拥有的属性和方法。我在网上尝试找了 VBA 的参考手册,这个微软倒是有,但没找到离线版。虽说有也多半是 Windows 专用程序来阅读,颇为不便,但至少不受制于网络嘛。最后找来找去,原来 Word 2010 自带了!一如既往地隐蔽哦。点右上角的帮助图标出现「Word 帮助」窗口后,点「搜索」按钮的下拉箭头,选择「开发人员参考」,里边那个「Word 2010 开发人员参考」就是了。

「开发人员参考」菜单项

别问不同的帮助主题和「搜索」有什么关系,也别问「Visual Basic 语言参考」和「Microsoft 窗体参考」为什么会在这里。微软一向是忽视逻辑的。

另外,工具栏最右边那两个按钮也很有用。

3
29
2012
3

病毒 xviewer.exe 简析

搞到了个病毒,想看看它想干什么,扔虚拟机里跑了几次。PS: 这个病毒真大,9M 多了。

第一次,观察到其进程结构为一个 winloads.exe 进程下生成三个 xviewer.exe 工作进程。winloads.exe 无法被 Process Explorer 杀死,而 xviewer.exe 可以。工作进程总保持为三个。病毒运行过程中,耳机不时传来 Windows 页面刷新的声音,猜测这家伙在用浏览器。第二次使用 Process Monitor 观察的结果证实了这个猜测,xviewer.exe 在大量访问C:\Documents and Settings\LocalService\Local Settings\Temporary Internet Files\Content.IE5\index.dat文件。不过,Process Monitor 可能还是太弱了,不能看到事件的详细信息,也没看到网络访问。

第三次测试,将 vbox 的 NAT 网卡关掉,只留下一块 host only 的。然后本机开启 NAT 转发:

sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
sudo iptables -t nat -A POSTROUTING -s 192.168.56.0/24 -j MASQUERADE

使用 Wireshark 在 vboxnet0 接口上监听。虚拟机上手动设置网关为192.168.56.1,DNS 服务器为我本机上的 dnsmasq,也就是相同的地址。

设定好后,再次运行病毒,可以看到其

  1. 首先访问 www.wandianji.com 上的列表文件(http://www.wandianji.com/xsoft/update/update_plug_v2.txt)来更新;
  2. 再使用 POST 请求访问,获取一格式不明的链接列表;
  3. 接着开始访问百度,搜索关键词,访问网页。

原来是刷搜索排名的。难怪百度的搜索结果那么差,国内这些东西估计有不小的贡献吧?

PS: 我是用 XueTr 来结束病毒的进程们的,这个软件不支持进程树显示,但是可以多选来同时杀掉多个进程。

病毒样本及抓包结果下载链接在此

Category: Windows | Tags: windows 网络 病毒分析
12
24
2011
64

危险的 Microsoft Word

在编辑 Word 文档时,记住 Microsoft Word 是危险的会很有用。

因为毕业设计的关系,需要使用 Word 文档。我用的是 Microsoft Word 2007,因为没有理由让我使用更旧的版本,而我也没有更新的版本。这才使用几天,我已经忍不住要来吐槽了。

几天前,寝室断电。于是乎,几百字不翼而飞。Word 有自动保存文档以供恢复,但默认是每十分钟才保存一次。这比我手动保存的频率还低。那次断电,Word 是唯一给我造成损失的软件。是的,我的火狐打开了若干标签页。但是没关系,除了最后几秒打开的标签页,其它时候火狐异常退出再打开时,所有的标签页都还在,只要重新载入就可以了。如果已经在某网页里输入了较多文字的话也没关系,Textarea Cache 会帮我保存它们的。至于自己最常用的 Vim,更是无需担心。Vim 默认每输入 200 个字符,或者停止操作 4 秒就会将修改写入交换文件。所以,我从来没有在 Vim 里在没有误操作的情况下丢失大量文字。

好吧,既然 Word 默认的 10 分钟太久了,那我改短点总行了吧?于是我把它改成了 1 分钟。结果,在我尝试在页脚插入页码的时候,我发现突然卡了一下,右下方出现了绿色的进度条。不过在我注意到它时它已经完成了。因为生疏,所以我又继续弄好了一会儿,然后,绿色的进度条又出现了。我看清楚了,它在保存文档。很慢,看样子是完整地保存了一份。Word 这次不仅仅是卡住了,而且——它崩溃了!哦不,在微软的字典中没有「崩溃」这个词。最多只能说是「异常退出」。当然这个词也不常用。微软最常用的是「程序遇到问题需要关闭」。就是这么一个框跳了出来,问我要不要发送报告。好吧,你发吧。点击「发送错误报告」,Word 继续卡在那里……等了会儿,我不耐烦地点了取消,它还没反应。最后终于反应过来,Word 告诉我有一大堆文档「已经修复」。这个我已经见怪不怪了,打开阅读的文档,我不记得做了任何修改,但 Word 总是喜欢问要不要保存。再看看那篇在自动保存中崩溃的文档,「已经修复」的版本格式已经乱掉了。我还是从自己手动保存的版本继续吧。

用 Vim 久了,以前在 Windows 下养成的随时保存文件的习惯渐渐地消失了。现在,重返 Windows,重返 Word,我得在使用过程中时刻提醒自己,要随时手动保存。自动保存并不可靠,甚至还可能是崩溃发生的根源。撒销什么的也不再可靠,要记得编辑一段时间去资源管理器里选中文档,Ctrl-CCtrl-V下,不然,当自己不小心把排版弄乱而 Word 又撒消不回来时就郁闷了。

2011年12月25日更新:Windows 也一样不可靠,竟然应用更新后置我打开的众多文档和程序于不顾,自动重启,完成后还不恢复打开的应用程序——

Windows 最近下载并安装了一个重要安全更新……此更新要求自动重新启动您的计算机!

Category: Windows | Tags: office windows 微软
10
31
2011
16

在 Linux 下交叉编译带 Python 3 支持的 gvim.exe

今天再一次在 yaourt 的输出中瞥见 mingw 这几个字符,好奇地看了下说明:A C and C++ cross-compilers for building Windows executables on Linux。这个不就是传说中的交叉编译器么?

试试看。以前自己在虚拟机里为 Windows 编译过很多次的 vim,要是能弄到真机下来编译效率应该会高很多。(不,我不是说虚拟机的性能差,而是 Windows 下跑 mingw 这种一堆进程的东西效率差。)

说干就干,几十 M 的 mingw-gcc 及其依赖下好,git archive all|tar x -C ~tmp/vim弄份崭新的 vim 源码,把以前在 win 下用的Make_ming.mak拷过来改改,设置CROSS=yes什么的,然后开始编译!然后很快就出错了,找不到编译器i586-pc-mingw32msvc-gcc。唔,我确实没有那个东东,只有i486-mingw-gcc,去把CROSS_COMPILE这个变量改了就好。然后再 make。这一次的结局是——找不到 Python/Ruby/Lua 的头文件、找不到它们中的符号……好吧,你这交叉编译器当然找不到它们,先注释掉好了。然后重新编译,很顺利地出来个 gvim.exe 了~拿到 Windows 虚拟机里跑一下,一切正常~

好开心,第一次玩交叉编译就成功了。不过还有些小遗憾:没有那些外部脚本语言的支持。这可怎么办呢?我上哪儿找用于交叉编译的库呢?光想是没有用的,还是得尝试。用 Linux 版的库肯定不行,那就试试 Windows 版的。先拿 Python 3 支持测试。把 Windows 下安装的 Python 3 文件夹复制过来,修改下路径,再 make。很正常地,我的第一次尝试总是不成功,好在也不是大问题:Make_ming.mak里写的 include 目录不对:

ifeq ($(CROSS),no)
PYTHON3INC=-I $(PYTHON3)/include
else
PYTHON3INC=-I $(PYTHON3)/win32inc
endif

看看自己的 Python 3 目录,这里的win32inc应该是include。改改就好了 ;-)

嗯,顺利成功了!接下来,把 Windows 版的 Ruby 和 Lua 也弄过来就不用再跑到虚拟机里去编译 Windows 版的 Vim 了!嗯,NSIS 也有 Linux 版,虽然是在 AUR 里。

最后,编译好的 gvim 还是在这里

Category: Vim | Tags: vim windows 交叉编译 编译 linux

| Theme: Aeros 2.0 by TheBuckmaker.com