2019-04-28 15:41:46 weixin_39691535 阅读数 220

牛X分身v1.0.0/直装特别版 – 安卓 | 木头分享

完美破解,无需付费,安装就是会员版,欢迎下载。

·各分身应用可单独设置虚拟定位(无需root)。
·分身应用可重命名、创建桌面快捷方式,微商朋友的必选利器!
·钉钉/企业微信虚拟位置打卡(突破各种检测防线)。
·应用多开、微信多开、应用分身等等小号分身,支持一部手机轻松实现本地软件和游戏的多开、双开。
·源自内核级技术、不占内存、快速稳定!
·牛X分身--最懂你的双开应用!

下载:https://www.lanzous.com/i3xyasd

2017-01-09 10:38:44 wwc455634698 阅读数 641

微信分身安装使用步骤:


第一步:用微信扫描二维码(如下图所示)


第二步:会出现如下图所示的界面,这时候点击手机右上角的三个点

Pasted Graphic.tiff


第三步:然后再弹出来的选项中,选择在Safari中打开(就是苹果自带的浏览器)。


Pasted Graphic 2.tiff



第四步:点击立即下载,下载时有点慢,请耐心一点

Pasted Graphic 3.tiff


第五步:等下载完成,在手机桌面上会看到 小黑,就可以用了。


Pasted Graphic 4.tiff



第六步:安装完成后,需要对应用进行信任操作,点击设置——>通用———>描述文件与设备管理


Pasted Graphic 5.tiff


Pasted Graphic 6.tiff



第七步:选择应用,找到信任选项

Pasted Graphic 7.tiff



Pasted Graphic 8.tiff



第八步,点击信任后,返回桌面,找到微信分身版,即可正常使用


Pasted Graphic 9.tiff


2016-06-13 13:52:20 ChSaDiN 阅读数 13344

引子


由于对iOS逆向分析很感兴趣,所以也花了很长一段时间学习了iOS逆向相关知识,并积累了一些相关经验,
这几天又到看雪论坛逛了一下,看看最近有没有什么大牛分享心得成果的!还真让我看到一篇有意思的文章【原创】微信双开是定时炸弹?关于非越狱iOS上微信分身高危插件ImgNaix的分析 ,通过读完这篇文章,让我又有了站在巨人的肩膀上,也来探究和学习一下非越狱设备如何Hook App的兴趣了。

思路


越狱和非越狱Hook iOS App的关键就是让App在启动的时候加载自己的dylib。那么在非越狱上加载dylib的思路就是利用:Mach-o LC_LOAD_DYLIB , 在App在被加载的时候,把我们的动态库dylib也一起加载起来。

关于非越狱设备Hook App网上有很多资料,下面摘抄来自阿里安全工程师的博客“iOS冰与火之歌番外篇 - 在非越狱手机上进行App Hook”关于非越狱手机Hook App的思路。也可以在IOS应用逆向工程官方论坛搜索更多关于逆向的资料。

今天我就来介绍一种不需要越狱就能hook iOS app方法,也就是Mach-O LC_LOAD_DYLIB Hook。这种方法是通过修改binary本身来加载第三方dylib并实现hook,具体思路是:

提取ipa中的二进制文件 -> 修改二进制文件的Load Commands列表,加入要hook的dylib –> hook.dylib在函数constructor函数中完成对特定函数的hook->对修改后的ipa进行签名,打包和安装。


工具

MachOView
iReSign
yololib
同步助手(或者pp助手、iTools)

本文实践工程

被注入目标代码工程:AppRe
生成动态库dylib代码工程:dylib


1.目标App

也就是要被注入的App。这里我们自己写一个简单的App,代码非常简单:点击“点击我”按钮弹出一个窗口,显示一句话“Hello iOS!”以及app的bundleid。

- (void)viewDidLoad {
    [super viewDidLoad];
    //布局UIButton
    self.view.backgroundColor = [UIColor whiteColor];
    UIButton *button  =[UIButton buttonWithType:UIButtonTypeSystem ];
    [button setTitle:@"点击我" forState:UIControlStateNormal];
    [button setFrame:CGRectMake((self.view.frame.size.width-120)/2, (self.view.frame.size.height-40)/2, 120, 40)];
    [button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
}

- (void)buttonClick:(id)sender
{
    [self say:@"Hello iOS!"];
}

- (void)say:(NSString *)string
{
    NSString *identifier = [[NSBundle mainBundle] bundleIdentifier];
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:string message:identifier preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];
    [alert addAction:okAction];
    [self presentViewController:alert animated:YES completion:nil];
}

这里写图片描述

2.生成动态库dylib

