一个压缩壳源码

11 篇文章 0 订阅
1 篇文章 0 订阅

《加密与解密》书中的壳,不过为了加深印象还是手写一下

抄代码的时候突然想起了以前见过的一个VS插件,代码高亮,自动完成等功能都相当完美,写起代码来也爽很多。。

壳的流程(写到再更新):

1 把文件各区块按照内存对齐的方式加载到内存

3 转储输入表


源码:

void LoadFile(char *szFileName)
{
	HANDLE hFile;
	IMAGE_DOS_HEADER dosHeader;
	IMAGE_NT_HEADERS ntHeader;
	PIMAGE_SECTION_HEADER psecHeader;
	long nFileSize;
	long nFileAlign;
	long nSectionAlign;
	long nNTHeaderSize;
	int nHeaderSize;
	int nSectionNum;
	int nIndex;
	long nRawDataSize;
	long nRawDataOffset;
	long nVirtualAddress;
	long nVirtualSize;
	unsigned long NumberOfBytesRead;
	
	//读取文件信息
	hFile=CreateFile(szFileName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	if(hFile==INVALID_HANDLE_VALUE)
	{
		//printf("打开文件失败\n");
	}
	
	ReadFile(hFile,&dosHeader,sizeof(dosHeader),&NumberOfBytesRead,NULL);
	//判断MZ标志
	if (dosHeader.e_magic!=0x5A4D)
	{
		//Not Standard PE File
	}

	SetFilePointer(hFile,dosHeader.e_lfanew,NULL,FILE_BEGIN);
	ReadFile(hFile,&ntHeader,sizeof(ntHeader),&NumberOfBytesRead,NULL);
	//判断PE标志
	if (ntHeader.Signature!=0x4550)
	{
		//Not Standard PE File
	}

    nFileSize=GetFileSize(hFile,NULL);
	nSectionNum=ntHeader.FileHeader.NumberOfSections;
	m_nImageSize=ntHeader.OptionalHeader.SizeOfImage;
	nFileAlign=ntHeader.OptionalHeader.FileAlignment;
	nSectionAlign=ntHeader.OptionalHeader.SectionAlignment;
	nHeaderSize=ntHeader.OptionalHeader.SizeOfHeaders;		//这是从开头一直包括到区块表的大小
	
	m_nImageSize=Align_Size(m_nImageSize,nSectionAlign);
	m_pImageBase=(char*)malloc(m_nImageSize);
	memset(m_pImageBase,0,m_nImageSize);
	
	SetFilePointer(hFile,0,NULL,FILE_BEGIN);
	ReadFile(hFile,m_pImageBase,nHeaderSize,&NumberOfBytesRead,NULL);
	m_pntHeaders=(PIMAGE_NT_HEADERS)((DWORD)m_pImageBase+dosHeader.e_lfanew);
	nNTHeaderSize=sizeof(ntHeader.Signature)+sizeof(ntHeader.FileHeader)+ntHeader.FileHeader.SizeOfOptionalHeader;		//由于数据目录个数不一定所以需要自己计算
	m_psecHeaders=(PIMAGE_SECTION_HEADER)((DWORD)m_pntHeaders+nNTHeaderSize);
	
	//把各个节的数据复制到对应位置
	for(nIndex=0,psecHeader=m_psecHeaders;nIndex<nSectionNum;++nIndex,++psecHeader)
	{
		nRawDataSize=psecHeader->SizeOfRawData;
		nRawDataOffset=psecHeader->PointerToRawData;
		nVirtualAddress=psecHeader->VirtualAddress;
		nVirtualSize=psecHeader->Misc.VirtualSize;
		SetFilePointer(hFile,nRawDataOffset,NULL,FILE_BEGIN);
		ReadFile(hFile,&m_pImageBase[nVirtualAddress],nRawDataSize,&NumberOfBytesRead,NULL);
	}
	//此时指向最后一个节,顺便保存下附加数据
	SaveExtraData(hFile,psecHeader,nFileSize);

}
long Align_Size(long nImageSize,long nSectionAlign)
{
	return (nImageSize+nSectionAlign-1) / nSectionAlign * nSectionAlign;
}

void SaveExtraData(HANDLE hFile,PIMAGE_SECTION_HEADER pLastSectionHead,long nFileSize)
{
	long nExtraDataSize=nFileSize-(pLastSectionHead->PointerToRawData+pLastSectionHead->SizeOfRawData);
	unsigned long NumberOfBytesRead;
	if (nExtraDataSize>0)
	{
		pExtraData=new char[nExtraDataSize];
		memset(pExtraData,0,nExtraDataSize);
		ReadFile(hFile,pExtraData,nExtraDataSize,&NumberOfBytesRead,NULL);
	}
	else
	{
		//no extra data
	}
}

PCHAR RVAToPtr(DWORD dwRva)
{
	if ((UINT)dwRva<m_nImageSize)
	{
		return PCHAR(dwRva+(DWORD)m_pImageBase);
	}
	else
	{
		return NULL;
	}
}

UINT AddressImportTable(PCHAR m_pImportTable)
{
	PIMAGE_IMPORT_DESCRIPTOR pImportDescriptor=NULL,pDescriptor=NULL;
	PIMAGE_DATA_DIRECTORY    pImportDir=NULL;
	UINT			         nSize=0;
	PCHAR					 pData=NULL;
	PCHAR					 pFuncNum=0;
	PCHAR                    pszDllName;
	PIMAGE_THUNK_DATA32      pFirstThunk=NULL;
	PIMAGE_IMPORT_BY_NAME	 pImportName=NULL;
	
	pImportDir=&m_pntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
	pImportDescriptor=(PIMAGE_IMPORT_DESCRIPTOR)RVAToPtr(pImportDir->VirtualAddress);
	//移动输入表
	for(pData=m_pImportTable,pDescriptor=pImportDescriptor;pDescriptor->Name!=0;pDescriptor++)
	{
		//保存FirstThunk
		*(DWORD*)pData=pDescriptor->FirstThunk;
		pData=pData+sizeof(DWORD);
		pszDllName=(PCHAR)RVAToPtr(pDescriptor->Name);
		//保存dll名长度
		*(BYTE*)(pData)=(BYTE)(strlen(pszDllName));
		pData=pData+sizeof(BYTE);
		//保存dll名
		memcpy(pData,pszDllName,strlen(pszDllName+1));
		pData=pData+strlen(pszDllName)+1;
		//保存函数个数记录变量
		pFuncNum=pData;
		*(BYTE*)pFuncNum=0;
		pData=pData+sizeof(DWORD);
		if (pDescriptor->OriginalFirstThunk!=0)
		{
			pFirstThunk=(PIMAGE_THUNK_DATA32)RVAToPtr(pDescriptor->OriginalFirstThunk);
		} 
		else
		{
			pFirstThunk=(PIMAGE_THUNK_DATA32)RVAToPtr(pDescriptor->FirstThunk);
		}
		while(pFirstThunk->u1.AddressOfData!=NULL)
		{
			if (IMAGE_SNAP_BY_ORDINAL32(pFirstThunk->u1.Ordinal))
			{
				//序号导入
				*(BYTE*)pData=0;
				pData=pData+sizeof(BYTE);
				*(DWORD*)pData=(DWORD)pFirstThunk->u1.Ordinal & 0x7FFFFFFF;
				pData=pData+sizeof(DWORD)+1;
				(*(DWORD*)pFuncNum)++;
				
			} 
			else
			{
				//字符串导入
				pImportName=(PIMAGE_IMPORT_BY_NAME)RVAToPtr((DWORD)pFirstThunk->u1.AddressOfData);
				*(BYTE*)pData=(BYTE)(strlen((char*)pImportName->Name));
				(*(DWORD*)pFuncNum)++;
				pData=pData+(strlen((char*)pImportName->Name))+1;
			}
			pFirstThunk++;
		}
	}
	*(DWORD*)pData=(DWORD)0;
	pData=pData+sizeof(DWORD);
	return (pData-m_pImportTable);
	
}




### 回答1: 新版神马tv5.9,293影视5.9,293影院tv源码电视盒子tv版app对接苹果的搭建教程如下: 首先,要对接苹果,需要确保你的电视盒子tv版app符合苹果的开发要求和审核规范。 第一步,先下载并安装最新版本的Xcode,这是苹果开发工具的主要软件。 第二步,创建一个新的Xcode项目,选择“tvOS”模板,并填写相关的项目信息。 第三步,导入神马tv5.9,293影视5.9,293影院tv源码电视盒子tv版app的代码文件,并确保代码没有错误和警告。 第四步,根据你的需求,在项目中适当地修改和调整界面和功能。 第五步,配置好项目的打包证书和描述文件,确保你可以将应用程序安装到真实的设备上进行测试。 第六步,将应用程序连接到你的苹果开发者账号,并进行代码签名,以便能够在设备上进行测试和分发。 第七步,进行必要的测试,确保应用程序在电视盒子上正常运行,并能够正常接收和播放视频内容。 第八步,将完成的应用程序提交到苹果的App Store审核,并等待审核结果。 第九步,如果通过审核,你的应用程序将会在App Store上架,用户就可以通过苹果电视盒子上的App Store进行下载和安装。 总结:对接苹果的流程需要通过Xcode进行开发与测试,并且要符合苹果的审核要求。通过合理的调整和修改代码,确保应用程序能够在电视盒子上顺利运行。提前了解和掌握相关的苹果开发知识和技术,可以帮助你更好地完成对接工作。 ### 回答2: 新版神马tv5.9和293影视5.9是一款电视盒子的应用程序,可以提供在线观影服务。这两款应用程序之间的主要区别在于293影视5.9主要提供影视资源,而新版神马tv5.9则包含了更多的功能和影视资源。 若要将293影院tv源码电视盒子tv版app对接苹果,首先需要了解到对接苹果主要是指将应用程序适配为可在苹果设备上运行的版本。具体的搭建教程如下: 1. 获取源码:首先,您需要获得293影院tv源码电视盒子tv版app的源代码。这可以通过与相关开发者或第三方渠道联系获得。 2. 安装开发环境:为了对接苹果平台,您需要安装适用于iOS开发的开发环境,比如Xcode。 3. 进行适配和调试:将源码导入到Xcode中,并进行适配和调试。适配的主要内容包括苹果设备的屏幕适配、系统版本兼容以及编译运行等方面。 4. 提交应用审核:完成适配和调试后,您需要将应用程序提交给苹果进行审核。在提交前,您需要参考苹果的审核指南,确保应用程序符合相关规定和要求。 5. 上线发布:苹果审核通过后,您可以将应用程序上线发布到苹果应用商店,供用户下载和使用。 总结起来,对接苹果主要涉及到获取源码、安装开发环境、进行适配和调试、提交应用审核以及上线发布等几个步骤。需要注意的是,在进行对接苹果之前,建议您先了解相关的开发知识和规范,以确保应用程序能够在苹果设备上正常运行。 ### 回答3: 新版神马TV5.9和293影视5.9是一种电视盒子的应用程序,这些应用程序提供了大量的影视资源供用户观看。而293影院TV源码则是一种为电视盒子开发的操作系统程序。通过将293影院TV源码应用到电视盒子上,并将新版神马TV5.9或293影视5.9应用程序对接到苹果设备上,用户可以在电视上观看苹果设备中的影视资源。 具体搭建教程如下: 首先,将293影院TV源码下载到电脑上,并解压缩。 然后,将苹果设备连接到电脑上,并打开苹果开发者账号下的Xcode软件。 在Xcode软件中,创建一个新的项目,并选择模板为"TV OS Application"。 接下来,将解压缩的293影院TV源码文件导入到项目中。 在项目中,找到App的主文件和资源文件,并将其替换为新版神马TV5.9或293影视5.9的应用文件。 将项目部署到苹果设备上,等待部署完成后,就可以在电视上使用新版神马TV5.9或293影视5.9了。 需要注意的是,对接苹果设备需要一定的开发经验,如果对开发不熟悉,建议寻求专业开发人员的帮助,以确保项目能够正常运行。 以上是一个简单的搭建教程,希望对你有所帮助。如有其他问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值