13

[调试逆向] [原创]解除 VC6 不能打开真彩色位图的限制

cntrump 2011-1-3 20:50 23345
解除 VC6 不能打开真彩色位图的限制
作者:cntrump
      官方的 VC6 只能打开最大 256 色的位图,有时候项目里用了真彩色的位图,想要在 IDE 里直接查看就不行了,必须要在外部查看,比较麻烦。
    为了以后查看真彩色位图能节省时间,所以我就想尝试下看 VC6 是不能还是不想显示真彩色位图。
    直接从限制入手。如果位图超过256色,那么会得到一个提示:


    这是系统的 MessageBox ,我的判断依据是“确定”按钮,因为我用的英文版本,而提示信息中的按钮却是中文的,那么可以肯定的这个框是操作系统本身的资源,而不是 Dialog 之类的自定义资源。那么嫌疑最大的就是 MessageBoxA 了(因为VC6是98年的产品,它还可以运行在Windows 98 上,所以只能是ASCII编译的)。
    OD 加载VC6主程序(或者附加也可以,加载大型软件比较慢时就用附加)。下断 bp MessageBoxA ,在 IDE 里打开一个真彩色位图。被断下:

    正是我们想要的信息,Atl+K 看调用堆栈,主要是看这个消息框来源。


    根据以上内容可以知道,5046BCE6 的作用只是弹出消息框,看来是个封装函数。而调用它的地方是在 5045EFE3 ,处理位图的地方肯定也在这里。
    跟进后发现对位图处理判断的流程起始地方是在  5045EB71 ,如果打开的位图超过 256 色就会跳走弹出消息框,不超过就按正常流程进行。那么只要对比下程序打开真彩色和256色以下位图的流程,让真彩色位图走正常流程,如果能正常显示真彩色位图就说明 VC6 是支持真彩色位图的,如果显示不正常则说明 VC6 不支持。

操作如下:
1. 用 IDE 本身的功能新建一个位图资源,程序就断在了 5045EB71,用 F8 步过每一个 CALL ,标记下所经过的跳转指令。
2. 再在 IDE 里打开一个真彩色位图,同样步过每一个 CALL ,注意看在真彩色位图下所经过的跳转指令和第一步中的有什么不同,如果不同则强制修改为 nop 或 jmp 让其流程和第一步的一样。

    经过对比发现,打开真彩色位图和小于 256 色的位图流程区别在于:
 5045EEBE   /0F8E 27010000   jle devres.5045EFEB        
                          
    小于256位图的话会执行这句跳转,而真彩色位图则不会执行跳转。把 jle 强制修改 jmp 让其走正常流程。
修改后发现真彩色位图可以在 IDE 中正常显示,再对位图进行常规的编辑/保存操作,完全正常,这说明 VC6 是完全可以支持真彩色位图的。
最后把修改的文件保存出来,收工了。
    为了以后方便,我做了个补丁,只要 Patch 一下就可以了。
在 VC6 中打开真彩色位图:


VC6 出生的年代, Windows 98 , 2000 本身还不能支持真彩色。所以VC6不支持真彩色是正常的。

推荐:论坛大聚会| 看雪安全开发者峰会将于7月21号火热来袭!

上传的附件:
最新回复 (51)
beareagle 2011-1-3 21:13
2
图标也支持吗
achillis 2011-1-3 21:49
3
这个给力,支持~~
dlmu 2011-1-3 22:00
4
这个好强大~~cntrump的帖子,必顶
奘和 2011-1-3 22:10
5
支持一个
LZ最近相当活跃啊
非常感谢!
XiaosanAiq 2011-1-4 11:39
6
good job!
wofan[OCN] 2011-1-4 13:02
7
不错!这个方便,补丁一下试试看。
夜凉如水 2011-1-4 13:10
8
hehe 总结经验了啊
黄瓜熟了 2011-1-4 13:27
9
无比强大的楼主~
cntrump 2011-1-4 13:46
10
我测试了一个大于 256 色的图标。是可以的。

上传的附件:
skyformat 2011-1-4 15:16
11
非常感谢啊;
神人!!
呵呵
flyingx 2011-1-4 16:36
12
2011的中的幸福一天啊
艾米 2011-1-4 23:28
13
C姐太帅了!
magicman 2011-1-5 01:28
14
期待下版更新包中包含此patch以及更多...
guxinyi 2011-1-5 19:05
15
标记,留起....
FishSeeWater 2011-1-5 19:12
16


