zoukankan      html  css  js  c++  java
  • 通过ida dump Uinity3D的加密dll

    声明:

    1.本文转载自:http://www.52pojie.cn/thread-398266-1-1.html,仅供自己保存使用,高手勿喷

    2.欢迎学习交流


    通过ida dump Uinity3D的加密dll

    看了一篇文章:http://www.jianshu.com/p/5bba57045b09

    通过hook解密Uinity3D的加密dll,最近刚接触动态,于是就尝试了下能不能通过IDA,像脱壳一样,dump出解密的dll文件,试了下,果然可以,在这里分享下

    工具:ida6.6 小米2s  青龙*月刀(随便找的一款游戏)

    解压app lib文件夹下的libmono.so ,拖入ida

    主要还是在这个几个函数上下断点(可以参考mono的源码)

    mono_image_open_from_data_full
    mono_image_open_from_data
    mono_image_open_from_data_with_name

    解密个过程可能在这几个函数的左右

    查看前面函数最终调用的还是mono_image_open_from_data_with_name,

    动态调试:如果app有反调试,还需要跳过饭调试,下面简单介绍动态调试的准备工作(网上有很多动态调试教程)

    推送android_server到手机
    1:adb push  android_server /data/local/tmp/
    2.:adb shell
    3.cd /data/data/tmp/
    4.chmod 777 android_server
    5../android_server
    端口转发:adb forward tcp:23946 tcp:23946
    debug启动app
    adb shell am start -D -n com.huiguan.qinglong.taiqi.dl/com.huiguan.qlyyd.UnityPlayerNativeActivity
    查看此app PID
    adb shell
    ps |grep dl
    记录下PID并转发下
    adb forward tcp:8700 jdwp:PID
    设置ida 并打开attach 上进程,
    运行app
    这个时候在cmd窗口上运行jdb调试:jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
    这个时候可以调试了


    运行app会断在linker上

    接着如果app没有反调戏:直接f9运行
    出现下面这个窗口:点same


    稍等片刻,还会端在linker上,直接f9运行

    如果出现这个窗口,全部选择yes(pass to app)不用等待了


    后面可能会出现很多这个窗口全部选择yes 然后f9运行

    最终断在mono_image_open_from_data_with_name,方法上

    首次加载并非我们想要的dll直接跳过,

    下图断点关键函数上


    如果看不懂可以 f5 看下源码,这里直接f5 源码演示,他这里重写了momo的源码

    int __fastcall mono_image_open_from_data_with_name(int a1, char *haystack, int a3, int a4, char a5, char *haystacka)

    几个关键性参数

    //nt a1 读取dll文件偏移地址

    // char *haystack ,dll文件的大小

    // char *haystacka ,文件名称


    这个时候跟随R1寄存器看到加密的dll文件的地址,说明dll还没开始解密,解密可能会在后面。单步向下走并注意各个寄存器的变化,经过一个简单的循环

    将dll解密了这个时候dll就在内存中解密了,


    这个时候已经可以dump了,

    查看寄存器窗口:找到R6和R11

    整个文件偏移的开始R6=7B95304C

    偏移地址的结束R6+R11=7B95304C+3AF200=7BD0224C

    使用;dump dex的脚本

    auto fp, dexAddress;
         fp = fopen(“D:\test.dll”, “wb”);
        for ( dexAddress=0x7B95304C; dexAddress < 0x7BD0224C; dexAddress++ )
        fputc(Byte(dexAddress), fp);


    run下就ok了

    附上:原dll和解密dll

    http://pan.baidu.com/s/1c4P6Q

  • 相关阅读:
    CXF 与Spring整合配置
    CloudStack采用spring加载bean(cloud-framework-spring-module模块)
    CloudStack服务引擎配置(cloud-engine-service模块)
    Oracle用户、权限、角色管理
    合并日常使用指南
    oracle表空间建立与用户创建删除
    oracle 创建同义词
    Eclipse下svn的创建分支/合并/切换使用
    字符串转数字 简单代码实现
    Linux下调试段错误 (gdb,core,ulimit)
  • 原文地址:https://www.cnblogs.com/JianXu/p/5158414.html
Copyright © 2011-2022 走看看