首页
社区
课程
招聘
[求助]各位帮忙看看这个函数,yC壳里的一段代码
发表于: 2009-4-13 16:53 3744

[求助]各位帮忙看看这个函数,yC壳里的一段代码

2009-4-13 16:53
3744
//----------------------------------------------------------------
//The _ImageRvaToSection function locates a relative virtual 
//address (RVA) within the image header of a file that is 
//mapped as a file and returns a pointer to the section table 
//entry for that virtual address.
PIMAGE_SECTION_HEADER _ImageRvaToSection(char* Base,DWORD dwRVA)
{
	IMAGE_SECTION_HEADER section;
	IMAGE_NT_HEADERS nt_headers;
	DWORD dwPE_Offset,SectionOffset;
	CopyMemory(&dwPE_Offset,Base+0x3c,4);
	CopyMemory(&nt_headers,Base+dwPE_Offset,sizeof(IMAGE_NT_HEADERS));
	SectionOffset=dwPE_Offset+sizeof(IMAGE_NT_HEADERS);
	for(int i=0;i<nt_headers.FileHeader.NumberOfSections;i++)
	{
		CopyMemory(§ion,Base+SectionOffset+i*0x28,sizeof(IMAGE_SECTION_HEADER));
		if((dwRVA>=section.VirtualAddress) && (dwRVA<=(section.VirtualAddress+section.SizeOfRawData)))
		{
			return ((PIMAGE_SECTION_HEADER)§ion);
		}
	}
	return(NULL);
}


这里
return ((PIMAGE_SECTION_HEADER)§ion);

该函数返回一个局部变量的地址。。这样也可以?
返回后栈内的数据是无效的了吧,也就是说返回了一个指针指向了无效的内容

是我哪看错了吗?

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 612
活跃值: (961)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
C++函数一般返回值是放在寄存器的~
LZ自己去GG下函数调用约定看看....
2009-4-13 18:03
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
3
这样写的确不保险,局部变量返回的数据会被随时清除掉。除非他的代码调用这个函数时使用了内联汇编来处理返回值(因C默认的调用约定的函数是由用户来清栈的,在内联汇编中可以先处理返回值再清栈操作),
2009-4-13 18:04
0
雪    币: 53
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
返回值是放在寄存器,但返回值是个指针,指向的内存是已经返回了的函数的“曾经”的栈空间。
也就是说返回的是个野指针。

这个壳貌似还是挺出名的开源壳,怎么会有这么飘逸的代码。。。
2009-4-13 19:59
0
雪    币: 53
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这是yC壳的另一段代码,调用了_ImageRvaToSection这个函数,
作者为什么敢这么写?这么写是得不到编译器的保证的吧?
这是一段Cpp代码,VS2008编译,没有extern "C"之类的声明,调用方式应该是stdcall。

郁闷。。找个机会动态调下看看。。

DWORD RVA2Offset(char* Base,DWORD dwRVA)
{
	DWORD _offset;
	PIMAGE_SECTION_HEADER section;
	section=_ImageRvaToSection(Base,dwRVA);
	if(section==NULL)
	{
		return(0);
	}
	_offset=dwRVA+section->PointerToRawData-section->VirtualAddress;
	return(_offset);
}
2009-4-13 20:09
0
游客
登录 | 注册 方可回帖
返回
//