首页
社区
课程
招聘
[推荐]一段不错的DLL自删除代码
发表于: 2009-4-21 15:26 12814

[推荐]一段不错的DLL自删除代码

2009-4-21 15:26
12814
估计大伙都知道了,给还不知道的大伙简单重复下

#include <windows.h>
#include <tchar.h>

HMODULE hDll;

extern "C" __declspec(dllexport) void DeleteMe()
{
	//在这里干其它想干的事,如删除其它exe文件

	//下面代码实现DLL自删除
	TCHAR* szDll = (TCHAR*)VirtualAlloc(NULL, MAX_PATH, MEM_COMMIT, PAGE_READWRITE);
	GetModuleFileName(hDll, szDll, MAX_PATH);

	__asm
	{
		push 0				;参数1
		push 0
		push szDll			;参数2
		push ExitProcess
		push hDll			;参数3
		push DeleteFile
		push FreeLibrary
		ret					
	}
}

BOOL APIENTRY DllMain(HMODULE hModule,
					  DWORD  ul_reason_for_call,
					  LPVOID lpReserved
					  )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		hDll = hModule;
		break;
	case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}


将代码编译为test.dll,然后rundll32 test.dll,DeleteMe运行,test.dll就自己删除了

那段__asm代码就是精华所在了

执行ret后,就返回到FreeLibrary处去执行,这时候ESP+4就是FreeLibrary的参数,也就是相当于调用了FreeLibrary(参数3),而参数3是DLL自身的模块句柄,所以相当于DLL自己把自己从rundll32.exe里给卸载了;

FreeLibrary执行完后会将参数3出栈,并返回到DeleteFile处去执行,这时相当于调用了DeleteFile(参数2),参数2就是DLL文件自身的路径啦,这个路径必须存放在用VirtualAlloc在rundll32.exe里分配的内存,因为这时DLL已经被卸载了;

同理最后调用的是ExitProcess(参数1),防止rundll32继续运行下去出错。

这样DLL就可以实现自删除啦,这有啥用捏?借助这个DLL,可以实现EXE的自删除,例如把这个DLL放到一个EXE里,当EXE需要自删除的时候,先释放出DLL,然后把EXE自身的路径告诉DLL,最后CreateProcess  rundll32 xxx.dll,DeleteMe,DeleteMe里先删除EXE,再自删除,就可以实现EXE的自删除啦

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (25)
雪    币: 340
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
听说只能在xp下
2009-4-21 17:19
0
雪    币: 424
活跃值: (1879)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
2003、Vista都可以
2009-4-21 18:21
0
雪    币: 107
活跃值: (1693)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
4
巧  顶
2009-4-21 19:26
0
雪    币: 193
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
汇编的技巧真多啊,仔细琢磨下!
2009-4-22 10:10
0
雪    币: 229
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
不错,,多谢了
2009-4-23 16:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
好东西~回头试一试~先转掉~~
2009-4-23 17:32
0
雪    币: 268
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
同理最后调用的是ExitProcess(参数1),防止rundll32继续运行下去出错。
请教下,按照FreeLibrary和DeleteFile
的思路,我怎么觉得取不到参数1呀
2009-4-23 20:59
0
雪    币: 424
活跃值: (1879)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
少写了个push 0,呵呵,多谢指正,这回对了吧
2009-4-23 23:05
0
雪    币: 111
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
很精妙呀,学习了
2009-4-24 09:12
0
雪    币: 270
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
不错的方法
2009-4-24 11:06
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
12
不如reloadandrun
2009-4-24 11:23
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
不错,很巧妙
2009-4-30 08:51
0
雪    币: 301
活跃值: (300)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
14
有没有哪位兄弟翻译成delphi版的看看呢
2009-4-30 10:54
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
不错,怎么才能改成exe的?
2009-4-30 16:26
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
在windowsxp下好像实现exe的自删除只能通过注入,命令行实现,目前还不知道有其他办法能购实现不依赖其他程序的自删除
2009-4-30 16:35
0
雪    币: 296
活跃值: (89)
能力值: ( LV15,RANK:340 )
在线值:
发帖
回帖
粉丝
17
Delphi的很容易改啊,注意下BASM的API调用方式就行了。
其实这个代码巧妙的地方在于,FreeLibrary后依靠残留在栈中的参数继续ret:
library selfdel;

uses
  SysUtils,
  Windows;

procedure DeleteMe();
var
  pDllName: PChar;
begin
  MessageBox(0, '自删除DLL演示!', 'Call DeleteMe()', MB_OK);

  pDllName := VirtualAlloc(nil, MAX_PATH, MEM_COMMIT, PAGE_READWRITE);
  GetModuleFileName(HInstance, pDllName, MAX_PATH);

  asm
    push 0           // 参数1
    push pDllName    // 参数2

    // ExitProcess:
    // 0040785C FF25 786D4700     jmp dword ptr [$00476d78]
    mov eax, DWORD ptr [ExitProcess+2]    // long JMP +2
    push DWORD ptr [eax]                  // Func Address

    push HInstance   // 参数3

    mov eax, DWORD ptr [DeleteFile+2]
    push DWORD ptr [eax]

    mov eax, DWORD ptr [FreeLibrary+2]
    push DWORD ptr [eax]
    ret
  end;
end;

exports
  DeleteMe;

begin
end.


运行方法:rundll32 selfdel.dll, DeleteMe
2009-4-30 21:25
0
雪    币: 105
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
能向运行中的EXE文件写入数据吗?
不考虑生成程序副本
以前听说在驱动层可以做到,但不知道如何做。
直接写物理硬盘理论上能实现吗?
2009-5-1 12:47
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
不错,精巧!!
2009-5-2 13:49
0
雪    币: 471
活跃值: (4048)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
20
bat
del xxx.exe
del %0
2009-5-2 18:49
0
雪    币: 393
活跃值: (100)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
21
cmd /c "path"
2009-5-2 20:01
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
这个不错,好玩
2009-5-3 13:19
0
雪    币: 357
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
学习了.ASM用得真是好啊
2009-5-3 13:39
0
雪    币: 91
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
WinExec(Pchar('cmd /c del '+GetCommandLine),SW_HIDE); 这样就可以了吧
2009-6-11 12:22
0
雪    币: 214
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
25
收藏了
2009-6-11 14:15
0
游客
登录 | 注册 方可回帖
返回
//