unity3d手游激活成功教程(一)

unity3d手游激活成功教程(一)重点知识 1 assets bin Data Managed Assembly CSharp dll 扔进 Reflector reflexil 环境 2 libs libmono so 的 mono image open from data with name 函数 MonoImage mono image open from data with name char data gui

重点知识:

1. \assets\bin\Data\Managed\Assembly-CSharp.dll扔进Reflector+reflexil环境

2.libs\libmono.so的mono_image_open_from_data_with_name函数

 MonoImage *mono_image_open_from_data_with_name (char *data, guint32 data_len, gboolean need_copy, MonoImageOpenStatus *status, gboolean refonly, const char *name);

转:https://bbs.pediy.com/thread-226135.htm

最近找乐子激活成功教程了点手游玩玩,顺便分享一下,目标APK–发条XX。

1、大致分析

拿到APK先看看libs和assets,发现有libmono.so以及\assets\bin\Data\Managed\Assembly-CSharp.dll,可以确定是unity3d手游,可以尝试修改 Assembly-CSharp.dll来激活成功教程游戏,不过发条英雄的这个dll加密了,所以需要先解密。

unity3d手游激活成功教程(一)

2、解密dll

把 libmono.so扔进ida,找到mono_image_open_from_data_with_name函数,F5查看发现了解密代码:

unity3d手游激活成功教程(一)

在这个函数先判断加载的dll是否包含ssem字符串,接着判断前两个字节是否等于82(0x52),77(0x4d),因此可以确定下面的for循环是解密代码,比较简单,抄下来自己写一个解密程序(附件有一份),然后对这个 Assembly-CSharp.dll进行解密。

3、修改dll

把 Assembly-CSharp.dll扔进Reflector+reflexil环境进行修改(不会的同学百度学习一下),找到关键函数get_DamageValue,直接改成返回100W,然后攻击就变成了100W。

unity3d手游激活成功教程(一)

不过这个时候怪物攻击也是100W,因此再找到Player的applyDamage函数,修改这个函数直接ret,然后玩家就无敌了。

unity3d手游激活成功教程(一)

最后保存为一个新的dll并替换掉之前APK里面的 Assembly-CSharp.dll,解密后的dll头部不等于82(0x52),77(0x4d),因此so可以直接加载。

4、运行

重新签名,打包成新的APK,安装运行,一刀100W。

unity3d手游激活成功教程(一)

5、结束语

服务器信赖客户端的计算结果就导致这种情况,不过服务器加强数据校验也能检测出来。有兴趣的同学可以去改改dll实现竞技场百战百胜。

6、附件

decrypt.c

#include 
  
    #include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          typedef char _BYTE; int main(int argc, const char argv) { if(argc != 3) { printf("usage:%s 
          
          
            \n", argv[0]); return -1; } FILE *fpDll; fpDll = fopen(argv[1], "r"); if(fpDll == NULL) { printf("open fail\n"); } fseek(fpDll, 0, SEEK_END); int len = ftell(fpDll); fseek(fpDll, 0, SEEK_SET); char *data = (char *)malloc(len); fread(data, 1, len, fpDll); fclose(fpDll); signed int v11; // [sp+20h] [bp-18h]@3 signed int v12; // [sp+24h] [bp-14h]@3 int v10; size_t i; v12 = 55; v11 = 89; char *src = data; int n = len; if ( *(_BYTE *)src == 82 && *((_BYTE *)src + 1) == 77 ) { for ( i = 4; i < n; ++i ) { v10 = v12 + v11; v12 = v11; v11 = v10; if ( v10 > 0x ) { v12 = 1; v11 = 1; } *((_BYTE *)src + i) ^= v10; } *(_BYTE *)src = 77; *((_BYTE *)src + 1) = 90; *((_BYTE *)src + 2) = -112; *((_BYTE *)src + 3) = 0; } FILE* pFile = fopen(argv[2],"wb"); fwrite(data,len,1,pFile); fclose(pFile); } 
           
          
         
        
       
      
     
    
  

 

 

Reflector+Reflexil 相结合实现对DLL文件修改

reflexil

https://github.com/sailro/Reflexil/releases

第一步:

下载Reflector 10和Reflexil 2.2,装好后将Reflexil的插件DLL文件加载到Reflector中

具体操作:Tools->Add-Ins->+->选择Reflexil的DLL文件Reflexil.Reflector.AIO.dll,点击确定加载到Reflector中

第二步:

