首页
社区
课程
招聘
[原创]CFF Explorer临时修改完整显示文字
发表于: 2009-7-23 01:37 14927

[原创]CFF Explorer临时修改完整显示文字

2009-7-23 01:37
14927

在这下的汉化版http://bbs.pediy.com/showthread.php?t=91765&highlight=Explorer+Suite
感谢netprodiag

之前就下了但一直没用上,不知道其他人有没有这种情况,打开个文件后表格里的文字全是显示不完的,
试了原版也是这样,表格能拖拉的还好,不行的话基本上什么也看不到,就一直没用,今天要用到它,实在
找不到解决办法,就动手改了下.

开始以为是字体问题,它的表格查了下是用的MFCGridCtrl,百度后有人说是画出来的,于是找到
CreateFontIndirectW把字体全改成9号,谁知道表格也跟着缩小了,直接晕到.

换方法,找到程序里的DrawTextW函数下断,果然在00502872处不停断下,看下面代码和堆栈
0050284B   .  50            push eax
0050284C   .  8D4D 14       lea ecx,dword ptr [ebp+14]
0050284F   .  E8 8CE7F7FF   call 00480FE0
00502854   .  50            push eax
00502855   .  6A FF         push -1
00502857   .  8B85 F0FEFFFF mov eax,dword ptr [ebp-110]
0050285D   .  8B10          mov edx,dword ptr [eax]
0050285F   .  8B8D F0FEFFFF mov ecx,dword ptr [ebp-110]
00502865   .  8B42 38       mov eax,dword ptr [edx+38]
00502868   .  FFD0          call eax
0050286A   .  50            push eax                                 ; |Text
0050286B   .  8B4D 08       mov ecx,dword ptr [ebp+8]                ; |
0050286E   .  8B51 04       mov edx,dword ptr [ecx+4]                ; |
00502871   .  52            push edx                                 ; |hDC
00502872   .  FF15 EC165800 call dword ptr [<&USER32.DrawTextW>]     ; \DrawTextW

堆栈:
0012D780   C6013366  |hDC = C6013366
0012D784   00CCD208  |Text = "属性"
0012D788   FFFFFFFF  |Count = FFFFFFFF (-1.)
0012D78C   0012D8D8  |pRect = 0012D8D8 {8.,8.,113.,14.}
0012D790   00008824  \Flags = DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_NOPREFIX|DT_END_ELLIPSIS

这里明显就是把所有文字不停的刷新
插句话,在这之前还试了改pRect,指针里的数分别是左,上,右,下,心想把上和下改小点就应该能显示完了吧,
最后发现改这没用,只是文字的相对位置而已

查了下函数原型:
int DrawText(HDC hdc, LPCTSTR lpString, int nCount, LPRECT lpRect, UINT uFormat);
主要看这个
uFormat:指定格式化正文的方法。它可以下列值的任意组合,各值描述如下:
具体可以参考
http://baike.baidu.com/view/1023733.htm
发现个重要的
DT_NOCLIP:无裁剪绘制当DT_NOCLIP使用时DrawText的使用会有所加快。

备注:函数DrawText用设备环境中的字体选择、正文颜色和背景颜色来写正文,除非DT_NOCLIP被使用,
DrawText裁剪正文,所以它不会出现在指定矩形的外面,除DT_SINGLELINE格式化,其余的格式都认为
正文有多行。如果选择的字体对指定的矩形而言太大,DrawText不会试图去换成一种小字体。

看上面堆栈并没这个标志,于是手动加上,大功告成.

下面动手改程序.
先查下得到DT_NOCLIP = $100;那么只要把0012D790里的 8824 Or 100就OK了
改的地方不多,直接在DrawTextW前处理一下参数就行了,程序后部有不少空间,那就直接跳过去处理吧

00502854   .  50                   push eax
00502855   .  6A FF                push -1
00502857   .  8B85 F0FEFFFF        mov eax,dword ptr [ebp-110]
0050285D   .  8B10                 mov edx,dword ptr [eax]
0050285F   .  8B8D F0FEFFFF        mov ecx,dword ptr [ebp-110]
00502865   .  8B42 38              mov eax,dword ptr [edx+38]
00502868   .  FFD0                 call eax
0050286A   .  50                   push eax
0050286B   .  E9 20DB0700          jmp 00580390
00502870      90                   nop
00502871   >  52                   push edx                                 ; |hDC
00502872   .  FF15 EC165800        call dword ptr [<&USER32.DrawTextW>]     ; \DrawTextW
....

