首页 > 编程语言 >Win32编程之函数转发注入DLL(十五)

Win32编程之函数转发注入DLL(十五)

时间:2023-09-21 11:45:59浏览次数:40  
标签:include targetdll hModule int 编程 dll Win32 DLL

一、创建目标DLL文件

DLL名称:targetdll.dll

头文件(targetdll.h):

#pragma once

__declspec(dllexport) void __stdcall hello();
__declspec(dllexport) int __stdcall add(int a, int b);

源文件(targetdll.cpp)  

#include <stdio.h>
#include "targetdll.h"

void __stdcall hello() {
	printf("\n--------------------------\n");
	printf("\n-----------hello-------------\n");
	printf("\n------------------------\n");
}

int __stdcall add(int a, int b) {
	printf("\n------------------------\n");
	printf("\n-----------add-------------%d\n", a + b);
	printf("\n------------------------\n");

	return (a + b);
}

 二、DLL文件的调用:

#include <Windows.h>
#include <stdio.h>
#include "targetdll.h"

typedef int (*ADD_FUNC)(int a, int b);

int main() {
	HMODULE hModule = LoadLibrary(TEXT("targetdll.dll"));
	if (hModule == NULL) {
		printf("dll加载失败\n");

		return 0;
	}

	FARPROC pFn = GetProcAddress(hModule, "hello");
	pFn();

	ADD_FUNC pAdd = (ADD_FUNC)GetProcAddress(hModule, "add");
	pAdd(10, 20);

	FreeLibrary(hModule);

	system("pause");
		 
	return 1;
}

输出结果:  

三、创建替换DLL文件

DLL名称:replacedll.dll

转发指令:#pragma comment(linker, "/export:导出名称=被转发的dll名称.被转发的函数名称")

#include <Windows.h>
#include "replacedll.h"

#pragma comment(linker, "/export:hello=targetdll_old.hello")

BOOL APIENTRY DllMain(HMODULE hModule,
    DWORD  ul_reason_for_call,
    LPVOID lpReserved
)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        OutputDebugString(TEXT("Load replacedll"));
        break;
    case DLL_THREAD_ATTACH:break;
    case DLL_THREAD_DETACH:break;
    case DLL_PROCESS_DETACH:
        OutputDebugString(TEXT("UnLoad replacedll"));
        break;
    }
    return TRUE;
}

 将目标文件targetdll.dll改为targetdll_old.dll;然后将替换文件replacedll.dll改成目标文件targetdll.dll,然后调用:

#include <Windows.h>
#include <stdio.h>
#include "targetdll.h"

typedef int (*ADD_FUNC)(int a, int b);

int main() {
	HMODULE hModule = LoadLibrary(TEXT("targetdll.dll"));
	if (hModule == NULL) {
		printf("dll加载失败\n");

		return 0;
	}

	FARPROC pFn = GetProcAddress(hModule, "hello");
	pFn();

	//ADD_FUNC pAdd = (ADD_FUNC)GetProcAddress(hModule, "add");
	//pAdd(10, 20);

	FreeLibrary(hModule);

	system("pause");

	return 1;
}

打印结果:

 

  

 

  

 

标签:include,targetdll,hModule,int,编程,dll,Win32,DLL
From: https://www.cnblogs.com/TechNomad/p/17719552.html

相关文章

  • HNU 结对编程 对队友代码的分析 中小学数学卷子自动生成程序
    基本功能实现一、主要内容认真学习和阅读同伴的代码,分析优劣。二、题目要求个人项目:中小学数学卷子自动生成程序用户:小学、初中和高中数学老师。功能:1、命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根......
  • 并发编程系列 - ReadWriteLock
    实际工作中,为了优化性能,我们经常会使用缓存,例如缓存元数据、缓存基础数据等,这就是一种典型的读多写少应用场景。缓存之所以能提升性能,一个重要的条件就是缓存的数据一定是读多写少的,例如元数据和基础数据基本上不会发生变化(写少),但是使用它们的地方却很多(读多)。针对读多写少这种并......
  • 【赠书活动 -第01期】-〖Java编程思想(第四版)〗
    【赠书活动-第01期】-〖Java编程思想(第四版)〗活动时间:2023年9月21日~2023年9月30日参与方式:https://m.hlcode.cn/?id=NK1fWUR......
  • SHELL编程开发:如何轻松一键部署Nginx脚本
    实现思路下载Nginx源码包解压源码包进入解压后的目录配置编译选项编译并安装Nginx启动Nginx服务代码实现以下是脚本内容及注释:#!/bin/bash#一键部署Nginx脚本#下载Nginx源码包wgethttp://nginx.org/download/nginx-1.20.1.tar.gz#解压源码包tar-zxvfnginx-1.20.1.tar.......
  • 论文查重-第一次个人编程
    1、github链接:https://github.com/lanzeye7/lanzeye72、PSP表格PSP2.1PersonalSoftwareProcessStages预估耗时(分钟)实际耗时(分钟)Planning计划 60 85·Estimate·估计这个任务需要多少时间 180 210Development开发......
  • 日常编程奇葩又常规问题总结
    相信大家在日常编程中遇到过不少奇葩问题,第一反应就是不可能,怎么可能会出现这个问题呢?于是抓耳挠腮,带着充满疑惑的问题,四处寻找答案。其实遇到问题并不可怕,可怕的是我们缺少解决问题的信心,正所谓只要思想不滑坡,办法总比困难多。解决问题才是打工人的价值所在,也是个人价值展现......
  • Java学习之路--GUI编程06
    packagecom.gui.lesson06;importjavax.swing.*;importjava.awt.*;//2023.3.25/3.26GUI编程--下拉框学习(Combobox)//这个程序最终运行结果不美观,正常情况下下拉框我们放在一个面板里面再添加到容器中。这里就只是演示下拉框是什么样子publicclassTestComboboxDemo01extendsJ......
  • Java学习之路--GUI编程--贪吃蛇小游戏
    贪吃蛇小游戏界面实现四步走1.定义数据2.面板里将数据画上去3.监听事件键盘事件packagecom.gui.snake;importjavax.swing.*;importjava.net.URL;//2023.3.28GUI编程--贪吃蛇小游戏的实现--数据中心(只有一堆图片的数据)--贪吃蛇各个部分的导入--图片文件夹有两种导入......
  • 《Linux命令行与shell脚本编程大全.第3版》电子书PDF+源代码
    精通Linux命令行与shell脚本编程,尽在本书中本书是关于Linux命令行和shell命令的全面参考资料,涵盖详尽的动手教程和实际应用指南,并提供相关参考信息和背景资料,带你从Linux命令行基础入手,直到写出自己的shell。时隔四年后的这一版本,针对Linux的新特性和实践,进行了全面更新:使用......
  • Java学习之路--GUI编程03
    packagecom.gui.lesson03;importjava.awt.*;importjava.awt.event.KeyAdapter;importjava.awt.event.KeyEvent;//2023.3.20GUI编程--键盘监听学习publicclassTestKeyListener{publicstaticvoidmain(String[]args){newKeyFrame();}}//键盘监听类cla......