跨浏览器通用、可选择的选项卡切换js

  按道理要上传demo的?点此实例下载

笔者:蒸米@阿里活动安全

  特意注解,由于自身是菜鸟,所以,我写的js只好在某种特定的布局下运行(真菜!),没有想到怎么搞个极端的通用机制。这多少个js需要什么的协会?这就是最外层一个div容器,标题由一个ul列表表示,内容也是一个ul列表。倘诺不是这种格式,我写的菜鸟代码是无法运行的(菜呀。。。),要运行,就要修改其中的几行js啦。。。
 

二、wanpu.png分析

 

用ida打开wanpu.png,可以观察这些dylib分别对BundleID,openURL和NewMainFrameViewController举办了hook:

图片 1

 

BundleID不用说,是为了让app在运转的时候改回”com.tencent.xin”。

 

NewMainFrameViewController的hook函数就是在微信主页上显得VIP的图样,以及传输一些百般隐私的用户数量(ssid,
mac, imei等)到开发者自己的服务器上:

图片 2
图片 3

 

OpenURL那些hook就很有意思了,这多少个函数本身是用来处理调用微信的URL
Schemes的。看过自家事先写过的《iOS URL Scheme
威逼》的稿子的人一定知道这么些”倍推微信分身”是有能力开展URL
Scheme胁制的,假使在Info.plist里开展了声称,手机上所有应用的URL
Schemes的采用都有可能被hijack。

 

除此之外这个hook以外,我们在依旧在”倍推微信分身”的逆向代码里,发现了Alipay的SDK!一个没悟出,在”倍推微信分身”的援助下,支付宝和微信支付到底走到了一块:

图片 4

 

因为捆绑了支付宝的SDK,”倍推微信分身”可以调用支付宝的高速支付效能:

图片 5

 

经过网络抓包分析,大家得以观望”倍推微信分身”会发送一些劳动收费的数码到手机上:

图片 6

 

经分析,”倍推微信分身”之所以插手支付宝sdk是为着对这几个微信多开app举行收费。因为全球没有免费的午餐,软件开发者之所以制作腾讯的盗版软件”倍推微信分身”就是为了可以赢拿到自然的入账,所以才会接入支付SDK的。

 

<div class="tab1">
    <ul class="name">
        <li>项目一</li>
        <li>项目二</li>
        <li>项目三</li>
    </ul>
    <ul class="content">
        <li>类为<em>"tab1"</em>项目一内容,通过<em>"click"</em>触发</li>
        <li>类为<em>"tab1"</em>项目二内容,通过<em>"click"</em>触发</li>
        <li>类为<em>"tab1"</em>项目三内容,通过<em>"click"</em>触发</li>
    </ul>
</div>
<div class="tab1">
    <ul class="name">
        <li>项目一</li>
        <li>项目二</li>
        <li>项目三</li>
    </ul>
    <ul class="content">
        <li>类为<em>"tab1"</em>项目一内容,通过<em>"click"</em>触发</li>
        <li>类为<em>"tab1"</em>项目二内容,通过<em>"click"</em>触发</li>
        <li>类为<em>"tab1"</em>项目三内容,通过<em>"click"</em>触发</li>
    </ul>
</div>
<div class="tab2">
    <ul class="name">
        <li>项目一</li>
        <li>项目二</li>
        <li>项目三</li>
    </ul>
    <ul class="content">
        <li>类为<em>"tab2"</em>项目一内容,通过<em>"mouseover"</em>触发</li>
        <li>类为<em>"tab2"</em>项目二内容,通过<em>"mouseover"</em>触发</li>
        <li>类为<em>"tab2"</em>"项目三内容,通过<em>"mouseover"</em>触发</li>
    </ul>
</div>

