實現W32dsm.exe在2000下的命令列功能,老調重彈啦 (6千字)

看雪資料發表於2015-11-15

一、問題的提出:
    我在SendTo資料夾下放了很多常用的軟體的快捷方式。但是其生效的基本條件是必須支援命令列引數。W32DSM的KILLER版說明支援此引數,而且在WIN98下也透過了。但在2000下用SENDTO會自動退出。

二、查詢原因:
是一個STD指令惹的禍。這個我們在以前已經講過了。
1、
:10043042 890D305A0410            mov dword ptr [10045A30], ecx
:10043048 FD                      std                        ;設定字串處理的方向為逆向,這在NT裡面的一些函式中會發生不可預料的錯誤
:10043049 B05C                    mov al, 5C
:1004304B F2                      repnz
:1004304C AE                      scasb
:1004304D 85C9                    test ecx, ecx
:1004304F 7417                    je 10043068
:10043051 8BD9                    mov ebx, ecx
:10043053 83C702                  add edi, 00000002
:10043056 C647FF00                mov [edi-01], 00
:1004305A 56                      push esi

* Reference To: KERNEL32.SetCurrentDirectoryA, Ord:023Eh    ;呼叫這個函式前要把其字串的處理方向設定為正向
                                  |
:1004305B E8C80C0000              Call 10043D28

2、類似的還有一處(這是我們以前改過的):
:10043168 FD                      std                      ;;;;;;;;;;;;;
:10043169 B05C                    mov al, 5C
:1004316B F2                      repnz
:1004316C AE                      scasb
:1004316D 85C9                    test ecx, ecx
:1004316F 741C                    je 1004318D
:10043171 83C702                  add edi, 00000002
:10043174 C647FF00                mov [edi-01], 00
:10043178 3BFE                    cmp edi, esi
:1004317A 7411                    je 1004318D
:1004317C 56                      push esi

* Reference To: KERNEL32.SetCurrentDirectoryA, Ord:023Eh      ;;;;;;;;;;;;
                                  |
:1004317D E8A60B0000              Call 10043D28

3、修改方法如下(以前也說過):
:10043048 FD                      std
:10043049 B05C                    mov al, 5C
:1004304B F2                      repnz
:1004304C AE                      scasb
:1004304D 85C9                    test ecx, ecx
:1004304F 7417                    je 10043068
:10043051 8BD9                    mov ebx, ecx
:10043053 47                      inc edi                      ;;;;;;;;;;;
:10043054 C60700                  mov byte ptr [edi], 00      ;;;;;;;;;;;
:10043057 47                      inc edi                      ;;;;;;;;;;;
:10043058 FC                      cld                          ;這裡恢復其預設設定
:10043059 90                      nop                          ;呵呵,2條指令變4條,還多了一個位元組
:1004305A 56                      push esi

* Reference To: KERNEL32.SetCurrentDirectoryA, Ord:023Eh
                                  |
:1004305B E8C80C0000              Call 10043D28

三、具體解決方案:
經過跟蹤分析,在KILLER的W32DSM版本中,有兩個對W32PATCH.DLL的寫操作。其中應該以後一個(5271XX處的最終有效)。不管這麼多,都改就行了。

1、這裡:
005411A4    8DB5 953B4000    LEA ESI,DWORD PTR SS:[EBP+403B95]      ;指向%system%\W32PATCH.DLL
005411AA    6A 00            PUSH 0
005411AC    68 80000000      PUSH 80
005411B1    6A 02            PUSH 2
005411B3    6A 00            PUSH 0
005411B5    6A 00            PUSH 0
005411B7    68 00000040      PUSH 40000000
005411BC    56                PUSH ESI
005411BD    FF95 39364000    CALL DWORD PTR SS:[EBP+403639]        ;實際上是CreateFileA
005411C3    83F8 FF          CMP EAX,-1
005411C6    0F84 B9000000    JE W32ASM_2.00541285
...
0054121F    E8 710B0000      CALL W32ASM_2.00541D95
00541224    8D9D 93344000    LEA EBX,DWORD PTR SS:[EBP+403493]
0054122A    6A 00            PUSH 0
0054122C    53                PUSH EBX
0054122D    FFB5 CB344000    PUSH DWORD PTR SS:[EBP+4034CB]
00541233    FFB5 C7344000    PUSH DWORD PTR SS:[EBP+4034C7]        ;指向W32PATCH.DLL的緩衝區的指標
00541239    FFB5 C3344000    PUSH DWORD PTR SS:[EBP+4034C3]
0054123F    FF95 79364000    CALL DWORD PTR SS:[EBP+403679]        ;WriteFile

