2009年9月19日星期六

小改ImageZ

从网上抓图,Imagez是个很不错的程序。可是在该程序在选择保存目录的时候,无法设置起始目录,也不能直接输入已存在路径,只能从我的电脑开始一级一级点。虽然官网上说0.7Final会提供该功能,可一年半后的现在版本号都0.82了却仍然没有兑现,说不得只好自己想办法了。

选择目录的API函数是SHBrowseForFolder,通过LPBROWSEINFO的pidRoot和ulFlags两个成员可以实现我上面说到功能。pidRoot没办法,ulFlags只需要加上BIF_EDITBOX即可,这倒是可以动动脑筋。

用UPX解压后再用FileInfo查看可得知,ImageZ是用VB6写的。而VB6调用外部API都是动态载入DLL,用W32DASM静态分析会比较困难,所以还是请出大神OllyDbg。

在OllyDbg中打开ImageZ.exe,F9执行。Alt+E,找到shell32双击。Ctrl+N,找到SHBrowseForFolderA,F2下断点。切换到ImageZ窗口,点击保存按钮,跳回OllyDbg。按Alt+F9执行到用户代码,再切回ImageZ取消掉选择目录的窗口。

0042AE69    894D BC         mov dword ptr ss:[ebp-44],ecx
0042AE6C    C745 CC 4100000>mov dword ptr ss:[ebp-34],41
0042AE73    E8 20A8FEFF     call ImageZ.00415698
0042AE78    8B1D B0104000   mov ebx,dword ptr ds:[<&MSVBVM60.__vbaSetSy>; MSVBVM60.__vbaSetSystemError
0042AE7E    8BF8            mov edi,eax

0042AE6C这一行就是我们要找的东西,其含义为将ulFlags设置为41。光标移动到这一行,按空格,将41改为51。鼠标右键,“复制到可执行文件”,在弹出的窗口中右键,保存。

好久好久没弄类似的东西,手好生的说。

Update 18:03 2009-11-3

ImageZ 0.82p2中改用GetOpenFileName选择文件夹,虽然提供了设置初始目录的功能,但仍然不允许手工输入目录,也不能记忆上次选择的路径,真不知道作者究竟是怎么想的。

定制GetOpenFileName对话框的外观无法通过修改OPENFILENAME结构体的成员来实现,必须要挂一个消息钩子处理WM_INITDIALOG,向需要隐藏或修改内容的控件发送CDM_HIDECONTROL、CDM_SETCONTROLTEXT等消息,所以断点需要下在SendMessage上。

大概的修改过程都跟上次的差不多,以下是我找到的代码:

0045B6AE   /0F85 28010000   jnz ImageZ.0045B7DC
0045B6B4   |8D4D A0         lea ecx,dword ptr ss:[ebp-60]
0045B6B7   |895D A0         mov dword ptr ss:[ebp-60],ebx
0045B6BA   |51              push ecx
0045B6BB   |68 7C040000     push 47C
0045B6C0   |68 69040000     push 469
0045B6C5   |57              push edi
0045B6C6   |E8 5565FBFF     call ImageZ.00411C20
0045B6CB   |FFD6            call esi

CDM_HIDECONTROL的值为0x469,所以0045B6C0这一行就是我们要找的东西了,将该行以及其下共5行push 469改为push 0即可。

2009年9月18日星期五

ActiveScriptRuby和RubyInstaller的兼容性问题

近来一直在用Luis做的RubyInstaller,这个版本的Ruby用Mingw编译,比VC6编译的快了很多。而且Mingw和VC6编译出来的东西都依赖msvcrt.dll,也算解决了Ruby极端讨人厌的DLL文件名问题。

可是RubyInstaller却跟Arton写的ActiveScriptRuby有兼容性问题,regsvr32无法注册库文件,提示“找不到指定的程序”。

用dumpbin检查了一下,Arton发布的ActiveScriptRuby从msvcrt-ruby191.dll中导入了一个vsnprintf函数,但该函数在Mingw编译的msvcrt-ruby191.dll中并不存在。

抓来ActiveScriptRuby的代码,将win32oleex.cpp第568行的vsnprintf改为_vsnprintf,使用VC6版本的include和lib文件编译通过。

写信给Arton报告了这个问题,下一个版本的ASR应该就不需要自己再改一次了。

2009年8月15日星期六

Tumblr vs Publr

现在才写似乎有些Out了,不过我的确是最近才开始用类似的东西。因为就是用来贴图而已,所以我只关注了这两家网站关于贴图的相关功能。

因为墙的关系,最先开始用的是Publr。本以为作为Tumblr的后来者,功能方面应该较弱才对,结果用了一段时间发现事实并非如此。Publr可以自定义Theme,网站提供的三款也都是设计优良的作品。发布照片的界面也很好用,能够一次选择多张图片,并且在上传的时候去写文字内容。基本上我介意的核心功能,Publr都能很好地提供。

要说缺点,不能设置Post发布时间算一个,无法调整Photoset顺序也算一个,不过都还可以忍受就是。真正让我起意尝试其他相似服务的原因并不在于功能,而是出于对数据安全性的担心。

Tumblelog,看名字就知道,这一类网站Tumblr肯定才是老大,Publr是否能找到自己的位置?上线有一年了吧,我只用了月余就抓出了三个Bug,用户少到没人发现?API至今还很不完整,站方想要添加的SNS功能也进展缓慢,种种迹象让我觉得至少要找个备份的地方才算保险。

于是我慕名翻墙来到了Tumblr,可是却有那么点失望。Tumblr的功能的确较Publr丰富,创建多个Blog、SNS,等等等等。可是我看了官方网站才知道,发布Photoset的功能七月才上线,无论可用性还是易用性都有不小的缺陷。

Tumblr将单张的Photo和多张的Photoset分成了两种不同的Content类型,假如第一次发布时只选择了一张照片,Post类型即为Photo,以后修改也不能再添加照片并转化为Photoset了。呈现方面,如浏览器安装了Flash插件则Photoset会被显示为一个Flash相册,否则就是所有大图的堆叠,相比Publr点击略所图用Javascript放大的方式差了不少。另外Tumblr的Photoset还有最多十张的限制,上传时必须逐张进行选择,用起来实在有些不太舒服。

综合来看,仍然是Publr更为契合我的需求。至于备份,写了一个Ruby脚本将Photo类型的Content从Publr同步至Tumblr,而Photoset就只能手工处理了。