欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]关于手游王朝崛起调试破解心得分享

[原创]关于手游王朝崛起调试破解心得分享

前提:近日我的一个好朋友安利了一款游戏,说是在删档内测,我跟着一起玩了一下,感觉还是不错的。顺便也试着研究了一波~

先向大家说明一下-根据目前的测试来看,虽然显示的金额改变了,但是毕竟是联网的游戏,在花费金子锻造升级的时候应该还是

有发包验证,大家有兴趣可以继续我的这个往下走。


-------------------------------------------------------------------------------------

友情提示:开发不易,游戏更是如此。建议大家练手娱乐就好,点到为止!

-------------------------------------------------------------------------------------


1.下载游戏安装包,拖入Android工具---Android Killer,查看相关结构及加密情况



根据反编译的信息和结构-存在libmono.so和Assembly-CSharp.dll,可以判断出是U3D开发的,并且没有加壳。


2.将libmono.so扔进IDA,反编译查看载入关键dll的相关代码即mono_image_open_from_data_with_name函数


发现了一个rvlt_modify_data_with_name()函数,跟进查看


发现了载入的dll及解密的过程,如下:

(1)对于Assembly-CSharp.dll,将每一个字节进行减去13的解密操作

(2)对于ThreeKindom.dll,将每一个字节进行加上11的解密操作,

以上两步将加密的dll进行了还原。


为了方便分析,临时写了一个解密程序(临时写的,代码结构不好,各位老爷凑活看吧)-源码贴出

#include <stdio.h>

#include <stdlib.h>

int main()

{

	int a=-1; // 0代表解码Assembly-CSharp.dll 1代表解码ThreeKindom.dll

			  // 2代表编码Assembly-CSharp.dll 3代表编码码ThreeKindom.dll

	int num=0;

	FILE *fp_1,*fp_2,*fp_3,*fp_4,*fp_5,*fp_6;

	char buf; //one byte for buffer

	char *st1="Assembly-CSharp.dll";	//dll's name

	char *st2="ThreeKindom.dll";

	char *st3="Assembly-CSharp-NewEncode.dll";	//New Encode dll's name

	char *st4="ThreeKindom.dll-NewEncode.dll";

	char *st5="Assembly-CSharp-Decode.dll";	//Decode dll's name

	char *st6="ThreeKindom.dll-Decode.dll";

	fp_1 = fopen(st1,"rb");

	fp_2 = fopen(st2,"rb");

	fp_3 = fopen(st5,"wb");

	fp_4 = fopen(st6,"wb");

	fp_5 = fopen(st3,"wb");

	fp_6 = fopen(st4,"wb");

	printf("0 - Decode Assembly-CSharp.dll \n");

	printf("1 - Decode ThreeKindom.dll \n");

	printf("2 - Encode Assembly-CSharp.dll \n");

	printf("3 - Encode ThreeKindom.dll \n");

	printf("-1 - Exit \n");

	printf("Please input number you want execute (0~3): ");

	scanf("%d",&a);

	if(fp_1 == NULL || fp_2 == NULL || fp_3 == NULL || fp_4 == NULL)

	{

		printf("Open Error ! \n");

		getchar();

		return 0;

	}

	switch(a)

	{

	case -1:

	{

		break;

	}

	case 0:

	case 1:

	{

		a==0?(num=13):(num=11);

		while(1)

		{

			if(num == 13)

			{

				buf = fgetc(fp_1);

				buf-=13;

				fputc(buf,fp_3);

				if(feof(fp_1))

				{

					break;

				}

			}

			else

			{

				buf = fgetc(fp_2);

				if(feof(fp_2))

				{

					break;

				}

				buf+=11;

				fputc(buf,fp_4);

			}

		}

		break;

	}

	case 2:

	case 3:

	{

		a==2?(num=13):(num=11);

		while(1)

		{

			if(num == 13)

			{

				buf = fgetc(fp_1);

				if(feof(fp_1))

				{

					break;

				}

				buf+=13;

				fputc(buf,fp_5);

			}

			else

			{

				buf = fgetc(fp_2);

				if(feof(fp_2))

				{

					break;

				}

				buf-=11;

				fputc(buf,fp_6);

			}

		}

		break;

	}

	default:

	{

		printf("Input Number Error ! \n");

		getchar();

		return 0;

	}

	}

	fclose(fp_1);

	fclose(fp_2);

	fclose(fp_3);

	fclose(fp_4);

	fclose(fp_5);

	fclose(fp_6);

	printf("Decode Finish ! \n");

	getchar();

	return 0;

}

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功