自由改动推送的内容,举行钓鱼攻击等操作。比如自己经过DNS威胁就可知轻易改动推送给用户的多少,以及诱导用户去下载我要好设定的店铺app,简直和XcodeGhost一模一样(具体细节可以参考我事先发表的《你认为服务器关了这事就寿终正寝了?

XcodeGhost截胡攻击和服务端的复现,以及UnityGhost预警》http://drops.wooyun.org/papers/9024)。

 

此地我们开展DNS要挟并修改了推送的情节,同时咱们把URL替换成了另一个集团应用的下载plist:

图片 7

 

能够看来咱们在起步”倍推微信分身”的时候弹出了革新对话框,还不可以收回:

图片 8

 

点击后,”倍推微信分身”下载了俺们轮换后的集团应用,一个伪装成微信的假app:

图片 9

 

而外,在分析的过程中,我们还发现”倍推微信分身”app还设有十分多的安危接口,并且可以使用第三方服务器的控制举办长途调用:

 

(1).
“倍推微信分身”app利用动态加载的法子调用了无数私有API。比如app使用了MobileCoreServices里的[LSApplicationWorkspace
allInstalledApplications]来得到手机上设置的使用:

图片 10

 

比如app使用了SpringBoard瑟维斯(Service)s的SBSLaunchApplicationWithIdentifier。这一个API
能够在不需要urlscheme的情状下调起目的app:

图片 11

 

比如app加载了和动用设置有关的私有Framework
MobileInstallation以及预留了经过URL Scheme安装集团app的接口:

图片 12

 

(2).
“倍推微信分身”app预留了一整套文书操作的责任险接口,可以直接对微信app内的有着文件举行操作,那个文件包括好友列表,聊天记录,聊天图片等隐私信息。

图片 13

 

要通晓在iOS上,聊天记录等信息都是一心没有加密的保留在MM.sqlite文件里的:

图片 14

 

一、html部分(其实这还没啥美观的,设置了多少个,前五个是平等的,通过click事件触发,最终一个通过鼠标移动触发)
 

三、高危接口分析

 

内需留意的是,”倍推微信分身”打开的url数据都是服务端可控的,并且没有开展加密,黑客可以接纳MITM
(Man-in-the-middle attack)

  

 

  实现切换用到了多少个技巧,其一,通过类采取器selectqueryAll对同一系列举办拔取,为了兼容IE6、7,做了一个备用的遍历版本(相当低效);其二,使用了轩然大波委托,在题目列表ul上绑定了接触事件。 

一、 “倍推微信分身”初探

 

这一次要分析的成品名字叫”倍推微信分身”,可以兑现非越狱iOS上的微信多开。那么些app的设置是通过itms-services,也就是店铺证书的安装情势举行设置的。服务器是架在59os.com。可以看到除了微信分身以外,还有为数不少其余破解应用提供下载:

图片 15

 

app安装完后的图标和微信的一模一样,只是名字成为了“倍推微信分身”: 

图片 16

 

下载完倍推微信分身,并登陆后,可以看看首页与原版微信并不曾太大的转变,只是左上角多了一个VIP的表明:

图片 17

 

大家清楚,遵照苹果的序列编制,一台iOS设备上不同意存在六个Bundle
ID一样的app。由此,大家揣测这多少个微信分身app是修改过Bundle
ID的。于是我们查阅一下Info.plist,果然Bundle ID已经做了改动:

 图片 18

 

而是探讨过iOS上微信分身的人一定掌握,微信app在开行以及发送音讯的时候会对Bundle
ID做校验的,借使不是”
com.tencent.xin”就会报错并脱离。那么”倍推微信分身”是怎么完成的啊?经过分析,原来”倍推微信分身”是通过hook的一手,在app启动的时候对BundleID做了动态修改。至于怎么举行非越狱iOS上的hook可以参见我后边写的两篇作品:

 

【iOS冰与火之歌番外篇 –
在非越狱手机上开展AppHook】

http://drops.wooyun.org/papers/12803

 

【iOS冰与火之歌番外篇 -App
Hook答疑以及iOS 9砸壳】

http://drops.wooyun.org/papers/13824

 

于是大家对”倍推微信分身”的binary举行辨析,发现这一个binary在启动的时候会load一个伪装成一个png文件的第三方的dylib–
wanpu.png:

图片 19

 

用file指令可以见到这多少个伪png文件其实是一个饱含了armv7和arm64的dylib:

图片 20

 

我们来看这些伪图片就像是一个寄生虫一样存在于微信app的体内,特别像dota里的Naix(俗称小狗)的巅峰技能

  • 寄生,由此我们把这些危险样本称之为ImgNaix。

图片 21

 

    ①跨浏览器,IE6+,FF,Chrome,Safari,Opera
    ②同一个页面可以用同一个js设置不同的选项卡。

总结

 

虽然如此我们在样本分析的经过中除去获得用户隐私外,暂时并未捕获到黑心攻击的行为,但这么些”倍推微信分身”预留了大气饮鸩止渴的接口(私有API,URL
Scheme
Hijack,文件操作接口等),并且破解者是足以不管修改客户端的内容,因而不用说推送任意广告和收费音讯了,连窃取微信账号密码的可能都有,简直就像一颗定时炸弹装在了手机上。这样的微信双开你还敢用吗?

 

从这几个样本中,我们早已见到在非越狱iOS上的攻防技能早已变的老大干练了,无论是病毒(XcodeGhost)仍然破解软件(ImgNaix)都接纳了诸多苹果安全部制的先天不足,并且随着研商iOS安全的人越发多,会有更多的漏洞会被察觉
(e.g.,
利用XPC漏洞过App沙盒http://drops.wooyun.org/papers/14170)。此外,iOS上的app不像Android,简直一点防护措施都没有,当遇到黑客攻击的时候几乎会瞬间沦陷。正如同我在MDCC
2015开发者大会上所讲的,XcodeGhost只是一个先河而已,随后会有更为多的危机会产出在iOS上,请我们做好暴风雨来临前的预备呢!

 

笔者:蒸米@阿里移动安全,更多安全技术作品,请查看阿里聚康宁博客

 

三、js代码
 

序言

 

微信作为手机上的首先大使用,有着上亿的用户。并且很五人都不只拥有一个微信帐号,有的微信账号是用以商业的,有的是用于私人的。可惜的是官方版的微信并不匡助多开的法力,并且屡屡更换微信账号也是一件卓殊艰巨的事,于是我们纷纷在物色能够在手机上登陆两个微信账号的法子,相对于iOS,Android上早已有了很干练的成品,比如360
OS的微信双开和LBE的双开大师就足以满意广大用户多开的需要。

 

不过在iOS上,因为苹果的安全机制,并不曾另外著名的IT厂商推出微信多开的制品,反而是各样小集团的微信双开产品满天飞。但使用这个产品确实安全呢?明日咱们就来看望这么些产品的实质。

 

  最终的结尾,我想说,还真有无数要更上一层楼的地点(当然的,你又不是pis神)。例如,涉及类添加时,类名的字符串并接保证原有类名不掩盖。例如,可以答应一下社团转换的适应能力。例如(好多问题呀)。。。

  我手一抖,按了倒闭了页面,结果重写了。重写的结果是,篇幅收缩了(太好了,这废话少多了)!
 

  最终一提的是法力,这几个事物有哪些效果?就是选项卡切换(废话。。),选中的选项卡标题会添加一个类“selected”,方便设定样式。

Author:Chemandy  

  说太多没啥米用,来看代码吧。
 

  缘起:先天一同学对自身说“可以吗,我准备去学习”。我大惊,这老勾引我打dota的落寞男依旧也去上学,于是自己好奇他学什么,他说要搞一个挑选卡切换js。。。由于目前学了点js,于是我装逼道。。。不太难啊。。。就切一下display属性?同学无视自己。。说要搞个通用的。。。什么还要跟ajax交互。。???我愣是没有听懂。。。到底要搞哪样。。。权当作练手,我自己胡弄了一个。
 

  这一般没什么好说的,加了些最简便的css3,凑合着(这画画好烂啊)。
 

  需求:同学口中的通用我不精通神马意思。。。这我就按自己的了解啊。。

  至于还有什么疾病,请各位大侠指点了(这人脸皮厚,即便喷)。

二、样式CSS
 

  就这js函数,我们开展一下呢(很不羞怯啊)。。。首先定义了有些风波目标的通用函数,以应对跨浏览器时的使用。接着两行是选项卡切换的函数。一个参数是要定义为选项卡的容器的类,一个是接触切换的项目。

  
  抱怨一下,在取ul的DOM元素时,我用了name作为变量名,结果在chrome和safari绑定不了事件,这里搞了自身好久啊!非凡烦心。。。

  完了就是实在的js,思路是:定义为某个类的容器将会绑定成一个选项卡,切换的不二法门也足以自定义。tabSwitch(“tab1″,”click”);就是持有tab1类都绑定为选项卡,通过click事件切换。

body{
    text-align:center;
}
.tab1, .tab2 {
    width:350px;
    margin:0 5px;
    background:#CC9933;
    opacity:0.5;
    border-radius:5px 5px 5px 5px;
    box-shadow: #CCC 4px 4px 4px;
    text-align:left;
    float:left;
    display:inline;
}
.name {
    list-style:none;
    overflow:hidden;
}
.name li {
    width:90px;
    font:bold 16px/30px Verdana, Geneva, sans-serif;
    background:#669900;
    text-align:center;
    border-radius:5px 5px 5px;
    margin-right:5px;
    float:left;
    display:inline;
    cursor:pointer;
}
li.selected{
    background:#FF9900;
}
.content li{
    height:500px;
    display:none;
}
/** 
 * 事件处理通用函数
 */
var EventUtil = {
    //跨浏览器取事件对象event
    getEvent : function(event){
        return event ? event : window.event;
    },
    //款浏览器取事件对象的目标DOM节点
    getTarget : function(event){
        return event.target||event.srcElement;
    },
    //跨浏览器对节点进行事件绑定
    addHandler : function(element,type,handler){
        if(element.addEventListener){
            element.addEventListener(type,handler,false);
        }else if(element.attachEvent){
            element.attachEvent("on"+type,handler);
        }else{
            element["on"+type] = handler;
        }

    }
};

//设置选项卡切换方式
tabSwitch("tab1","click");
tabSwitch("tab2","mouseover");

/**
 * 选项卡通用函数
 */
// 传入参数inClassName设定为绑定的选项卡类名,参数triggerType设定为触发切换的类型
function tabSwitch(inClassName,triggerType){
    //取得全部选项卡区域
    if(document.querySelectorAll){
        var tabs = document.querySelectorAll("."+inClassName);
    }else{
        var divs = document.getElementsByTagName("div");
        var tabs = new Array();
        for(var k=0,lenDiv=divs.length; k<lenDiv; k++){
            if(divs[k].className.indexOf(inClassName) > -1){
                tabs.push(divs[k]);
            }
        }
    }
    //为每个选项卡建立切换功能
    for(var j=0,len=tabs.length; j<len; j++){
        //获取标题和内容列表
        var tab = tabs[j];
        //使用私有作用域为每个选项卡建立切换
        (function(){
            var nameUl = tab.getElementsByTagName("ul")[0];
            var content = tab.getElementsByTagName("ul")[1];
            //初始化选项卡
            nameUl.getElementsByTagName("li")[0].className = "selected";
            content.getElementsByTagName("li")[0].style.display = "block";
            //添加事件委托
            EventUtil.addHandler(nameUl,triggerType,function(event){
                //获取事件对象
                event = EventUtil.getEvent(event);
                var target = EventUtil.getTarget(event);
                //选项卡切换
                if(target.nodeName.toLowerCase() == "li"){
                    //分别取得标题列表项和内容列表项
                    var nameList = nameUl.getElementsByTagName("li");
                    var contentList = content.getElementsByTagName("li");
                    //标题添加selected类,并显示内容
                    for(var i=0,len=nameList.length; i<len; i++){
                        nameList[i].className = "";
                        contentList[i].style.display = "none";
                        if(nameList[i] == target){
                            nameList[i].className = "selected";
                            contentList[i].style.display = "block";
                        }
                    }
                }
            });
        })();
    }
}

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website