首页 > 其他分享 >Unity引擎CSharp数据加密通用提取方法

Unity引擎CSharp数据加密通用提取方法

时间:2024-10-18 17:10:38浏览次数:8  
标签:return name img mono void Unity CSharp 加密 CryptoStream

CSharp 一般数据加密后解密使用 CryptoStream::Read 解密, 在程序启动时Hook 该函数, 然后可以截获到解密的数据
步骤:

  1. Hook引擎mono的函数 mono_runtime_invoke
AsmHook::HOOK_INFO		_mono_runtime_invoke;
BOOL __cdecl hook_mono_runtime_invoke(VOID *pUserParam, AsmHook::PUSHAD_DAT *pReg)
{
	CUnityMono		*pThis;

	pThis = (CUnityMono *)pUserParam;
	pThis->On_mono_runtime_invoke();
	return TRUE;
}

bRetVal &= AsmHook::Hook(mo._mono_runtime_invoke, &hook_mono_runtime_invoke, this, &_mono_runtime_invoke);
  1. 在mono_runtime_invoke的调用时, 编译 CryptoStream::Read
    在其他时候编译会有问题, 在这个未知为了保证安全

BOOL	CryptoHook::OnMonoStart()
{
	BOOL		bRetVal;

	bRetVal = MethodBuild("mscorlib", "System.Security.Cryptography", "CryptoStream", "Read", 3, funCryptoStream_Read);

	MethodHook(funCryptoStream_Read, &CryptoStream_Read_Hook, "CryptoStream_Read", &CryptoStream_Read_Info);

	return TRUE;
}

  1. 对编译后的X64函数地址Hook
int WINAPIV CryptoStream_Read(void *CryptoStream, void *buffer, int offset, int count);

AsmHook::HOOK_INFO	CryptoStream_Read_Info;
BOOL WINAPIV CryptoStream_Read_Hook(VOID *pUserParam, AsmHook::PUSHAD_DAT *pReg)
{
	CryptoHook		*pThis = (CryptoHook *)pUserParam;

#ifdef _WIN64
	decltype(&CryptoStream_Read)		fun;
	void		*param64[8];
	void		*backaddr;
	void		*buffer, *CryptoStream;
	int			offset, count;
	int			nReturn;

	AsmHook::GetCallParam64(pReg, backaddr, param64);
	CryptoStream = param64[0];
	buffer = param64[1];
	offset = (int)(size_t)param64[2];
	count = (int)(size_t)param64[3];

	AsmHook::GetClassOrgFun(pReg, &CryptoStream_Read_Info, &fun);
	nReturn = fun(CryptoStream, buffer, offset, count);

	pThis->SaveCryptoDat(buffer, count);

	return AsmHook::SetReturn64(pReg, nReturn);
#endif

	return TRUE;
}
  1. 在Hook中拦截数据并保存
BOOL	CryptoHook::SaveCryptoDat(void *ByteAry, int nSize)
{
	static		int		snSaveId = 0;
	void		*pData;
	int			nMaxSize;
	CHAR		szFilePath[1024];

	snSaveId ++;
	GetObjProp(ByteAry, nMaxSize, ByteAry_Size);
	ObjAddOffset(ByteAry, pData, ByteAry_Data);
	if(nSize > nMaxSize)
	{
		assert(0);
		return FALSE;
	}

	sprintf(szFilePath, "V:\\Temp\\CryptoHook_%04d.dat", snSaveId);
	NFile::DumpToFile(szFilePath, pData, nSize);
	return TRUE;
}
  1. 附相关函数
BOOL	CUnityMono::MonoGetImage(void *&img, CHAR *name)
{
	list<PVOID>		tAsmList;
	list<PVOID>::iterator		Iter;
	void			*asmb;
	void			*img_item;
	CHAR			*img_name;

	img = NULL;
	tAsmList.clear();
	mo._mono_assembly_foreach(foreach_list_push, &tAsmList);
	for(Iter = tAsmList.begin();
		Iter != tAsmList.end();
		Iter ++)
	{
		asmb = *Iter;
		img_item = mo._mono_assembly_get_image(asmb);
		img_name = mo._mono_image_get_name(img_item);
		if(stricmp(img_name, name) == 0)
		{
			img = img_item;
			return TRUE;
		}
	}

	return FALSE;
}

BOOL	CUnityMono::MonoGetClass(void *&cls, void *img, CHAR *name_space, CHAR *name)
{
	cls = mo._mono_class_from_name(img, name_space, name);
	return FALSE;
}

BOOL	CUnityMono::MonoGetMethod(void *&method, void *cls, CHAR *name, int nParamCount)
{
	method = mo._mono_class_get_method_from_name(cls, name, nParamCount);
	if(method)
		return TRUE;


	return FALSE;
}

