實現W32dsm.exe在2000下的命令列功能,老調重彈啦 (6千字)
一、問題的提出:
我在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
相關文章
- 在NT/2000下實現關機! (轉)2007-12-04
- 四個 Python 庫,實現超實用的命令列功能2017-06-29Python命令列
- 在win2000下破解CopyFaster (7千字)2001-07-14AST
- 命令列下Git呼叫IDEA的diff功能2022-02-28命令列GitIdea
- 在Windows NT/2000下實現"軟"RAID的方法(轉)2007-08-11WindowsAI
- 在sqlplus中實現命令的上翻下翻功能2012-07-17SQL
- 在linux上用dd命令實現ghost功能2015-09-16Linux
- git在windows命令列下使用2016-03-09GitWindows命令列
- Go使用websocket實現彈幕功能2020-08-14GoWeb
- Android彈幕功能實現,模仿鬥魚直播的彈幕效果2017-07-06Android
- JS陣列去重的實現2020-09-09JS陣列
- 在electron下實現PDF線上預覽功能2019-04-16
- 在VMWare虛擬機器中實現trw2000的除錯功能2015-11-15虛擬機除錯
- [軟體人生]老程式設計師的轉型問題——老話重彈2012-11-03程式設計師
- 在命令列下使用vs的編譯器2012-04-21命令列編譯
- [轉]在命令列下更改IP地址2008-01-03命令列
- vue pc端實現 直播功能+彈幕2019-05-26Vue
- SQLSERVER2008全文檢索功能(命令列實現)2010-07-06SQLServer命令列
- VB6初步實現在WINXP下類似WIN7顯示桌面的功能2009-11-28Win7
- JS實現陣列去重2019-04-11JS陣列
- 如何實現陣列去重?2018-10-23陣列
- 在Linux終端命令列下播放音樂的命令(Ubuntu)2016-11-13Linux命令列Ubuntu
- 在 Linux 命令列下使用“原力”2019-05-21Linux命令列
- 新手必學的使用命令列實現tab鍵自動補全功能2021-09-11命令列
- JavaFx 軟體重啟功能實現2022-01-28Java
- 為Asp-Loader增加命令列功能,高手莫笑 (7千字)2002-10-15命令列
- 更快的方式實現 PHP 陣列去重2016-01-18PHP陣列
- 命令列進度條實現2017-10-06命令列
- 正則實現陣列濾重2019-01-04陣列
- 用連結串列實現佇列的功能2019-01-08佇列
- servlet實現下載功能2020-09-26Servlet
- rlwrap 的安裝使用(實現sqlplus下命令列history編輯)2012-11-14SQL命令列
- 教你在命令列下執行PHP和MySQL2014-12-12命令列PHPMySql
- ngxtop:在命令列實時監控 Nginx 的神器2014-06-26命令列Nginx
- 用canvas實現視訊播放與彈幕功能2017-12-07Canvas
- JavaScript實現陣列去重的常見方式2019-06-02JavaScript陣列
- Win2000命令列精華篇(轉)2007-08-11命令列
- 6 使用DGMGRL命令列的場景2020-03-29命令列