00580390   > \814C24 0C 00010000   or dword ptr [esp+C],100
00580398   .  8B4D 08              mov ecx,dword ptr [ebp+8]
0058039B   .  8B51 04              mov edx,dword ptr [ecx+4]
0058039E   .^ E9 CE24F8FF          jmp 00502871

检查一下,这里的堆栈就变成这样了
0012D780   DA0139E5  |hDC = DA0139E5
0012D784   00CCD710  |Text = "属性"
0012D788   FFFFFFFF  |Count = FFFFFFFF (-1.)
0012D78C   0012D8D8  |pRect = 0012D8D8 {8.,8.,113.,14.}
0012D790   00008924  \Flags = DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_NOCLIP|DT_NOPREFIX|DT_END_ELLIPSIS

至此完工,因为没对参数做判断,所以说是临时的解决方法,难以保证不出问题,不过据观察,好像参数没变过,如果有
其它更好的方法,请告之,谢谢.

这有改好的,不放心可以自己改
CFF Explorer_Fixed.zip

                                                                                Sam.com[CCG] 2009年7月23日

效果图:


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (25)
雪    币: 8212
活跃值: (3356)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
早就看里面的字体不顺眼了,谢谢楼主fix...
2009-7-23 08:55
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
兄弟很牛啊。 呵呵
2009-7-23 10:24
0
雪    币: 47147
活跃值: (20445)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
谢谢分享,处理了一下,用起来确实方便多了。
2009-7-23 11:22
0
雪    币: 319
活跃值: (2459)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
5
试用了一下,暂时没发现问题。感谢楼主提供。
2009-7-23 11:37
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不错的东东,正是因为显示不完全的原因,一直没有用上它。楼主不仅水平高,而且很有心。
2009-7-23 12:23
0
雪    币: 5318
活跃值: (3714)
能力值: ( LV13,RANK:283 )
在线值:
发帖
回帖
粉丝
7
谢谢分享,学习一下
2009-7-23 14:11
0
雪    币: 427
活跃值: (65)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
太棒了!
2009-7-23 14:15
0
雪    币: 1485
活跃值: (884)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
更新修复下,谢谢~
2009-7-23 14:22
0
雪    币: 86
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
这个一定要定一下了
2009-7-23 15:24
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
LZ辛苦了,感谢分享!
2009-7-23 15:57
0
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
变形金刚 ,sam ?
2009-7-23 16:11
0
雪    币: 93
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
Good Job Sam!
2009-7-23 17:18
0
雪    币: 134
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
so nice
2009-7-23 20:53
0
雪    币: 219
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
楼主这么细心,,
2009-7-24 00:57
0
雪    币: 9791
活跃值: (2181)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
自己动手,丰衣足食!
2009-7-24 07:32
0
雪    币: 277
活跃值: (2016)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
17
这下显示完美了,谢谢楼主分享
2009-7-24 09:19
0
雪    币: 296
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
good job!
2009-7-24 09:23
0
雪    币: 8209
活跃值: (4518)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
19
楼主为什么不修改这一行呢:
00502846          0D 00090000    OR      EAX,900
原地满状态复活
2009-7-24 09:54
0
雪    币: 1485
活跃值: (884)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
xuexi~
2009-7-24 15:17
0
雪    币: 12688
活跃值: (4294)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
21
谢谢提醒,当时是赶时间,前面的代码几乎都没看,这样改是最方便,谢谢了
2009-7-24 18:18
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
牛人啊,真的很感谢,向你致敬!
2009-7-29 17:37
0
雪    币: 256
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
这么大个bug,为何该公司没发现,放个残次品出来呢?
2009-10-13 16:26
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
楼上的,是软件总会有BUG , 另外我也发现CFF一个BUG ,CFF不支持压缩的元数据。
2009-10-14 09:35
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
谢谢分享,学习一下
2009-10-14 22:35
0
游客
登录 | 注册 方可回帖
返回
//