BOOL	CUnityMono::MethodGet(void *&method, CHAR *pImg, CHAR *pSpace, CHAR *pClass, CHAR *pName, int nParamCount)
{
	void		*img, *cls;

	method = NULL;
	MonoGetImage(img, pImg);
	if(img == NULL)
		return FALSE;
	MonoGetClass(cls, img, pSpace, pClass);
	if(cls == NULL)
		return FALSE;
	MonoGetMethod(method, cls, pName, nParamCount);
	if(method == NULL)
		return FALSE;

	return TRUE;
}

BOOL	CUnityMono::MethodBuild(CHAR *pImg, CHAR *pSpace, CHAR *pClass, CHAR *pName, int nParamCount, void *&code)
{
	void	*method;

	code = NULL;
	MethodGet(method, pImg, pSpace, pClass, pName, nParamCount);
	if(method == NULL)
		return FALSE;

	code = mo._mono_compile_method(method);
	if(code == NULL)
		return FALSE;

	return TRUE;
}

标签:return,name,img,mono,void,Unity,CSharp,加密,CryptoStream
From: https://www.cnblogs.com/zzz3265/p/18474661

相关文章

  • Unity 华为快游戏JS桥接 实现写日志等功能
    之前接入微信小游戏本身代码js桥接比较完善,抖音小游戏有缺少但也没缺的这么多,华为这边的API,大残啊!官方转换插件Github仓库上一次提交在3月份。(截至现在)API给的很简略,接入js代码那里说看demo,但unity的demo里面没jslib,另一个比较完善的demo看起来像是cocos的,比较无奈。还好用unity......
  • Unity网络
    基础概念Unity网络Unity发送网络请求UnityWebRequestUnityWebRequest提供了一个模块化系统,用于构成HTTP请求和处理HTTP响应。UnityWebRequest系统的主要目标是让Unity游戏与Web浏览器后端进行交互。基本支持所有版本的Unity编辑器和某些播放器WebGliOS和An......
  • Unity Apple Vision Pro 保姆级开发教程-环境配置、导入 PolySpatial 案例、程序发布
    视频教程Unity环境配置、导入PolySpatial案例、程序发布到设备教程说明这期教程我将介绍使用Unity开发AppleVisionPro应用所需要的Unity环境配置,以及如何导入PolySpatial样例场景、将Unity程序打包到头显中运行。开发前期准备(软硬件要求,开启visionpro......
  • Unity Apple Vision Pro 保姆级开发教程-准备阶段
    视频教程:UnityPolySpatial开发AppleVisionPro教程,三十分钟快速了解开发AppleVisionPro使用原生开发和unity开发有什么区别如果你的项目需要充分利用AppleVisionPro的独特功能、追求最佳的性能表现,或者针对特定于VisionOS的开发场景,原生开发可能是更好的......
  • Unity生命周期
    基础概念游戏的本质就是一个死循环,每一次循环都会处理游戏逻辑并更新一次游戏画面之所以能看到画面在动,是因为切换画面速度达到一定速度时人眼就会认为画面是动态且流畅的一帧就是执行了一次循环,Unity底层已经封装好了这个死循环我们只需要利用Unity的生命周期函数的规则来执行游......
  • 前端常用6种数据加密方式的使用(最详解)
    原文链接:https://blog.csdn.net/2401_82471222/article/details/140538952前端常用的六种数据加密方式包括Base64编码、MD5加密、SHA-1加密、SHA-256加密、AES加密和RSA加密。每种加密方式都有其特定的使用场景和优缺点。以下是这些加密方式的详细使用说明:1.Base64编码定义与特......
  • 非加密哈希函数库-SpookyHash
    地址:https://burtleburtle.net/bob/hash/spooky.htmlSpookyHashisapublicdomainnoncryptographichashfunctionproducingwell-distributed128-bithashvaluesforbytearraysofanylength.Itcanproduce64-bitand32-bithashvaluestoo,atthesames......
  • 【Unity微信】Unity发布微信小游戏+对接第三方SDK过程
    官方文档:https://wechat-miniprogram.github.io/minigame-unity-webgl-transform/上面的文档,能完成库的导入和发布操作下面开始调用接口获取玩家信息12///<summary>3///初始化SDK4///</summary>5privatevoidInitSDK()6{7......
  • 已实现,python解密QRC歌词,加密歌词,解密
    一、LRC歌词格式LRC格式是一种常见的歌词文件格式,通常用于音乐播放器同步显示歌曲的歌词。LRC文件与音频文件配合使用,能够根据时间戳实时显示歌词,给用户带来更好的听歌体验。LRC格式的特点:时间戳:LRC歌词的核心是每行歌词前面的时间戳。时间戳的格式通常为#说明[mm:ss......
  • java模拟量子加密,特别是基于量子密钥分发(QKD)的加密,是一种利用量子力学原理来保证信息
    本人详解作者:王文峰,参加过CSDN2020年度博客之星,《Java王大师王天师》公众号:JAVA开发王大师,专注于天道酬勤的Java开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯山峯转载说明:务必注明来源(注明:作者:王文峰哦)java模拟量子......