通过中转DLL函数实现DLL劫持
当我们运行程序时,一般情况下会默认加载Ntdll.dll和Kernel32.dll这两个链接库,在进程未被创建之前Ntdll.dll库就被默认加载了,三环下任何对其劫持都是无效的,除了该Dll外,其他的Dll都是在程序运行时,在输入表中查找到对应关系后才会被装载到内存中的,理论上来说对除NtDll以外的其他库都是可操作的。
工具下载:工具下载地址:http://lyshark.github.io/soft/PETools.zip
而DLL的装载是存在先后顺序的,当系统开机时smss.exe会将系统中常用的DLL缓存到注册表计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs中的位置上,我们可以跳转过去看看里面存放的内容,都是一些常用的函数库。

当指定DLL需要加载时,系统会首先查询该表中是否存在有缓存数据,如果有则就直接调用NtMapViewOfSection函数将其映射到特定进程的内存中,如果没有则就需要根据如下顺序动态的查找。
- 先查找,正在加载DLL进程的可执行目录。
- 查找系统的system32目录下是否存在。
- 查找,正在加载DLL进程的当前目录。
- Path环境变量中的定义。
这里就先来演示一下简单的Dll劫持,首先我们必须指定要劫持的Dll文件,将其中的导出函数全部导出来,导出的输入表项目只能比原来的多,不能少,导出的方式有很多,比如可以使用AheadLib等工具,快速生成利用代码,通常可用于劫持的DLL有 lpk.dll,version.dll 等系统DLL,当前程序的第三方DLL同样可以,本教程并不适用AheadLib工具,而是使用GenEAT.exe工具:
1.先来创建一个DLL并导出两个函数,然后创建主程序动态的加载这个DLL。
lyshark.cpp 编译生成为DLL
#include <Windows.h>
extern "C" int __declspec(dllexport)add(int x, int y)
{
return x + y;
}
extern "C" int __declspec(dllexport)sub(int x, int y)
{
return x - y;
}
extern "C" int __declspec(dllexport)mul(int x, int y)
{
return x * y;
}
extern "C" int __declspec(dllexport)divs(int x, int y)
{
return x / y;
}
BOOL APIENTRY DllMain(HANDLE handle, DWORD dword, LPVOID lpvoid)
{
return true;
}
编译后使用上次制作的PETools工具,执行命令PETools c://lyshark.dll --ShowExport 可看到其导出的函数。

编译main.cpp 动态加载函数,将lyshark.dll放入同一个目录下即可,程序运行后会动态调用DLL中的导出函数。
#include <stdio.h>
#include <Windows.h>
typedef int(*lpAdd)(int, int);
typedef int(*lpSub)(int, int);
typedef int(*lpMul)(int, int);
typedef int(*lpDiv)(int, int);
int main(int argc, char *argv[])
{
HINSTANCE DllAddr;
lpAdd addFun;
DllAddr = LoadLibrary(L"lyshark.dll");
addFun = (lpAdd)GetProcAddress(DllAddr, "add");
if (NULL != addFun)
{
int res = addFun(100, 200);
printf("结果: %d \n", res);
}
FreeLibrary(DllAddr);
system("pause");
return 0;
}
下面就来实现函数转发功能,当程序访问原DLL时直接将请求转发到我们自己的DLL中,我们的DLL再将请求转发到真实的DLL上面,使用本节课的小工具可以快速构建转发函数表,执行如下命令即可:GenEAT.exe -d c://lyshark.dll -c inject.cpp -n Lok


默认会生成如下样子,直接在里面加上一个弹窗,然后编译DLL。

将生成的Dll改名为lyshark.dll把原来的lyshark.dll改为lok.dll

当再次打开时,会先加载弹窗,然后才会完成计算功能,也算是中转成功了。

