从网上抓图,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即可。
没有评论 :
发表评论