VC2003的工程文件和VC2005的工程文件看起来文件格式上没什么区别的,但是微软却升级了版本号,使得VC2003无法直接打开VC2005的工程,如果把sln和vcprj的版本号信息改了,就可以顺利打开了,但是每次阅读VC2005的代码都要这样操作很不方便,而且很多时候工程文件是只读的,使得用VC2003阅读代码就很不方便了.
要使得VC2003顺利打开VC2004的工程,要解决2个问题,首先,解决sln的加载问题,然后解决vcprj的加载问题.
1.先解决sln的加载问题,估计应该是ide目录的某个文件,于是定位到msenv.dll,查找关键字,定位到这里
看到了_wtoi,OK接近成功了,修改一下跳转即可
500FFDFC . 8B7D D4 mov edi, dword ptr [ebp-2C]
500FFDFF . BE D0FE0F50 mov esi, 500FFED0 ; microsoft visual studio solution file, format version
500FFE04 . 56 push esi ; /wstr2 => "Microsoft Visual Studio Solution File, Format Version"
500FFE05 . 57 push edi ; |wstr1
500FFE06 . FF15 A41A0050 call dword ptr [<&MSVCR71.wcsstr>] ; \wcsstr
500FFE0C . 85C0 test eax, eax
500FFE0E . 59 pop ecx
500FFE0F . 59 pop ecx
500FFE10 . 0F84 612A0400 je 50142877
500FFE16 > 6A 20 push 20 ; /c = 0020 (' ')
500FFE18 . 57 push edi ; |s
500FFE19 . FF15 B41A0050 call dword ptr [<&MSVCR71.wcsrchr>] ; \wcsrchr
500FFE1F . 8BF0 mov esi, eax
500FFE21 . 3BF3 cmp esi, ebx
500FFE23 . 59 pop ecx
500FFE24 . 59 pop ecx
500FFE25 . 0F84 F82B0400 je 50142A23
500FFE2B . 46 inc esi
500FFE2C . 46 inc esi
500FFE2D . 6A 2E push 2E ; /w = 002E ('.')
500FFE2F . 56 push esi ; |wstr
500FFE30 . FF15 A81A0050 call dword ptr [<&MSVCR71.wcschr>] ; \wcschr
500FFE36 . 3BC3 cmp eax, ebx
500FFE38 . 59 pop ecx
500FFE39 . 59 pop ecx
500FFE3A . 0F84 E32B0400 je 50142A23
500FFE40 . 56 push esi
500FFE41 . 66:8918 mov word ptr [eax], bx
500FFE44 . FF15 AC1A0050 call dword ptr [<&MSVCR71._wtoi>] ; MSVCR71._wtoi
500FFE4A . 8B15 28462F50 mov edx, dword ptr [502F4628]
500FFE50 . 3BC2 cmp eax, edx
500FFE52 . 59 pop ecx
500FFE53 . C745 C8 01000>mov dword ptr [ebp-38], 1
500FFE5A 0F8F C32B0400 jg 50142A23 ;//nop之
500FFE60 . F685 A0140000>test byte ptr [ebp+14A0], 4
500FFE67 . 895D C8 mov dword ptr [ebp-38], ebx
2.vcprj,vc相关的工程文件,于是定位到 VCProjectEngine.dll,找到 version 字符串,然后看到各版本的字符串,修改跳转即可
53B71F2D 6A 03 push 3
53B71F2F 5F pop edi
53B71F30 57 push edi
53B71F31 68 A41FB753 push 53B71FA4 ; 7.0
53B71F36 FF75 14 push dword ptr [ebp+14]
53B71F39 FF15 1815B453 call dword ptr [<&MSVCR71.wcsncmp>] ; MSVCR71.wcsncmp
53B71F3F 83C4 0C add esp, 0C
53B71F42 85C0 test eax, eax
53B71F44 0F84 5A810300 je 53BAA0A4
53B71F4A 57 push edi
53B71F4B 68 9C1FB753 push 53B71F9C ; 7,0
53B71F50 FF75 14 push dword ptr [ebp+14]
53B71F53 FF15 1815B453 call dword ptr [<&MSVCR71.wcsncmp>] ; MSVCR71.wcsncmp
53B71F59 83C4 0C add esp, 0C
53B71F5C 85C0 test eax, eax
53B71F5E 0F84 40810300 je 53BAA0A4
53B71F64 57 push edi
53B71F65 68 941FB753 push 53B71F94 ; 7.1
53B71F6A FF75 14 push dword ptr [ebp+14]
53B71F6D FF15 1815B453 call dword ptr [<&MSVCR71.wcsncmp>] ; MSVCR71.wcsncmp
53B71F73 83C4 0C add esp, 0C
53B71F76 85C0 test eax, eax
53B71F78 0F85 73800300 jnz 53BA9FF1 ;//再不相同就失败了,于是nop之
为了方便大家修改,这里给出文件的偏移(注意,是VS2003 English Pro SP1的,其他版本请自行解决,或email问我,ywjheart@gmail.com)
1.文件: msenv.dll ,偏移: 0xFFE5A , 原始字节: 0F 8F C3 2B 04 00 ,修改成: 90 90 90 90 90 90
2.文件: VCProjectEngine.dll ,偏移: 0x31378 ,原始字节: 0F 85 73 85 03 00 , 修改成: 90 90 90 90 90
修改后,可以直接打开VC2003和VC2005的工程,对于VC2005的工程,如果点击了保存,版本会降低为 "Microsoft Visual Studio Solution File, Format Version 8.0",对于阅读代码应该没什么影响,如果是团队协作开发,记得不要把这个保存后的工程合并到svn,否则,你的弟兄会有些郁闷(VC2005会提示他升级工程)
enjoy this patch,hacked by morning @ 2009.1.30
[课程]Android-CTF解题方法汇总!