2.1 Reflector加载需要编译的DLL或exe文件,找到对应的方法。

2.2 打开Tools->Reflexil  你将会看到对应方法的IL代码

unity3d手游激活成功教程(一)

选择Reflace all with code 对对应代码进行修改后,点击左下角的 Complie(编译),然后点击“确定”;

unity3d手游激活成功教程(一)

第三步:

确定操作完毕后,在左侧DLL或exe文件上右击

unity3d手游激活成功教程(一)

Save as 程序集编译成功!

 

Reflector反编译插件Reflexil 图文使用教程

Reflexil 它是Reflector的一个插件,结合Reflector,可以进行DLL代码注入等工作,实践证明完全可用,方便开发人员对.NET程序进行修改;可以作为一个Reflector插件修改程序集的IL并保存到磁盘文件,也可以在自己的.NET程序中调用进行更为灵活的.NET程序集修改。

下载好Reflexil后,在Add-ins 界面,点”+”,选择Reflexil.Reflector.AIO.dll,然后Close

unity3d手游激活成功教程(一)

现在在Tool中会多一个Reflexil选项

unity3d手游激活成功教程(一)

它的界面

unity3d手游激活成功教程(一)

用法:

把我刚才写的Hello world拖进Reflector,我们选中程序集,命名空间,类名,方法, Reflexil的界面都是不一样的.

unity3d手游激活成功教程(一)

这里可以知道,我们能注入类,接口,枚举,方法,等,也可以重命名,删除.

现在我们来添加一个方法试试,选择Inject method 。 Item Name:Demo(此时只能声明无参,无返回值的方法,后面会讲什么添加这些)

点ok会给出警告

unity3d手游激活成功教程(一)

 意思就是,做大改动(注入,删除,重命名)时你是看不见结果,让你保存一次在导入新的dll文件,那就保存一次

unity3d手游激活成功教程(一)

保存好后,把新dll拖到Reflector中,就会发现在 Programe中多了一个Dmeo方法.

现在来给Demo 写实现

选择Demo 后右边的界面为:

unity3d手游激活成功教程(一)

选择Main:

unity3d手游激活成功教程(一)

instructions 中是IL指令, 高级玩家可以直接修改添加指令,但不是高级玩家咋办?

我们选择Replace all with code… 替换所以代码.

不过在这之前 先在Parameters添加一个参数string name,并在Attributes 将Return type设为stirng

我再次点击Replace all with code…  代码已经更新为

unity3d手游激活成功教程(一)

unity3d手游激活成功教程(一)

修改完成后,点compile 如果没有错误,就会生成IL指令,点ok就行

现在在来修改一下Main方法,调用Demo

unity3d手游激活成功教程(一)

代码已经改完,现在保存看看执行效果:

原程序:

unity3d手游激活成功教程(一)

修改后程序:

unity3d手游激活成功教程(一)

 

https://www.52pojie.cn/thread-271347-1-1.html

Reflector 之reflexil使用