你可以对其导出函数进行Hook转向,读取参数啥的都没问题,自由发挥吧。
通过中转DLL函数实现DLL劫持的更多相关文章
- GO语言 -- 调用DLL函数,填平所有的坑,最详尽攻略
编译dll文件(源代码c++):g++ -shared main.cpp -o test.dll set GOARCH=386 第一个DLL函数,第一个参数,要求传入一个指针,直接指向[]byte类型 ...
- C#中可直接调用WIN32的API函数--USER32.DLL
Win32的API函数可以直接在C#中直接调用,在做WinForm时还是很有帮助的.有时候直接调用Win32的API,可以很高效的实现想要的效果. using System; using System ...
- C#调用C++编写的DLL函数, 以及各种类型的参数传递 (转载)
C#调用C++编写的DLL函数, 以及各种类型的参数传递 1. 如果函数只有传入参数,比如: C/C++ Code Copy Code To Clipboard //C++中的输出函数 int ...
- 在 C++Builder 工程里调用 DLL 函数
调用 Visual C++ DLL 给 C++Builder 程序员提出了一些独特的挑战.在我们试图解决 Visual C++ 生成的 DLL 之前,回顾一下如何调用一个 C++Builder 创建的 ...
- DLL函数中内存分配及释放的问题
DLL函数中内存分配及释放的问题 最近一直在写DLL,遇到了一些比较难缠的问题,不过目前基本都解决了.主要是一些内存分配引起问题,既有大家经常遇到的现象也有特殊的 情况,这里总结一下,做为资料. 错误 ...
- C#动态调用C++编写的DLL函数
C#动态调用C++编写的DLL函数 动态加载DLL需要使用Windows API函数:LoadLibrary.GetProcAddress以及FreeLibrary.我们可以使用DllImport在C ...
- IronPython调用C# DLL函数方法
C# DLL源码 using System; using System.Collections.Generic; using System.Text; using System.Security.Cr ...
- 一个简洁通用的调用DLL函数的帮助类
本次介绍一种调用dll函数的通用简洁的方法,消除了原来调用方式的重复与繁琐,使得我们调用dll函数的方式更加方便简洁.用过dll的人会发现c++中调用dll中的函数有点繁琐,调用过程是这样的:在加载d ...
- dll的概念 dll导出变量 函数 类
1. DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用. 静态链接库与动态链接库的区别: (1)静态链接 ...
随机推荐
- Python高级——多任务编程之线程
转: Python高级--多任务编程之线程 文章目录 线程概念 1. 线程的介绍 2. 线程的概念 3. 线程的作用 多线程的使用 1. 导入线程模块 2. 线程类Thread参数说明 3. 启动线程 ...
- NPOI 在指定单元格导入导出图片
NPOI 在指定单元格导入导出图片 Intro 我维护了一个 NPOI 的扩展,主要用来导入导出 Excel 数据,最近有网友提出了导入 Excel 的时候解析图片的需求,于是就有了本文的探索 导入E ...
- P2764 最小路径覆盖问题 题解(二分图)
建图思路很明确,拆点跑最大匹配,但这明显是个二分图的题题解居然只有一篇匈牙利算法. 发一种和之前那篇匈牙利思路略有不同的题解. 本题的难点就是如何输出,那么我们不妨在建图的时候加入一个原则,即:连边时 ...
- Python3中变量作用域nonlocal的总结
最近,在工作中踩到了一个关于Python3中nonlocal语句指定的变量作用域的坑.今天趁周六休息总结记录一下. 众所周知,Python中最常见的作用域定义如下: 但是,为了更加方便地在闭包函数 ...
- vscode配置c\c++环境
目录 一.安装vscode 二.安装插件以及配置c\c++编译环境 1. 安装以下两个插件 2. 配置编译环境 一.安装mingw64(推荐) 方法一 方法二 二.如果你安装过visual studi ...
- Logback简介及配置文件logback.xml详解
logback简介及配置文件说明 @author:wangyq @date:2021年3月31日 logback简介 Logback是由log4j创始人设计的另一个开源日志组件,官方网站: htt ...
- Java学习之数组的简单用法
•概念 其实所谓的数组指的就是一组相关类型的变量集合,并且这些变量可以按照统一的方式进行操作. 数组本身属于引用数据类型,那么既然是引用数据类型,这里面实际又会牵扯到内存分配: 而数组的定义语法有两种 ...
- 学习笔记-ionic3 环境配置搭建到打包
折腾了两周总算理清楚了,参考的链接如下: https://blog.csdn.net/zeternityyt/article/details/79655150 环境配置 https://segmen ...
- maven setting.xml 阿里云镜像 没有一句废话
<?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Soft ...
- 000 - 准备工作ADB wifi连接多台鸿蒙设备进行调试
首先将两台鸿蒙设备插入电脑的usb上 查看两台鸿蒙设备的deviceid C:\Users\Administrator>adb devices * daemon not running; sta ...