确实很帅~:)
logkiller 2011-1-5 19:55
17
楼主图片很给力
lixupeng 2011-1-5 20:20
18
有时间试试
foxjinlin 2011-1-5 22:29
19
了然,了然,女高手越来越多了
华龙 2011-1-5 22:43
20
膜拜啊,楼主太强悍了!
txstc 2011-1-5 22:53
21
这真是重大发现啊~不过为什么明明支持真彩却要弹出阻止对话框呢~用意何在啊
softdiy 2011-1-5 23:34
22
这个要支持,记得以前写mfc程序被这个烦透了
skyformat 2011-1-6 12:35
23
是啊;
很不解;
微软当初怎么想的??
reggie 2011-1-7 15:21
24
厉害,IDE都拜倒在你脚下
DragenKing 2011-1-7 15:30
25
呵呵,太给力了,顶
komawang 2011-1-7 15:38
26
也许不能完全支持...
kgbfbi 2011-1-7 17:22
27
好东东额!!!!!!!!!
skylly 2011-1-7 21:38
28
嗯, 很给力啊。
平时用VC6不让打开真彩图, 都从没怀疑过, 以为是真的不支持。。。
ps:  另外希望楼主把那张图也一起打包发出来。
lankerr 2011-1-8 10:47
29
O,Yeah!
cntrump 2011-1-8 13:12
30
http://bbs.unpack.cn/thread-47677-1-1.html

fanlv 2011-1-8 17:00
31
不错,顶了。
Spring.W 2011-1-8 20:54
32
这个很好,以前也搞过,但没有做个补丁程序,每次都手动修改,这下方便了。。呵呵!

另外:我很好色,看到美女,垂涎三尺啊。。。

ninymay 2011-1-14 18:11
33
所以得到一個結論:發帖後人氣要旺,一定得帶上張美女圖才行

對了,請問樓主,OD不是有Trace 記錄的功能,是可以用的嗎?(因為我是用SoftICE的)
如果可以用Trace Buffer記錄,那麼可以打開256位元圖的過程就可以記錄下來,
不需要用手記了,不知道有沒有人有試過OD的Trace功能??
brswbx 2011-1-14 20:12
34
非常不错 ,谢谢.
cntrump 2011-1-14 20:50
35
其实已经跟踪到VC6处理图像显示的流程了,再手动记录几步就发现不同的地方了。
雲飛揚 2011-1-14 22:42
36
好久没有来了,确实不错,楼主有办法改VC6界面对话框的字体吗?改成宋体。
VC6IDE界面一直是粗粗的字体太难看了。
zouzhiyong 2011-1-15 00:24
37
自己粗略的看了一下,其实可以修改的还有其它地方。

5045EE9F    8B47 78         MOV EAX,DWORD PTR DS:[EDI+78]
5045EEA2    3BC3            CMP EAX,EBX
5045EEA4    0F84 5C010000   JE DEVRES.5045F006                                  ; //是否为新建打开,新建的都是符合要求的,修改下面的也行
5045EEAA    66:837F 70 02   CMP WORD PTR DS:[EDI+70],2
5045EEAF    0F85 51010000   JNZ DEVRES.5045F006
5045EEB5    50              PUSH EAX
5045EEB6    E8 2B170300     CALL DEVRES.504905E6
5045EEBB    3BC3            CMP EAX,EBX
5045EEBD    59              POP ECX
5045EEBE    0F8E 27010000   JLE DEVRES.5045EFEB
5045EEC4    83F8 02         CMP EAX,2
5045EEC7    0F8E FF000000   JLE DEVRES.5045EFCC
5045EECD    83F8 04         CMP EAX,4
5045EED0    0F8E EC000000   JLE DEVRES.5045EFC2                                 ; //提示像素超出范围
5045EED6    83F8 05         CMP EAX,5
5045EED9    0F84 D9000000   JE DEVRES.5045EFB8                                  ; //提示色彩超出范围
5045EEDF    83F8 06         CMP EAX,6
5045EEE2    0F84 C6000000   JE DEVRES.5045EFAE                                  ; //提示图像不被设备支持
5045EEE8    83F8 07         CMP EAX,7
5045EEEB    0F85 FA000000   JNZ DEVRES.5045EFEB                                 ; //提示当前显示器不支持图像的调试板编辑
5045EEF1    BF 19670000     MOV EDI,6719
5045EEF6    395E 50         CMP DWORD PTR DS:[ESI+50],EBX
5045EEF9    0F85 D7000000   JNZ DEVRES.5045EFD6


