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应该就不需要自己再改一次了。