分类目录归档:程序猿

bang dream proto相关

本文相关轮子: proto读取导出 | 定时任务本体数据库对比主数据


A python + libil2cpp.so(Android) dumper:

Article: Generating Proto File For Banddream | DNARoma

gist


因为上周的一个想法,写出了redive和cgss的master数据库diff库,还造了一波bundle解压的轮子

redive第三个号被制裁了,平稳科技流也开始查了

土豆的内容星月大佬写离线的时候已经表示过master不可行,都是登录时返回部分master,所以就可以放弃了

然后就是bang了,开搞前我还又去debug了一下,结果看到密钥瞬间才想起power之前给我说过

炸梦通信是protobuf,包括master和manifest也是,所以就必须要提取原始关系才行了。我刚开始还想尝试暴力提取数据,但是内结构和字符串都是wireType 2,没法区分

在之前我已经在Prefare博客上看到过说dump属性什么的,dnspy改了之后也没搞懂怎么看。后来在评论区看到回复才找到

Perfare:邦邦用的是protobuf-net不是Google.Protobuf,不需要.proto文件,你只需要找到带ProtoContractAttrbuit的类并还原出properties上ProtoMemberAttribute的值就可以序列化了

知道入口后就开始观察了,搜索了一波然后看到master数据的类是SuiteMasterGetResponse(基本上各种proto类都叫GetResponse)

继续阅读bang dream proto相关

闲话x2

瞎记录

1、博客的一些更新

  • 服务器

服务器使用水萌大佬的机器也有三个月了,在刚开始的时候因为他们那边也是在不断调不断加东西,所以经常会爆炸,或者重启路由导致ddns ip改变。不过自从过年那次大爆炸之后一来,已经相当稳定运行了半个月了,可喜可贺,可喜可贺。

