001 ;找個時間,把上次還沒搞完的應用給補上,用OD加載上次脫過殼的產品,在如下函數上下斷:
002 TerminateProcess
003 SetWindowsHookExA
004 UnhookWindowsHookEx
005 MessageBoxA
006 lstrlenA
007 lstrcatA
008 GetWindowTextA
009 GetWindowThreadProcessId
010 CreateEventA
011 CreateFileA
012 CreateMutexA
013 CreateProcessA
014 CreateServiceA
015 CreateThread
016 CreateToolhelp32Snapshot
017 DeviceIoControl
018 fopen
019 ;搞定之後,F9,斷在lstrcatA,可以發現它在進行字符串連接,然後就是寫註冊表啓動項:
020 004019AB 68 80000000 push 80
021 004019B0 68 1E344000 push Rtvcan_u.0040341E ; ASCII "C:/WINNT/system32/Rtvcan.exe"
022 004019B5 E8 04050000 call <jmp.&KERNEL32.GetSystemDirecto>
023 004019BA 68 1E344000 push Rtvcan_u.0040341E ; ASCII "C:/WINNT/system32/Rtvcan.exe"
024 004019BF E8 2A050000 call <jmp.&KERNEL32.SetCurrentDirect>
025 004019C4 68 03344000 push Rtvcan_u.00403403 ; ASCII "/Rtvcan.exe"
026 004019C9 68 1E344000 push Rtvcan_u.0040341E ; ASCII "C:/WINNT/system32/Rtvcan.exe"
027 004019CE E8 3F050000 call <jmp.&KERNEL32.lstrcat> ;斷在這裏
028 004019D3 68 16344000 push Rtvcan_u.00403416
029
030 ;這裏有個比較不合理的地方,它已經將路徑進行了硬編碼,即使Rtccan.exe不在system32目錄下,它也會;按照這種寫入。
031 ;往下翻翻代碼就會看見,它打開文件了//./Rtvcan,這裏它倒是有判斷,但由於該驅動已經被停,所以它會;彈出一個錯誤對話框。
032 00401A42 68 3B214000 push Rtvcan_u.0040213B ; ASCII "//./Rtvcan"
033 00401A47 E8 0C040000 call <jmp.&KERNEL32.CreateFileA>
034 00401A4C A3 00304000 mov dword ptr ds:[403000],eax ;保存文件句柄
035 00401A51 83F8 FF cmp eax,-1
036 00401A54 75 0F jnz short Rtvcan_u.00401A65 ;不失敗則跳
037
038 ;爲了滿足想看看這運行效果的好奇心,啓動它的驅動(你可以用4F的KmdManager),運行,竟然沒看見界面
039 ;汗..
040 ;接着幹活,
041 00401A4C A3 00304000 mov dword ptr ds:[403000],eax ; 保存文件句柄
042 00401A51 83F8 FF cmp eax,-1
043 00401A54 75 0F jnz short Rtvcan_u.00401A65
044 00401A56 E8 CDF5FFFF call Rtvcan_u.00401028
045 00401A5B E8 0FF6FFFF call Rtvcan_u.0040106F
046 00401A60 A3 00304000 mov dword ptr ds:[403000],eax
047 00401A65 833D 00304000 FF cmp dword ptr ds:[403000],-1 ; 打開文件是否失敗
048 00401A6C 0F84 2A010000 je Rtvcan_u.00401B9C
049 00401A72 6A 00 push 0
050 00401A74 6A 00 push 0
051 00401A76 6A 00 push 0
052 00401A78 6A 00 push 0
053 00401A7A E8 D3030000 call <jmp.&KERNEL32.CreateEventA>
054 00401A7F A3 04304000 mov dword ptr ds:[403004],eax ; 保存事件句柄
055 00401A84 51 push ecx
056 00401A85 54 push esp
057 00401A86 6A 00 push 0
058 00401A88 FF35 04304000 push dword ptr ds:[403004] ; 將事件句柄傳給線程
059 00401A8E 68 FA184000 push Rtvcan_u.004018FA ; 線程函數
060 00401A93 6A 00 push 0
061 00401A95 6A 00 push 0
062 00401A97 E8 CE030000 call <jmp.&KERNEL32.CreateThread>
063 00401A9C 59 pop ecx
064 00401A9D 0BC0 or eax,eax
065 00401A9F 0F84 9B000000 je Rtvcan_u.00401B40
066 00401AA5 50 push eax
067 00401AA6 E8 A1030000 call <jmp.&KERNEL32.CloseHandle>
068 00401AAB 6A 00 push 0
069 00401AAD 8D45 FC lea eax,dword ptr ss:[ebp-4] ; DWORD dwReted
070 00401AB0 50 push eax ; push &dwReted
071 00401AB1 6A 00 push 0
072 00401AB3 6A 00 push 0
073 00401AB5 6A 04 push 4 ; 緩衝大小
074 00401AB7 68 04304000 push Rtvcan_u.00403004 ; 輸入緩衝區
075 00401ABC 68 00A02200 push 22A000 ; 控制代碼
076 00401AC1 FF35 00304000 push dword ptr ds:[403000]
077 00401AC7 E8 B0030000 call <jmp.&KERNEL32.DeviceIoControl>
078 00401ACC 0BC0 or eax,eax
079 00401ACE 74 5E je short Rtvcan_u.00401B2E
080 00401AD0 6A 00 push 0
081 00401AD2 E8 DB030000 call <jmp.&KERNEL32.GetModuleHandleA>
082 00401AD7 A3 08304000 mov dword ptr ds:[403008],eax ; 本模塊
083 00401ADC E8 28F7FFFF call Rtvcan_u.00401209
084 00401AE1 6A 00 push 0
085 00401AE3 8D45 FC lea eax,dword ptr ss:[ebp-4]
086 00401AE6 50 push eax
087 00401AE7 6A 00 push 0
088 00401AE9 6A 00 push 0
089 00401AEB 6A 00 push 0
090 00401AED 6A 00 push 0
091 00401AEF 68 04202200 push 222004 ; 控制代碼
092 00401AF4 FF35 00304000 push dword ptr ds:[403000]
093 00401AFA E8 7D030000 call <jmp.&KERNEL32.DeviceIoControl>
094 ;可以看到它在這裏創建了一個線程,線程函數地址是004018FA,現在我們就去看看它在線程函數裏幹什麼了;:
095 004018FA 55 push ebp ; 線程函數
096 004018FB 8BEC mov ebp,esp
097 004018FD 83C4 F4 add esp,-0C
098 00401900 C745 F8 20030000 mov dword ptr ss:[ebp-8],320 ; 分配320字節
099 00401907 FF75 F8 push dword ptr ss:[ebp-8]
100 0040190A E8 F1F6FFFF call Rtvcan_u.00401000 ; 分配內存
101 0040190F 0BC0 or eax,eax
102 00401911 0F84 83000000 je Rtvcan_u.0040199A ; 失敗則結束線程
103 00401917 8945 FC mov dword ptr ss:[ebp-4],eax ; 保存分配到的內存
104 0040191A 6A FF push -1
105 0040191C FF75 08 push dword ptr ss:[ebp+8] ; 在此事件上等待
106 0040191F E8 E8050000 call <jmp.&KERNEL32.WaitForSingleObject>; 等待
107 00401924 83F8 FF cmp eax,-1
108 00401927 74 51 je short Rtvcan_u.0040197A
109 00401929 833D 14304000 01 cmp dword ptr ds:[403014],1 ;一個標誌位
110 00401930 74 60 je short Rtvcan_u.00401992 ; 等於1則結束
111 00401932 6A 64 push 64
112 00401934 E8 C7050000 call <jmp.&KERNEL32.Sleep> ; 休息0.064秒
113 00401939 6A 00 push 0
114 0040193B 8D45 F4 lea eax,dword ptr ss:[ebp-C] ; DWORD dwReted
115 0040193E 50 push eax ; push &dwReted
116 0040193F FF75 F8 push dword ptr ss:[ebp-8] ; 緩衝區大小
117 00401942 FF75 FC push dword ptr ss:[ebp-4] ; 輸出緩衝區
118 00401945 6A 00 push 0
119 00401947 6A 00 push 0
120 00401949 68 08602200 push 226008 ; 控制代碼
121 0040194E FF35 00304000 push dword ptr ds:[403000] ; 設備句柄
122 00401954 E8 23050000 call <jmp.&KERNEL32.DeviceIoControl>
123 00401959 0BC0 or eax,eax
124 0040195B 74 11 je short Rtvcan_u.0040196E
125 0040195D 837D F4 00 cmp dword ptr ss:[ebp-C],0 ; 如果返回字節數爲0
126 00401961 74 0B je short Rtvcan_u.0040196E
127 00401963 FF75 F4 push dword ptr ss:[ebp-C] ; 返回字節數
128 00401966 FF75 FC push dword ptr ss:[ebp-4] ; 輸出緩衝區
129 00401969 E8 73FEFFFF call Rtvcan_u.004017E1
130 0040196E 68 84030000 push 384
131 00401973 E8 88050000 call <jmp.&KERNEL32.Sleep> ; 又休息
132 00401978 EB 16 jmp short Rtvcan_u.00401990
133 0040197A 6A 10 push 10
134 0040197C 6A 00 push 0
135 0040197E 68 46214000 push Rtvcan_u.00402146 ; ASCII "Wait failed. Thread now exits. Restart application."
136 00401983 FF35 0C304000 push dword ptr ds:[40300C]
137 00401989 E8 94040000 call <jmp.&USER32.MessageBoxA>
138 0040198E EB 02 jmp short Rtvcan_u.00401992
139 00401990 ^ EB 88 jmp short Rtvcan_u.0040191A ; 繼續循環
140 00401992 FF75 FC push dword ptr ss:[ebp-4]
141 00401995 E8 7AF6FFFF call Rtvcan_u.00401014 ; 釋放內存
142 0040199A 6A 00 push 0
143 0040199C E8 E7040000 call <jmp.&KERNEL32.ExitThread>
144 004019A1 C9 leave
145 004019A2 C2 0400 retn 4
146
147 ;在線程裏它會通過DeviceIoControl向驅動要數據,然後通過00401969處的CALL進一步處理,在00401ADC處;的CALL 00401209的代碼中,它先會用互斥來保證單實例運行,然後通過RegisterHotKey註冊F11,再然後;就是鉤子了,鉤子函數地址是0040127F,會在函數中監視鍵盤,當然也會有其它的操作如枚舉DLL等,
148 ;由於這個鉤子有點礙事,所以得將00401DAC處的調用NOP掉,繼續F8就會發現緊隨其後的DeviceIoControl;調用失敗,調試到此結束。除以上說的這些之外,它還會創建文件併發送,這個在上次就已經提到了。
149
150 ;太累了,睡覺去
終於補課了:Rtvcan.exe
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.