由上面的代码可知,在viewController类中有一个say的函数,该函数完成了弹窗的功能。
那么我们接下来要做的是,将通过hook viewController 的say方法,把“Hello iOS!”改成“Hello, Android!”

xcode本身不直接提供构建dylib的工程,但是可以通过其他方式来构建,这里也直接使用“iOS冰与火之歌番外篇 - 在非越狱手机上进行App Hook”提供的代码工程直接修改一下。我也是从文中学习到CaptainHook的使用,摘抄下来:

下一步就是要实现对特定函数的hook。在这里我推荐使用CaptainHook这个framework。作者已经帮我们实现了hook所需要的各种宏,只要按照如下步骤就可以完成针对特定函数的hook:

使用 CHDeclareClass() 声明想要hook的class

在构造函数中用 CHLoadClass() 或 CHLoadLateClass() 加载声明过的class

使用CHMethod() hook相应的method

在CHMethod()中可以使用CHSuper()来调用原函数

在构造函数中使用CHClassHook()来注册将要hook的method

CHDeclareClass(ViewController);
//参数个数、返回值类型、类名、selector名称、selector的类型、selector对应的参数的变量名
CHMethod(1, void, ViewController, say, id, arg1)
{
    NSString* tmp=@"Hello, Android!";

    CHSuper(1, ViewController, say, tmp);
}


__attribute__((constructor)) static void entry()
{
    CHLoadLateClass(ViewController);
    CHClassHook(1, ViewController,say);
}

注意:

  • 生成动态库dylib使用的签名方式要和你要注入dylib的可执行文件重签名后的签名方式一致。

通过“iOS冰与火之歌番外篇 - 在非越狱手机上进行App Hook”提供的源码生成的dylib注入app之后,会导致App闪退,通过调试和各种折腾发现在生成dylib工程中配置正确的Entitlements.plist即可解决。
图片1

2.注入dylib

注入dylib这一步,如果要深入理解的话,就需要学习mach-o文件结构相关知识了。这里只需知道在mach-o文件结构的Load Commands 中的如何LC_LOAD_DYLIB指定了一个要加载的dylib,那么App在启动的时候就会自动加载该dylib。

注入dylib实际就是修改mach-o的结构体,插入一条新的load command 即LC_LOAD_DYLIB。这里也使用大神提供的工具yololib来进行修改mach-o结构体注入dylib,使用很简单。也可以使用二进制编辑器010Editor来进行修改,手动修改会比较麻烦。

./insertdylib AppRe hook1.dylib

这里,我将该工具yololib重新命名为insertdylib,方便自己快速记忆。
这里写图片描述

注入后我们使用machOView工具可以发现mach-o结构体成功被插入了一条load command(如果你熟悉命令行也可以使用otool查看)。

这张图是旧的图O(∩_∩)O哈哈~,因为machOView有时会闪退,该死的,写该文章的时候就一直闪退。图片中dev_sfa.png,实际也是hook.dylib重命名过来的,伪装成一个png图片!!
图片3

注意:

这里有个坑!在执行insertdylib的两个参数binary文件dylib文件,不要带上全路径。要把dylib文件拷贝到AppRe.app目录,然后cd 到AppRe.app目录,然后直接insertdylib binaryfile dylibfile如果带上了全路径那么路径也被插入到mach-o结构体中,导致注入失败。

3.重签名

当AppRe.app注入之后,剩下的就是打包和重签名了!对于重签名我推荐大牛的iReSign

把AppRe.app 转成ipa 很简单,新建一个Payload目录,把AppRe.app放到Payload目录里面,在执行下面命令即可

zip -qry AppRe.ipa Payload/

进行重签名.步骤如下:

  1. 拖拽进对应的AppRe.ipa文件到iReSign中.

  2. 拖拽进对应mobileprovision文件,这里我使用的是dev的开发授权文件

  3. “entitlements.plist的路径”可以不填,在iReSign源码中看出来,iReSign会自动成成一个entitlements.plist文件的。

  4. 勾选修改ID。 即修改Info.plist的bundle identifier 。因为我们一般情况下是没有原App的证书的,所以需要修改bundle identifier

  5. 选择对应的签名。这里的签名一定要和生成dylib的时选择的签名是一致的!这里我使用的是dev的签名

  6. 点击“重新签名!”,会在ipa所在目录重新生成一个AppRe.-resignipa的包。

这里写图片描述

4.安装

使用同步助手或者pp助手都可以,拖拽安装到手机并运行!
这里写图片描述

2019-12-29 07:39:27 github_34790294 阅读数 25