2、再到這裡:
005271A4    8DB5 953B4000    LEA ESI,DWORD PTR SS:[EBP+403B95]      ;指向%system%\W32PATCH.DLL
005271AA    6A 00            PUSH 0
005271AC    68 80000000      PUSH 80
005271B1    6A 02            PUSH 2
005271B3    6A 00            PUSH 0
005271B5    6A 00            PUSH 0
005271B7    68 00000040      PUSH 40000000
005271BC    56                PUSH ESI
005271BD    FF95 39364000    CALL DWORD PTR SS:[EBP+403639]        ;實際上是CreateFileA
005271C3    83F8 FF          CMP EAX,-1
005271C6    0F84 B9000000    JE W32ASM_2.00527285
...
00527224    8D9D 93344000    LEA EBX,DWORD PTR SS:[EBP+403493]
0052722A    6A 00            PUSH 0
0052722C    53                PUSH EBX
0052722D    FFB5 CB344000    PUSH DWORD PTR SS:[EBP+4034CB]
00527233    FFB5 C7344000    PUSH DWORD PTR SS:[EBP+4034C7]
00527239    FFB5 C3344000    PUSH DWORD PTR SS:[EBP+4034C3]        ;指向W32PATCH.DLL的緩衝區的指標
0052723F    FF95 79364000    CALL DWORD PTR SS:[EBP+403679]        ;WriteFile

3、補丁方案:
這兩處補丁方法都一樣,所以寫一個標準的補丁程式碼段,用CALL呼叫它:)
(1)通用補丁的程式碼:
004AF811    . 8B85 C7344000    MOV EAX,DWORD PTR SS:[EBP+4034C7]
004AF817    . 8BD8            MOV EBX,EAX
004AF819    . 05 71310000      ADD EAX,3171
004AF81E    . 81C3 53300000    ADD EBX,3053
004AF824    . 68 47C60700      PUSH 7C647
004AF829    . 8F00            POP DWORD PTR DS:[EAX]
004AF82B    . FF30            PUSH DWORD PTR DS:[EAX]
004AF82D    . 8F03            POP DWORD PTR DS:[EBX]
004AF82F    . 68 0047FC90      PUSH 90FC4700            ;其中00位元組是重複PUSH和POP的,為了避免影響後續的位元組
004AF834    . 8F40 03          POP DWORD PTR DS:[EAX+3]
004AF837    . FF70 03          PUSH DWORD PTR DS:[EAX+3]
004AF83A    . 8F43 03          POP DWORD PTR DS:[EBX+3]
004AF83D    . 8D9D 93344000    LEA EBX,DWORD PTR SS:[EBP+403493]
004AF843    . C3              RETN

(2)需要修改的跳轉:
a)
00541224    E8 E8E5F6FF        CALL W32ASM_2.004AF811        ;這裡
00541229    90                NOP
0054122A    6A 00              PUSH 0
0054122C    53                PUSH EBX
0054122D    FFB5 CB344000      PUSH DWORD PTR SS:[EBP+4034CB]
00541233    FFB5 C7344000      PUSH DWORD PTR SS:[EBP+4034C7]
00527239    FFB5 C3344000      PUSH DWORD PTR SS:[EBP+4034C3]        ;指向W32PATCH.DLL的緩衝區的指標
0052723F    FF95 79364000      CALL DWORD PTR SS:[EBP+403679]        ;WriteFile
b)
00527224    E8 E885F8FF        CALL W32ASM_2.004AF811
00527229    90                NOP
0052722A    6A 00              PUSH 0
0052722C    53                PUSH EBX
0052722D    FFB5 CB344000      PUSH DWORD PTR SS:[EBP+4034CB]
00527233    FFB5 C7344000      PUSH DWORD PTR SS:[EBP+4034C7]
00527239    FFB5 C3344000      PUSH DWORD PTR SS:[EBP+4034C3]        ;指向W32PATCH.DLL的緩衝區的指標
0052723F    FF95 79364000      CALL DWORD PTR SS:[EBP+403679]        ;WriteFile

四、完成啦。太過弱智化,高手莫笑。


wscn
02/10/15

相關文章