对应的操作如下:
5045EF9B  ^\E9 1EFEFFFF     JMP DEVRES.5045EDBE
5045EFA0    33C0            XOR EAX,EAX
5045EFA2  ^ E9 17FEFFFF     JMP DEVRES.5045EDBE
5045EFA7    33C0            XOR EAX,EAX
5045EFA9  ^ E9 66FEFFFF     JMP DEVRES.5045EE14
5045EFAE    BF 56670000     MOV EDI,6756
5045EFB3  ^ E9 3EFFFFFF     JMP DEVRES.5045EEF6
5045EFB8    BF 54670000     MOV EDI,6754
5045EFBD  ^ E9 34FFFFFF     JMP DEVRES.5045EEF6
5045EFC2    BF 16680000     MOV EDI,6816
5045EFC7  ^ E9 2AFFFFFF     JMP DEVRES.5045EEF6
5045EFCC    BF 53670000     MOV EDI,6753
5045EFD1  ^ E9 20FFFFFF     JMP DEVRES.5045EEF6
5045EFD6    6A 30           PUSH 30
5045EFD8    68 F2660000     PUSH 66F2
5045EFDD    57              PUSH EDI
5045EFDE    E8 03CD0000     CALL DEVRES.5046BCE6                                                  ; //这里提示错误
5045EFE3    83C4 0C         ADD ESP,0C
5045EFE6  ^ E9 38FDFFFF     JMP DEVRES.5045ED23
5045EFEB    391D 80505050   CMP DWORD PTR DS:[50505080],EBX                                       ; //新建打开的跳到这里
5045EFF1    74 13           JE SHORT DEVRES.5045F006                                              ; //新建打开的,最后还是跳到下面的打开已存在的判断,因此修改上面的判断是否新建打开,是成立的
5045EFF3    8B46 50         MOV EAX,DWORD PTR DS:[ESI+50]
5045EFF6    57              PUSH EDI
5045EFF7    8B88 10010000   MOV ECX,DWORD PTR DS:[EAX+110]
5045EFFD    8B41 08         MOV EAX,DWORD PTR DS:[ECX+8]
5045F000    50              PUSH EAX
5045F001    E8 8A5AFBFF     CALL <JMP.&MFC42.#5859_?SetAtGrow@CObArray@@QAEXHPAVCObject@@@Z>
5045F006    399F E0000000   CMP DWORD PTR DS:[EDI+E0],EBX                                         ; //打开已存在的跳到这里
5045F00C    75 0F           JNZ SHORT DEVRES.5045F01D
5045F00E    8BCF            MOV ECX,EDI
5045F010    E8 13ED0200     CALL DEVRES.5048DD28
5045F015    85C0            TEST EAX,EAX
5045F017  ^ 0F84 06FDFFFF   JE DEVRES.5045ED23                                                    ; //跳到打开的处理,关键的还是跳到这里


跟入跳转的地方,可以发现在整个判断处理过程钟关键地方有两点,
1、不让它修改EDI内容,
2、让它跳到打开的处理地方,JE 5045ED23
至于修改的话,只要遵循上面两点即可~~
cntrump 2011-1-16 18:29
38
VC6的字体应该是 system
尝试过,但是没有找到方法。
改了字体之后会改变对话框的尺寸。有可能造成原本的字符串显示被截断。还是不改好。
majinxin 2011-1-17 09:33
39
我好奇这个patch是用什么加的壳....
sdoat 2011-1-17 10:16
40
这个必须顶,这个patch很重要
xiilin 2011-1-17 11:15
41
我是来看壳的。。。。
winnip 2011-2-18 12:42
42
必    必    必须的。。。顶起,前阵子我还受到困扰
yaojiank 2011-2-18 14:58
43
mark~~~
AsmDebuger 2011-3-17 13:49
44
谢谢楼主,今天就用上了。
yodamaster 2011-5-16 15:37
45
多谢分享,一直以为vc6真的不支持真彩色位图,被微软欺骗了很久。
pende 2011-5-17 15:10
46
只是不能在里面编辑,直接导入了也可以用啊,真彩色图片
superdj 2011-5-17 15:31
47
这个比较实用的,支持~
manbug 2011-5-17 15:32
48
这个很给力啊!!!
xieyulin 2011-9-28 10:57
49
真彩位图是可以编辑了,但是工具条还是不支持真彩色。提示: "The bitmap for this toolbar must be adjusted to use 16 colors. Adjust the bitmap?"

请问工具条是不是也可以搞成直接支持真彩色??
东方容克 2011-9-28 11:26
50
奇怪,既然可以显示真彩图片,那VC为什么要做这样的限制呢?肯定有什么原因在的。
返回