最近app在推广过程中发现有大量的用户使用小号来领取邀请奖励,而小号的操作往往是利用多开软件开启应用分身来登录。为此,我需要区分出本体和克隆体。

当今市面上流行的分身主要有三类

1.修改Framework

手机厂商实现的分身功能就是用这种方式实现的

检测方案:手上有个小米测试机,正好自带分身,通过getFileDir()的api试了下,在本体得到的是data/data/com.xxx.xxx/files,克隆体得到的是data/user/10/com.xxx.xxx/files

2.修改apk

通过反编译apk,修改apk包名、签名等将apk伪装成另外一个app。市面上常见的第三方多开app大部分都是使用的这种技术。其特点是每次制作一个分身都需要时间拷贝、并且在应用列表中可以看到

检测方案:
跟上面一样,可以用getFileDir()来检测,只不过一个是data/data/com.xxx.xxx/files,另一个是data/data/com.xyz.xyz/files

3.虚拟操作系统

虚拟一个操作系统,克隆体app在这个虚拟系统中运行,在应用列表不可见,代表产品:360分身大师

检测方案:
这个据说是唯一一种绕过getFileDir()的分身方式,确实这种方式让我耗费了很长时间,下面以360的分身大师举例,详细说下分析过程

  1. 首先通过getFileDir()尝试,本体和克隆体输出一致。失败!!
  2. 通过在本体和克隆体登录不同账号获取SP中存储的账号信息,确定获取的信息不同,证明存储位置不一致
  3. 通过文件管理器查看最近修改的文件,发现系统根目录下有一个docker的文件夹,里面包含了跟根目录类似的结构,在其里面的Android/data下就会发现我们自己的包名,分身的本地数据就存放在这里。
  4. 找到分身的本地存储后,本想向其中存储数据用来标记是否为分身,但本体运行时报了一个无权限写入的异常,因此改为了判断当前是否有对该目录的写入权限

PS:据说“平行空间”原理和“360分身大师”相同,经测试发现通过getDirFile()就可以判断出来,至此,分身检测基本完成

2018-08-26 15:40:22 weixin_41879093 阅读数 109

题目描述
继MIUI8推出手机分身功能之后,MIUI9计划推出一个电话号码分身的功能:首先将电话号码中的每个数字加上8取个位,然后使用对应的大写字母代替 (”ZERO”, “ONE”, “TWO”, “THREE”, “FOUR”, “FIVE”, “SIX”, “SEVEN”, “EIGHT”, “NINE”), 然后随机打乱这些字母,所生成的字符串即为电话号码对应的分身。
输入描述:
第一行是一个整数T(1 ≤ T ≤ 100)表示测试样例数;接下来T行,每行给定一个分身后的电话号码的分身(长度在3到10000之间)。
输出描述:
输出T行,分别对应输入中每行字符串对应的分身前的最小电话号码(允许前导0)。
示例1
输入
4
EIGHT
ZEROTWOONE
OHWETENRTEO
OHEWTIEGTHENRTEO
输出
0
234
345
0345

思路

这道题差不多是暴力的了,因为字母最后是会被打乱,所以先找出具有自己独有字母的数字, 如‘Z’只有0才有,下面列出我找出的字母与数字之间的关系:

0 = Z
1 = O - Z - W - U
2 = W
3 = H - G
4 = U
5 = F - U
6 = X
7 = S - X
8 = G
9 = I - (F - U ) - X - G

#include<iostream>
#include<string>
#include<vector>
using namespace std;
void print(int i, int shu){重复输出同一个数字
    while(i-- )
        cout<<shu;
}
int main(){
    int t;
    cin>>t;
    while(t--){
        string ss;
        cin>>ss;
        vector<int> zim(500, 0);
        int len= ss.length();//字符串的长度
        for(int  i= 0; i< len ; i++){
            zim[ss[i]]++;//记录26字母的个数
        }
        vector<int> shu(10, 0);

        shu[2]= zim['Z'];//原本的2,经过加8取个位数后得0,下面的类似
        shu[3]= zim['O']- zim['Z']- zim['W']- zim['U'];//1
        shu[4]= zim['W'];//2
        shu[5]= zim['H']- zim['G'];//3
        shu[6]= zim['U'];//4
        shu[7]= zim['F']- zim['U'];//5
        shu[8]= zim['X'];//6
        shu[9]= zim['S']- zim['X'];//7
        shu[0]= zim['G'];//8
        shu[1]= zim['I']- shu[7]- shu[8]- shu[0];//9

        for(int i= 0; i< 10; i++){
            print(shu[i], i);
        }
        cout<<endl;
    }
}
没有更多推荐了,返回首页