unity3d手游激活成功教程(一)潜水潜了那么久,上来换口气..
昨天和小伙伴一起玩一个CrackMe(C#),打算一起来写KeyGen,他用的是爆破的方法,我修复程序后发现里面常量各种溢出…无奈,只能用reflexil注入方法,然后写出KeyGen.
分享下使用reflexil常用的几个方法..




Reflector 之reflexil使用

先写个简单的控制台程序

unity3d手游激活成功教程(一)

工具,添加插件.

unity3d手游激活成功教程(一)

选中reflexil 1.6 (1.7从来没附加成功过.不知道为啥..)

unity3d手游激活成功教程(一)

一 直接修改操作数

unity3d手游激活成功教程(一)

可以直接编辑IL

unity3d手游激活成功教程(一)

Update 后

在程序集中右键

unity3d手游激活成功教程(一)

另存程序.

执行刚保存的程序

unity3d手游激活成功教程(一)

还可以直接添加IL 接着让后面继续输出

二 直接注入IL

右键,新建(new Create),填写对应的操作码,选择类型,

值得注意的是右边的按钮,append(添加),接着是插入在选择之前,然后是插入在选择之后;别选错了.

unity3d手游激活成功教程(一)

unity3d手游激活成功教程(一)

注意    注入的时候操作数的类型别选错了.

然后继续参照上面的,将程序另存一次.

unity3d手游激活成功教程(一)

三 替换代码

如果不想折腾IL,直接选择 替换所有代码.

unity3d手游激活成功教程(一)

不过这意味着你要重写所有代码(大多数时,我都会用在重写某个方法上)…然后提交一下,他会自动编译, 然后继续参照上面的,将程序另存一次.

unity3d手游激活成功教程(一)

提交完成后会自动编译,并且再右侧区域会生成对应的IL.

然后继续参照上面的,将程序另存一次.

执行下…

unity3d手游激活成功教程(一)

四  注入方法

unity3d手游激活成功教程(一)

别选错地方了.是你要将方法注入到某个类中,不是注入class所以,一定是在类上右键

unity3d手游激活成功教程(一)

暂时只能注入返回值为void的方法

对了,点击OK后会有个该死的提示,这提示的大致意思是:

当你在执行,增加,删除,重命名,等动作时,你不会直接看见相应的操作,他们是不同步的.

你必须要重新加载程序集才可以看见.

当然,你还需要将程序另存一次.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

然后你需要关闭程序集,接着重新打开刚才另存的 unity3d手游激活成功教程(一)

现在方法已经注入进去了.

unity3d手游激活成功教程(一)

然后我需要给它添加点内容..

让方法输出个InjectedMethod字符串

在方法中添加IL

unity3d手游激活成功教程(一)

接着修改Main方法,并且调用刚才注入的方法.

unity3d手游激活成功教程(一)

另存下..

执行结果.

unity3d手游激活成功教程(一)

Ps:   如果是替换代码的话,先更改injectmethod时不用实现main方法,只需要修改injectmethod()方法,然后再去修改Main方法.调用时因为injectmethod方法不是static所以需要实例化Program

接下来说说添加有参数,有返回值的方法:

先在参数(parameter)标签,中添加一个参数.

unity3d手游激活成功教程(一)

然后在属性标签中修改返回值为string.

unity3d手游激活成功教程(一)

接着使用替换代码的功能

unity3d手游激活成功教程(一)

可以看见方法已经带有参数并且有返回值.

修改下这个方法

unity3d手游激活成功教程(一)

打印下传进来的名字,并且打印当前时间

修改主函数调用

unity3d手游激活成功教程(一)

编译,然后不要忘记另存….

unity3d手游激活成功教程(一)

Good Job .

Have Fun .

By McevilRock

9-7/2014

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226288.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午11:54
下一篇 2026年3月16日 下午11:54


相关推荐

  • 博客工具 – Live Writer

    博客工具 – Live Writerlivewriter 是写博客的一个客户端工具 由于文章是在本地编写 所以它能够防止文章在发布时发生内容丢失的情况 同时它还可以方便的进行内容排版 插入图片等 排版完成后点击发布 图片也会一并被传到服务器上 CSDN 博客支持 metaAPI 所以也可以使用 livewriter 来发布文章 接下来将为大家详细介绍如何配置 livewriter 首先下载安装 livewriter 最新版本

    2026年3月26日
    1
  • J2ME开发视频下载

    J2ME开发视频下载最近在学习J2ME开发方面的内容,下面这些视频下载地址是我通过Orbit下载工具,收集整理出来,已证明可下载。你只须将这些下载地址复制到Orbit或迅雷中,就可以批量下载这些视频教学!http://images.enet.com.cn/eschool/j2me/16-3.swfhttp://images.enet.com.cn/eschool/j2me/24-1.swf…

    2022年7月27日
    7
  • PHP获取当前页面的url

    PHP获取当前页面的url

    2021年10月30日
    40
  • Python day字符串所有使用

    Python day字符串所有使用字符串所有的操作 name dio names my tnameis Name andiama job print name capitalize 首字母大写 print names count a 数字符里面有几个重复的指定字母 print names center 50 前一个数字表示一共要打印 50 个位置 不够的地方用后面双引号内的内

    2026年3月17日
    1
  • Java面试之 OOAD & UML

    Java面试之 OOAD & UMLJava面试之 OOAD & UML

    2022年4月22日
    42
  • 异步编程中的BeginInvoke和EndInvoke

    异步编程中的BeginInvoke和EndInvoke如果委托对象的调用列表中只有一个方法 引用方法 就可以异步执行这个方法 通过调用委托类特有的两个方法 BeginInvoke 和 EndInvoke 去执行 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp BeginInvoke 和 EndInvoke nbsp 的三种模式 nbsp BeginInvoke 方法的参数列表 nbsp 1 引用方法所需要的参数 nbsp nbsp 2 两个额外的参数 callback 参数和 state 参数 nbsp

    2025年11月12日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号