原始的vultr本来想着会被废置,不过我留下来当作自己的socks代理了(不是ss,纯socks5)不知道为什么好像比别人用的ss还稳,老见到他们说某某又墙了之类的,可能因为只有我一个人用吧(笑

SSL的话,本来我准备换le的野卡,结果还延期公开了。前两天稍微用 acme.sh 测试了一下可以csr同时生成两个域名的证书,爬丝的dnspod api我之前给他搞ddns ip自动更新的时候要过也可以用,到时候再帮他cron上

  • 音乐播放

两周前更改了一下逻辑,之前设置仅在首页播放,因为没有可靠的跨tab通信确保不重复播放的方法。

然后想到了一个方法,用localStorage保存一个值,不存在的时候记录为当前页并自动播放,并设置关闭时删除值;存在且不是当前页的时候不自动播放,不过生成并显示播放器,点击的时候覆盖值并在关闭时删除值

这样就完成了一个简陋的单tab播放的逻辑

  • 侧栏

并不满与现在的顶端固定实现,最理想的是先跟随滚动,到底后固定,继续向下返回时跟随向上,到顶后再固定,这种感觉

写了个跟随scroll的之后发现很难看,去爬丝站上看了看实现发现是动态切换position,虽然美观一些但还是有瑕疵。最后采用了youtube式的侧栏,即独立滚动条

继续阅读闲话x2

有关redive的一些

プリンセスコネクト!Re:Dive

这一阵从土豆开始,到这次redive,逆向技能提升了不少

有了上次土豆的经验,这次一上来是准备抓网络的,结果死活进不去游戏,搞得我还以为梯子不够完备。第二天song跟我说这游戏检测root,然后我看了一眼发现他检测越狱,还是用objc检测的,笑死。flex用不了不清楚原因,随手theos编了个hook就进游戏了

继续阅读有关redive的一些

【3/7】记录RKE开发过程

先放上成品:esterTion/ReplayKitEverywhere BigBoss


这次搞的插件开始的时候算是很久之前了

最早的时候,在github里面找了一个实现了开始/停止的类,编译注入,然后用cycript调用。结果测试了一下质量过糟,就暂时放置了

然后就是放假后了,那一阵还在学校,因为实在是需要一个随时随地的录屏功能,所以把开始停止合并成一个函数,然后activator写了一个cycript注入调用的脚本,就这样凑活使用了

继续阅读【3/7】记录RKE开发过程

这几天整的一些东西

为了便捷录制,ReplayKitEverywhere简陋版搞定了

用了cycript和activator自定义命令

ReplayKitEverywhere.zip


然后是前一阵我终于解决流量下使用pac代理的问题了

搜到的只有修改preferences.plist,但没等生效,重启就重置了

后来看到这个设置不是仅在重启时加载

然后就写了开机项,插到了cydia里(懒得再写LaunchDaemon了)

#ip1 interface 的 UUID 可能不同,但一个设备上是保持不变的
plutil -key NetworkServices -key "AEBF1975-384D-4121-98EB-1E3DFFB69191" -key Proxies -dict /var/preferences/SystemConfiguration/preferences.plist >/dev/null
plutil -key NetworkServices -key "AEBF1975-384D-4121-98EB-1E3DFFB69191" -key Proxies -key ProxyAutoConfigEnable -int 1 /var/preferences/SystemConfiguration/preferences.plist >/dev/null
plutil -key NetworkServices -key "AEBF1975-384D-4121-98EB-1E3DFFB69191" -key Proxies -key ProxyAutoConfigURLString -string "file:///var/cellular.pac" /var/preferences/SystemConfiguration/preferences.plist >/dev/null

于是我现在流量无缝google了,巨爽啊(

(促使我重新研究的主要原因是,l2tp疯狂被干扰,服务器443没问题,只有l2tp连不上,然后socks5虽然按理说都是明文,但就是贼稳定)

如果需要添加代理域名的情况,需要root下killall -9 CommCenter(联通每次弹的好烦啊


最后是今天搞了一整天mltd

因为搞好了流量代理,所以又想坑回这个辣鸡游戏了

结果打不开,才想起当时研究的时候就碰到过,这游戏不走代理,hosts都不认

改global-metadata.dat里的域名,进去之后突然又连不上了

然后搞一通抓包发现,title里GetVersion之后,域名竟然还原了!?

看来这个鬼地方写了服务器,要实现我的无墙土豆,只能搞密钥了

ida调试ios,整了一上午,竟然真的让我瞎翻翻到了

QQ图片20180120221640

代理request,修改game_server,一气呵成,完美无墙麻辣土豆get

(资源cdn不是google家,所以不需要搞什么操作了,速度也挺快,美滋滋)

初次尝试ios插件开发 & ReplayKit相关

昨天WonderParade把Ocean Adventure全部WFC了,然后想到录屏的时候,想起之前研究过的Quicktime录屏,在想能不能设备上录制

google之后搜到了ReplayKit,看起来非常简单的样子

最初尝试直接cycript执行,载入Framework之后虽然可以调用到开始和停止录制,但是因为cycript里的函数不是objc的方法,所以没办法搞回调

于是找了示例项目,粗略编了一个MS插件,作用仅仅就是声明一个ReplayKitObj类,代替调用开始/停止录制

毕竟也不熟练,怼了一阵搞出来一个能工作的版本,但是真正搞出来之后发现,ReplayKit录制质量特别渣……

基本上来讲,qt录制质量是100的话,airplay录制大概是85,rk就是60-70的样子…而且音频只录制了一个声道,这是最骚的

录制样品

ReplayKitObj.zip

//
//  ReplayKitObj.mm
//  ReplayKitObj
//
//  Created by ester on 2017/12/12.
//  Copyright (c) 2017年 __MyCompanyName__. All rights reserved.
//

// CaptainHook by Ryan Petrich
// see https://github.com/rpetrich/CaptainHook/

#if TARGET_OS_SIMULATOR
#error Do not support the simulator, please use the real iPhone Device.
#endif

#import <Foundation/Foundation.h>

// Objective-C runtime hooking using CaptainHook:
//   1. declare class using CHDeclareClass()
//   2. load class using CHLoadClass() or CHLoadLateClass() in CHConstructor
//   3. hook method using CHOptimizedMethod()
//   4. register hook using CHHook() in CHConstructor
//   5. (optionally) call old method using CHSuper()

#import <ReplayKit/ReplayKit.h>


@interface ReplayKitObj : UIViewController
//@interface ReplayKitObj : NSObject<RPPreviewViewControllerDelegate, RPScreenRecorderDelegate>
//@interface ReplayKitObj : UIViewController<RPPreviewViewControllerDelegate, RPScreenRecorderDelegate>

//-(void)startRec;
//-(void)stopRec;
//- (void)previewControllerDidFinish;
@end
//@interface ReplayKitObj () <RPPreviewViewControllerDelegate>
//@end

@implementation ReplayKitObj

+(void)startRec{
    
    NSLog(@"enter");
    
    
    
    
    //UIViewController* rootController = [UIApplication sharedApplication].keyWindow.rootViewController;
    
    RPScreenRecorder* recorder = RPScreenRecorder.sharedRecorder;
    
    
    [recorder startRecordingWithMicrophoneEnabled:false handler:^(NSError * error) {
        if(error != nil) {
            NSString* desc = error.description;
            NSLog(@"%@", desc);
            return;
        }
    }];
    
}

+(void)stopRec{
    
    NSLog(@"enter");
    
    [[RPScreenRecorder sharedRecorder] stopRecordingWithHandler:^(RPPreviewViewController * _Nullable previewViewController, NSError * _Nullable error){
        NSLog(@"EEEEE");
        if(error){
            NSLog(@"fialed to stop recording, %@", error);
            
        }else if(previewViewController != nil){
            NSLog(@"finish");
            
            previewViewController.previewControllerDelegate = self;
            
            UIViewController *rootController = [UIApplication sharedApplication].keyWindow.rootViewController;
            [rootController presentViewController:previewViewController animated:YES completion:nil];
            
        }
        
    }];
    
    NSLog(@"end");
    
}

+(void)previewControllerDidFinish:(RPPreviewViewController *)previewController {
    NSLog(@"previewControllerDidFinish");
    [[UIApplication sharedApplication].keyWindow.rootViewController dismissViewControllerAnimated:YES completion:nil];
}

+(void)previewController:(RPPreviewViewController *)previewController didFinishWithActivityTypes:(NSSet <NSString *>*)activityTypes {
	NSLog(@"activity - %@",activityTypes);
}

@end


总之,本来还在想要不要开发一个完整插件出来,但这么差的录制质量,还是算了

神代梦华谭 – 卡面提取

游戏没啥兴趣,已删,不再更新


用仓鼠太太的芙蕾雅镇一下

cardL_20095

感觉自己就很无聊(
下午做了点纯体力劳动,解了一波卡面

https://pan.baidu.com/s/1aC0YmjqgBd7tBgECDXM1kQ

就真的是纯体力,没有加密,所有素材全部unity3d格式放在raw里,批量一跑就完事了
拿着AssetsBundleExtractor跑batchexport,然后批量选中assets,导出所有的Texture2D

CardBattle和CardL都是Sprite裁剪的形式,不过每个都是固定位置,就用chrome的自动下载跑了一批canvas裁剪

给flv.js添加解封装器(demuxer)

估计也没人再写了

  1. 需要一个probe函数验证文件格式有效
  2. 在transmuxing-controller里添加判断,创建demuxer
  3. 需要一个parseChunks函数负责demux由io-ctl传来的文件流,参数0为未使用的arrayBuffer,参数1为相对文件头的字节偏移量
  4. 自行识别mediaInfo,在完成后调用onMediaInfo传回媒体信息
  5. 音视频流分别回调onTrackMetadata将轨道信息传给remuxer
  6. parseChunks中将音视频采样分别放置于独立track中,并调用onDataAvailable通知remuxer进行封装