首页
社区
课程
招聘
[原创]分析XX助手获取Lua脚本明文
2015-4-29 15:06 23821

[原创]分析XX助手获取Lua脚本明文

2015-4-29 15:06
23821
您可以直接下载PDF文档:
逆向XX助手获取Lua脚本明文.zip

==========================================================
今天来看看xx助手的lua脚本解密

1.        找寻线索
/Library/MobileSubstrate/DynamicLibraries下面看到 XXScreenShot.dylib XXScreenShot.plist

Plist内容如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Filter</key>
        <dict>
                <key>Bundles</key>
                <array>
                        <string>com.apple.backboardd</string>
                </array>
        </dict>
</dict>
</plist>

恩,明白了是hook了backboardd进程

2.        静态分析
IDA 载入 XXScreenShot.dylib  --- 找到loadLuaData函数,分析发现是 tea算法



分析了一下,X23寄存器指向输出缓冲区

3.        动态调试

手机端运行:

Mac端运行:


4.下断
       

此时在目标程序上点击“播放”,让脚本载入



5.继续分析


由于前面用IDA分析过x23寄存器保存了输出数据,那么我们直接在0x103d12cdc下断点,此时x23已经得到了数据,下好断点后,继续运行,如下图,顺利中断



6.输出数据


此时lua脚本已经完整解密了!!!

7.编写tweak
我们可以写个tweak来抓取脚本
/*
 获取xx助手lua脚本
 By 飘云/P.Y.G
 2015-04-29
  http://www.chinapyg.com
*/

#import <substrate.h>
#import <pthread.h>


// 原始函数
signed int (*orig_XxteaDecrypt)(const char *inBuf, size_t bufLen, const char *key, size_t a4, char *outBuf, int a6);

signed int  myXxteaDecrypt(const char *inBuf, size_t bufLen, const char *key, size_t a4, char *outBuf, int a6)
{
    signed int  ret = orig_XxteaDecrypt(inBuf, bufLen, key, a4, outBuf, a6);
    NSString *str = [NSString stringWithCString:outBuf encoding:NSUTF8StringEncoding];
    
    //NSLog(@"[++++]%s", outBuf);
    NSLog(@"[++++]%@", str);
    return ret;
}

void *threadFun(void*)
{
    while (true)
    {
        void *lpFun = ((void*)MSFindSymbol(NULL, "__Z12XxteaDecryptPKciS0_iPci"));
        if (lpFun)
        {
            NSLog(@"[++++]lpFun = %p", lpFun);
            MSHookFunction(lpFun, (void*)myXxteaDecrypt, (void**)&orig_XxteaDecrypt);
            NSLog(@"[++++]orig_XxteaDecrypt = %p", orig_XxteaDecrypt);
            break;
        }
    }
    return NULL;
}

static __attribute__((constructor)) void piaoyun()
{
    // 用线程来查找,以免xx的dylib后加载而找不到函数
    pthread_t th;
    int err = pthread_create(&th, NULL, threadFun, NULL);
    if (err != 0)
        printf("[++++]pthread_create error: %s\n", strerror(err));
    
    NSLog(@"[++++]inject success!!!!");
}


8.Tweak演示



题后话:当然你也可以自己写个程序静态解密lua脚本,我不太喜欢折腾,就直接tweak了。。

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
点赞1
打赏
分享
最新回复 (19)
雪    币: 16157
活跃值: (2143)
能力值: ( LV9,RANK:147 )
在线值:
发帖
回帖
粉丝
orz1ruo 2015-4-29 15:29
2
0
mark.
雪    币: 2321
活跃值: (4028)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
熊猫正正 9 2015-4-29 15:40
3
0
学习,赞一个,嘿嘿
雪    币: 45
活跃值: (27)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
qinxijp 1 2015-4-29 16:57
4
0
good job
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
guxinyi 5 2015-4-29 17:09
5
0
x23是什么东西
雪    币: 2443
活跃值: (434)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
飘云 1 2015-4-29 17:13
6
0
ARM64 的 寄存器
雪    币: 613
活跃值: (2222)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
wuaiwu 3 2015-5-24 16:01
7
0
那个算法是公开的,直接windows解
雪    币: 205
活跃值: (71)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xtor 2015-6-11 16:52
8
0
com.apple.backboardd 为什要hook这个进程?
雪    币: 205
活跃值: (71)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xtor 2015-6-16 11:44
9
0
怎么才能动态调试DYLIB.一定要写TWEAK吗?
雪    币: 507
活跃值: (120)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
鬼谷子c 1 2015-6-16 12:02
10
0
然而,可以直接对程序中的so进行分析,动态调试直接dump明文lua脚本的。
雪    币: 210
活跃值: (507)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
anywhere杨 2015-6-16 13:18
11
0
表示看不懂。
雪    币: 2443
活跃值: (434)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
飘云 1 2015-6-17 17:29
12
0
。。。。文章一直是在dylib中呢~~
写个tweak是为了实验一下
雪    币: 8
活跃值: (219)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kevinmou 2015-9-12 14:40
13
0
有些游戏,我注入后,发现游戏就会自动退出。是因为游戏有对MSHookFunction有检测,还是因为我Tweak代码有错?
#import "substrate.h"

static int (*org_func)();

int replace_func()
{
    NSLog(@"this is the my hooked method");
    return org_func();
}

%ctor
{
  @autoreleasepool
  {

  // 此为Hook地址。能Hook住,但是游戏却打不开了
    unsigned long fuc_addr1 = 0x4AF840 | 0x01 ;
    MSHookFunction((void *)fuc_addr1,(void *)&replace_func,(void **)&org_func);
    }
}

这个Tweak能Hook,每打开游戏,在syslog里可以发现多输入了一行“this is the my hooked method”。但是游戏却会马上退出。
雪    币: 2443
活跃值: (434)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
飘云 1 2015-9-14 09:53
14
0
能进入 replace_func() 能初步说明没有anti-dylib
这个你只需lldb挂上去看看就知道了
雪    币: 10
活跃值: (109)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
youyinkai 2015-9-15 10:27
15
0
顶一个!!!!
雪    币: 949
活跃值: (119)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
starbuck 1 2015-9-20 20:54
16
0
还看不懂,。。。。。。。。。
雪    币: 573
活跃值: (959)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
ChengQing 2015-12-10 17:22
17
0
调用参数不正确或返回值不正确。
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mrmign 2015-12-16 13:19
18
0
赞,学习了
雪    币: 27
活跃值: (90)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caihaonan 2016-1-8 09:41
19
0
太需要了 !!正在学这个呢。。。
雪    币: 235
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cxjnet 2017-9-15 14:18
20
0
非常不错谢谢
游客
登录 | 注册 方可回帖
返回