none
win2003EE安装VS2003EA,编译时出现vcspawn.exe挂起的探讨二(临时解决方法,更新一处错误修正!) RRS feed

  • 常规讨论

  • //由于并不是改文件造成的编译问题,在修改之前我需要给它增加一个区段和几个函数
    //显然问题出现了,看到的是kernel32.GetCommandLineA也就是说是ANSI,那么,我还需要自己
    //手动修改输入表增加GetCommandLineW函数,来提示我当前错误的命令行是什么~~!
    //汇编是极其简单的,一看就知道是给命令行做了校验,也就是说不对NULL的命令行处理,
    //那么,vcspawn总会保证返回,而VS2003也不会一直挂起,这个办法是解决了挂起问题,
    //但是它并没有根本上解决,如果要从根本上解决,必须知道为什么会在系统第一次启动之后
    //会少参数的问题,可能要花很长时间,我没有那么多时间去研究了,只能先这样了^_^
    //所以,临时修改如下:
    00401826   .  8908          mov     dword ptr [eax], ecx
    00401828   .  FF75 E0       push    dword ptr [ebp-20]
    0040182B   .  FF75 D8       push    dword ptr [ebp-28]
    0040182E   .  FF75 D4       push    dword ptr [ebp-2C]
    00401831   .  E8 17FCFFFF   call    0040144D

    修改为:
    00401826   .  8908          mov     dword ptr [eax], ecx
    00401828   .  FF75 E0       push    dword ptr [ebp-20]
    0040182B   .  FF75 D8       push    dword ptr [ebp-28]
    0040182E   .  FF75 D4       push    dword ptr [ebp-2C]
    00401831      E8 CA570000   call    00407000

    //新增汇编代码如下:
    00407000    55              push    ebp
    00407001    8BEC            mov     ebp, esp
    00407003    51              push    ecx
    00407004    C745 FC 0000000>mov     dword ptr [ebp-4], 0
    0040700B    837D 08 00      cmp     dword ptr [ebp+8], 0
    0040700F    74 1F           je      short 00407030
    00407011    8B45 0C         mov     eax, dword ptr [ebp+C]
    00407014    8378 04 00      cmp     dword ptr [eax+4], 0
    00407018    74 16           je      short 00407030
    0040701A    8B4D 10         mov     ecx, dword ptr [ebp+10]
    0040701D    51              push    ecx
    0040701E    8B55 0C         mov     edx, dword ptr [ebp+C]
    00407021    52              push    edx
    00407022    8B45 08         mov     eax, dword ptr [ebp+8]
    00407025    50              push    eax
    00407026    E8 22A4FFFF     call    0040144D
    0040702B    83C4 0C         add     esp, 0C
    0040702E    EB 19           jmp     short 00407049
    00407030    6A 00           push    0
    00407032    68 00724000     push    00407200
    00407037    FF15 40804000   call    dword ptr [408040]               ; kernel32.GetCommandLineW 这个函数需要手工增加输入表
    0040703D    50              push    eax
    0040703E    6A 00           push    0
    00407040    FF15 19804000   call    dword ptr [<&USER32.MessageBoxW>>; USER32.MessageBoxW 这个同上
    00407046    8B45 FC         mov     eax, dword ptr [ebp-4]
    00407049    8BE5            mov     esp, ebp
    0040704B    5D              pop     ebp
    0040704C    C3              retn

    //-------------------------------------------

    初来,不知道怎么传附件,我改好的没办法传给大家,大家碰到了,临时自己改一下就好了~~!

    ^_^

     

     

    //-----------------------------------------------------------------------------------------------------------------------------------

    //下面是修正~~!

    调试VS2003,发现是在AST.DLL中执行
    10004587    8B4424 24       mov     eax, dword ptr [esp+24]
    1000458B    8B4C24 1C       mov     ecx, dword ptr [esp+1C]
    1000458F    8B5424 20       mov     edx, dword ptr [esp+20]
    10004593    50              push    eax
    10004594    8B4424 18       mov     eax, dword ptr [esp+18]
    10004598    51              push    ecx
    10004599    8B8C24 6C050000 mov     ecx, dword ptr [esp+56C]
    100045A0    52              push    edx
    100045A1    8B9424 6C050000 mov     edx, dword ptr [esp+56C]
    100045A8    50              push    eax
    100045A9    8B4424 28       mov     eax, dword ptr [esp+28]
    100045AD    51              push    ecx
    100045AE    52              push    edx
    100045AF    50              push    eax
    100045B0    53              push    ebx
    100045B1    55              push    ebp
    100045B2    56              push    esi
    100045B3    E8 F8FCFFFF     call    100042B0  // 这里返回给CreateProcessW
    100045B8    8B8C24 48050000 mov     ecx, dword ptr [esp+548]
    100045BF    5F              pop     edi
    100045C0    5E              pop     esi
    100045C1    5D              pop     ebp
    100045C2    5B              pop     ebx
    100045C3    33CC            xor     ecx, esp
    100045C5    E8 60C20000     call    1001082A
    100045CA    81C4 3C050000   add     esp, 53C
    100045D0    C2 2800         retn    28

     

    断点:CreateProcessW
    7C802474 >- E9 971F8093     jmp     AST.10004410 //这里进入AST.DLL,HOOK了创建进程^_^,没看错吧
    7C802479    6A 00           push    0
    7C80247B    FF75 2C         push    dword ptr [ebp+2C]
    7C80247E    FF75 28         push    dword ptr [ebp+28]
    7C802481    FF75 24         push    dword ptr [ebp+24]
    7C802484    FF75 20         push    dword ptr [ebp+20]
    7C802487    FF75 1C         push    dword ptr [ebp+1C]
    7C80248A    FF75 18         push    dword ptr [ebp+18]
    7C80248D    FF75 14         push    dword ptr [ebp+14]
    7C802490    FF75 10         push    dword ptr [ebp+10]
    7C802493    FF75 0C         push    dword ptr [ebp+C]
    7C802496    FF75 08         push    dword ptr [ebp+8]
    7C802499    6A 00           push    0
    7C80249B    E8 A6AC0200     call    CreateProcessInternalW
    7C8024A0    5D              pop     ebp
    7C8024A1    C2 2800         retn    28

     

    083DFAF8   53B47ECB  /CALL 到 CreateProcessW 来自 VCProj_2.53B47EC5
    083DFAFC   00000000  |ModuleFileName = NULL
    083DFB00   03544CE8  |CommandLine = ""D:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\vcspawn.exe" -c"
    083DFB04   00000000  |pProcessSecurity = NULL
    083DFB08   00000000  |pThreadSecurity = NULL
    083DFB0C   00000001  |InheritHandles = TRUE
    083DFB10   00000010  |CreationFlags = CREATE_NEW_CONSOLE
    083DFB14   00000000  |pEnvironment = NULL
    083DFB18   035451D0  |CurrentDir = "D:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE"
    083DFB1C   083DFB30  |pStartupInfo = 083DFB30
    083DFB20   083DFB74  \pProcessInfo = 083DFB74

    //进程启动后,会进入这个引擎文件做处理:
     基址=53B40000
     入口=53B97CAD ;模块入口点
     路径=D:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\vcpackages\VCProjectEngine.dll

    //VCProjectEngine.dll文件的执行如下:
    53B47EB5    51              push    ecx                              ; 创建进程
    53B47EB6    8D4D 88         lea     ecx, dword ptr [ebp-78]
    53B47EB9    51              push    ecx
    53B47EBA    FF75 E4         push    dword ptr [ebp-1C]
    53B47EBD    56              push    esi
    53B47EBE    6A 10           push    10
    53B47EC0    53              push    ebx
    53B47EC1    56              push    esi
    53B47EC2    56              push    esi
    53B47EC3    50              push    eax
    53B47EC4    56              push    esi
    53B47EC5    FF15 6C70CA53   call    dword ptr [53CA706C]             ; kernel32.CreateProcessW
    53B47ECB    6A FF           push    -1
    53B47ECD    8D4D F0         lea     ecx, dword ptr [ebp-10]
    53B47ED0    8945 E8         mov     dword ptr [ebp-18], eax
    53B47ED3    E8 198B0300     call    53B809F1                         ; wsclen
    53B47ED8    3975 D0         cmp     dword ptr [ebp-30], esi
    53B47EDB    74 09           je      short 53B47EE6
    53B47EDD    FF75 D0         push    dword ptr [ebp-30]
    53B47EE0    FF15 7011B453   call    dword ptr [<&KERNEL32.CloseHandl>; kernel32.CloseHandle
    53B47EE6    33FF            xor     edi, edi
    53B47EE8    3975 E8         cmp     dword ptr [ebp-18], esi
    53B47EEB    74 25           je      short 53B47F12
    53B47EED    6A FF           push    -1
    53B47EEF    FF75 CC         push    dword ptr [ebp-34]               ; 进入等待
    53B47EF2    FF15 7C11B453   call    dword ptr [<&KERNEL32.WaitForSin>; kernel32.WaitForSingleObject
    53B47EF8    8D45 E8         lea     eax, dword ptr [ebp-18]
    53B47EFB    50              push    eax
    53B47EFC    FF75 CC         push    dword ptr [ebp-34]
    53B47EFF    8975 E8         mov     dword ptr [ebp-18], esi          ; 等待结束获取进程退出码
    53B47F02    FF15 7811B453   call    dword ptr [<&KERNEL32.GetExitCod>; kernel32.GetExitCodeProcess
    53B47F08    8B45 E8         mov     eax, dword ptr [ebp-18]
    53B47F0B    A3 F871CA53     mov     dword ptr [53CA71F8], eax
    53B47F10    8BFB            mov     edi, ebx
    53B47F12    3975 CC         cmp     dword ptr [ebp-34], esi
    53B47F15    74 09           je      short 53B47F20
    53B47F17    FF75 CC         push    dword ptr [ebp-34]       ; 关闭句柄
    53B47F1A    FF15 7011B453   call    dword ptr [<&KERNEL32.CloseHandl>; kernel32.CloseHandle

    //经过上面的分析,发现是-C出错了,于是挂起了
    00407014    8378 04 00      cmp     dword ptr [eax+4], 0 ;这里需要改一下^^
    00407018    74 16           je      short 00407030
    //修改如下:
    00407014    8378 08 00      cmp     dword ptr [eax+8], 0
    00407018    74 16           je      short 00407030

    //好了一切正常了吃饭去了呵呵^^

    2008年12月19日 18:50

答案

  • 感谢楼主分享你的经验!
    这正是我们需要交流氛围呢!
    提个小建议,以后这样的讨论的主题可以发布成评论帖,就在你发新帖的时候最上方有选择“提问”还是“评论”的地方!
    很高兴认识你!
                                                            版主
                                                           周雪峰
    2008年12月20日 2:55
    版主

全部回复

  • 感谢楼主分享你的经验!
    这正是我们需要交流氛围呢!
    提个小建议,以后这样的讨论的主题可以发布成评论帖,就在你发新帖的时候最上方有选择“提问”还是“评论”的地方!
    很高兴认识你!
                                                            版主
                                                           周雪峰
    2008年12月20日 2:55
    版主
  • 我很少来MSDN,以后会常来看看的~~!

    我这样修改只是我在用VS2003和WIN2003,一时解决不了,就动手自己改了,并没有其他意思的~~!

    很不好意思,刚来,不知道有规定,我看看能改不~~谢谢斑竹~~百忙中回复~~!

    2008年12月20日 7:27