斐讯路由器端口转发K2P(119 千兆b有线端口)相比K2(85.9 百兆b有线端口更值吗?或有必要吗相差33

1精工细作 配置强劲  近日,最新推出的802.11AC新品——K2,着实火了一把。据悉,该新品不仅在设计、性能上表现亮眼,而且在购买并参与其会员活动后,即可实现0元购机,让想体验11AC无线网络的消费者切实享受到免费升级的实惠。不过,有的网友可能认为“天下没有免费的午餐”,那么这款主打免费的斐讯K2,性能究竟怎样呢?抱着同样的疑问,下面就和我们一起来实测下这款新品路由器吧。  精工细作&配置强劲  斐讯K2无线路由器采用最新的802.11AC无线标准,支持2.4GHz和5GHz双频段并发,最高传输速率可达1167Mbps(2.4G频段上最高300Mbps+5G上最高867Mbps)。K2还支持2x2&MIMO架构技术,可有效提升无线信号的覆盖和传输性能。斐讯K2无线路由器  初见斐讯K2,你一定会推翻此前“免费产品=粗制滥造”的固有想法,并为其艺术品般精雕细琢的外观“颜值”而点赞。斐讯K2采用业界高端的8000目模具精细打磨外壳,质感光滑细腻,配合弧形的镜面效果,令K2成为了路由器中的“白美富”。K2采用苹果白色系的机身色调,让它可以百搭任何家装风格,放在任何地方都可以看做一件工艺品。前端有1个LED指示灯  在K2机身前端有1个LED指示灯,可以让用户随时了解路由器的运行状态。而在机身后部与侧面,则搭载有4根5dBi高增益天线,可以提供广阔的无线信号覆盖范围。不过天线不可拆卸,在部署灵活性上稍弱一些。  在内部处理器上,斐讯K2采用了主流的MTK(联发科)MT7620A+MT7612E无线芯片,为高速的网络数据传输处理提供了强劲的“芯”。而为了进一步增强信号的覆盖范围和稳定性,K2更采用了Skyworks的强劲PA(功放)和LNA(低噪声放大器)元器件,PA负责扩大无线信号,而LNA则可以将客户端传来的信号进行降噪和解析,来有效加强信号覆盖表现。K2后面各端口  在机身后面,斐讯K2配置了4个百兆LAN口和1个百兆WAN口,可以为消费者的高速有线连网提供可靠的端口平台。网口右侧还配有1个无线开关、和重置键的组合按键,用户可通过路由器的Web界面对按键功能进行选择。&无线开关、WPS和重置键的组合按键(左,功能可调)和散热孔(右)  在K2底部设计有大量的散热孔,内部也嵌入了大面积铝制散热板,可以保证内部热量的及时散出,在延长了路由器的使用寿命的同时,能够进一步加强设备和网络的稳定性。既然斐讯K2配置如此霸气,下面就果断先来了解下这款新品的信号表现吧。产品:
2超乎想象的信号覆盖  超乎想象的信号覆盖  那么这款K2新品路由器信号表现究竟怎么样呢?下面就通过信号实测来为您揭晓答案。此次测试将在ZOL&7层的办公区展开,通过WirelessMon专业版,来为大家实测斐讯K2的信号覆盖能力。需要特别说明的是,在ZOL办公区内,覆盖了十多个无线热点,因此对该的信号抗干扰能力也是一次大考验。  首先来看看实际的测试环境示意图吧。实测环境示意图  说明:A点是路由器的放置点;B点为第一个测试点,距离A点30m左右,与A点间无阻隔;C点为第二个测试点,距离A点16m左右,与A点间有普通墙体+木门的阻隔;D点为第三个测试点,距离A点22m左右,与A点间有承重墙+铁门的阻隔。E点为第三个测试点,距离A点25m左右,与A点间有承重墙+铁门的阻隔(高难度)。  2.4GHz频段B点实际测试成绩:2.4GHz频段B点信号强度:92%  2.4GHz频段C点实际测试成绩:2.4GHz频段C点信号强度:87%  2.4GHz频段D点实际测试成绩:2.4GHz频段D点信号强度:78%  2.4GHz频段E点实际测试成绩:2.4GHz频段E点信号强度:40%  通过测试可以看出,斐讯K2在高增益天线与霸气功放的加持下,其2.4GHz频段下的信号覆盖表现完全超乎想象。在无阻隔的远端B点,信号强度可达92%;而在较近的、有普通墙体+木门阻隔的C点,信号强度可达87%;在远些、有承重墙+铁门阻隔的D点,信号强度也能达到78%;即使在更远并有承重墙+铁门阻隔的高难度E点,其信号强度也能达到40%。K2在2.4GHz频段的整体覆盖表现相当出色,堪称扫除信号盲区的新利器。  那么这款K2在5GHz频段上的信号又表现怎么样呢?我们继续测试。  5GHz频段B点实际测试成绩:5GHz频段B点信号强度:85%  5GHz频段C点实际测试成绩:5GHz频段C点信号强度:76%  5GHz频段D点实际测试成绩:5GHz频段D点信号强度:60%  5GHz频段E点实际测试成绩:5GHz频段E点信号强度:30%  经过实测发现,斐讯K2在5GHz频段上的覆盖也表现出色。在远端B点,信号强度达到85%;在有普通墙体+木门阻隔的C点,信号强度也达到76%;在有承重墙+铁门阻隔的D点,信号强度仍可达到60%。即使在更远并有承重墙+铁门阻隔的高难度E点,其信号强度也能达到30%。相较同类产品而言,斐讯K2在5GHz频段的表现相当霸气,甚至能够匹敌一些产品在2.4GHz频段上的表现了。  斐讯K2在无线覆盖上的表现成功诠释了什么叫做“超乎想象”,其不论是在2.4GHz频段,还是在5GHz频段,都表现出霸气的信号覆盖能力,适合在各种环境下的无线组网使用。3便捷APP管控 Web端功能强大  便捷APP管控&Web端功能强大  除了精致的外观、强劲的硬件配置以及给力的信号表现,便捷智能的APP管控也是K2的另一大特色。通过手机APP,用户可以轻松实现对K2的远程配置、管理,轻松实现防蹭网、增强穿墙性能、健康节能、网速测试、管理家中孩子上网等多种功能。&&利用APP,K2可以实现更为便捷的管控。  而且斐讯智慧云的支持,无论用户身处何地,都可以随时远程掌控的状态,开启或关闭无线网络,修改网络名称、无线密码,进行节能管理或重启设备等功能操作,非常灵活方便。&&利用斐讯智慧云,登录后即可进行远程管控(左)、防蹭网(中)和一键穿墙(右)  作为一款绿色节能的,斐讯K2还支持健康节能调节,通过降低路由器功率可进行有效的节能减排。同时,斐讯K2还支持家长控制功能,可灵活控制上网行为,为有孩子的家庭营造健康可控的网络环境。&&K2还支持健康节能调节(左、中)和家长控制功能(右)  而要想享受上述种种的轻松体验,用户只需将手机接入斐讯K2组建的无线网络,并在手机端“斐讯智联”的APP即可实现,快去试试吧。&&WiFi设置(左)、为路由器进行体检(中)和网速测试(右)  功能强大的图型化Web端管理  不仅如此,斐讯K2还拥有较之前几代路由器产品更为贴心的图型化Web端界面,而且由于斐讯K2支持自动连网检测和IP冲突自动变更地址等特性,让K2的使用变得更加简单易用。斐讯K2的图型化Web端界面  进入K2的Web配置界面后,就可以在上方直观的看到斐讯K2的连网状况和终端设备数量。在下方则有“一键体检”、“信号调节”、“终端管理”、“上网向导”、“访客网络”和“路由设置”等常用的图型化选项。信号调节界面一键体检功能可帮助用户提高路由器的安全防护  右上角则是斐讯K2的高级功能,进入即可看到更为详细、丰富的功能选择。对于高级用户来说,在这里可以对K2进行更为精细的性能调节。后端按键功能设置虚拟服务器界面  总结:超乎想象的斐讯K2&值得拥有!  怎么样,对于配置如此强劲、性能又这么给力的K2无线路由器,如果还能免费使用的话,是不是就真得更加“超乎想象”了呢?目前在京东或天猫只要购买斐讯K2,随货就会获赠一个会员激活码,激活所获得的会员激活码后,便有399元提现至所对应的身份证银行卡里,相当于0元购机,有兴趣的网友还等什么,吧。
4斐讯K2详细参数
路由器交换机无线路由无线AP外行看热闹内行看门道 斐讯K2家居实景评测
1说多不如测多  【PConline 实景评测】不得不说的是,如今&信号强&覆盖广&已成为绝大多数路由器厂商的标准化广告用语。然而,通过以往的测试结果来看,事实却并非如此,有些信号并未得到明显改善,有些甚至根本无法自圆其说。鉴于此,本次我们决定深入家居环境,做一次更具针对性的实景评测。先向各位介绍一下,本期PConline网络频道收到的送测产品是一台斐讯K2,标榜&双频、千兆、覆盖广&,其无线性能究竟如何?不如让我们现在就走入家中,开始今天的实景测试。外行看热闹内行看门道 斐讯K2家居实景评测  斐讯K2采用802.11ac无线技术,可为用户提供更稳健的Wi-Fi性能,更清晰的无线网络信号,双频并发最高可达1200M无线速率,让用户上网飞速惬意。此外,一键体检、IP冲突自动变更、智能调节无线信号强度、免去辐射后顾之忧、支持斐讯智能APP,以及提供PHICOMM云服务,都是斐讯K2所拥有的特色功能。  在4根高增益外置天线中,2根为5GHz2根为2.4GHz独立适配,通过精密和专业的天线内部设计,让天线布局更合理,信号更强,并且完整的覆盖家中无线死角。最新MIMO技术,多个数据流通过多根天线同时收发,大幅提升其无线性能。  值得一提的是,斐讯K2采用了知名无线半导体解决方案公司Skyworks的PA+LNA模组,PA提高无线信号发射功率,LNA可以降低无线信号接收噪声干扰,收发兼备。2.4G无线性能相比普通路由器提升4倍,5G无限性能高达5倍。2斐讯K2外观设计  外观方面,斐讯K2采用8000目模具精细打磨外壳,整个路由器晶莹剔透犹如艺术品一般呈现出高贵的光泽。配合K2优雅的曲面造型设计,它不论放在客厅还是书房都能很好的融入家居环境之中。  外置的四根5dBi全向天线呈梯形排列在机器上方,使产品整体更加富有立体感。而位于机身前端,排列有白色的系统指示灯,这让斐讯K2看起来显得更加灵动。用户可通过扫描设备底部的二维码,下载斐讯智联APP,用手机设置家中的无线路由或对其远程操控,更加简单便捷。  斐讯K2底部,则采用了整体散热开孔设计,良好的散热性能为无线路由的正常工作,提供了有力保证。  最后,我们再来看看位于斐讯K2后端的I/O接口。斐讯K2为用户提供了4个百兆LAN口以及1个WAN口,1个Wi-Fi/Reset/WPS复用开关,以及一个DC充电孔。3常规设置与高级功能UI界面设计  在路由器设置界面方面,斐讯K2延续续了K1的简洁风格,采用干净的蓝、白、橘三种配色。斐讯K2的后台UI界面设计,布局清晰简单明了,让用户一目了然,便于设置。即便是初次设置斐讯K2路由器,也并不会觉得繁琐,输入默认的用户名和密码后,就可以进入到主界面了。设置界面-主页  在斐讯K2的主界面中,我们可以看到六个常用功能菜单,分别是一键体检、信号调节、终端管理、上网向导、访客网络与路由设置。&&信号调节、终端管理访客网络  通过这六个功能就可以对斐讯K2进行基本的网络设置与调节了,但是对于有更多需求以及网络发烧友来说,就需要进行更详细的高级设置了。&一些高级功能  不知各位是否已经发现,位于主页面的右上角,有个&高级功能&选项?实际上,斐讯K2的&高级功能&里,包含了运行状态、无限拓展、无线设置、硬件按钮设置、家长控制、应用设置、安全设置等高阶功能,十分详尽。无线扩展  当居住面积过大或者环境过于嘈杂时,用户可以通过开启无线拓展功能,连接中继器等设备,来达到信号扩展,增加覆盖面积的效果。无线设置-WPS设置硬件按钮设置家长控制设置  通过家长控制功能,可以限制孩子的上网时间,劳逸结合。应用设置  在应用设置里可以对虚拟服务器、DMZ主机和UPnP进行设置。安全设置  在安全设置一栏中,我们可以看到K2的安全系数非常高,在这里不仅有防火墙,还有针对Dos等攻击的特殊防范。系统管理远程管理  当然,除了通过网页对斐讯K2进行配置外,用户也可通过下载斐讯智联APP对其进行设置或远程管理,我们继续往下看。4斐讯智联APP斐讯智联APP  在扫描机身底部的二维码后,我们已在手机中成功下载了斐讯智联APP。打开APP,你会发现界面风格依旧明朗清晰,让人一目了。用户通过掌中的手机就可轻松管理家中的无线路由器。由于APP上所具备的功能大多与PC端的相同,因此笔者这里不再冗述。APP设置首页路由设置防蹭网、一键穿墙、一键体检健康节能、家长控制  从功能上来看,智联APP在功能选项上基本复刻了PC端的各项功能。在实际操作之后,笔者发现斐讯的这款智联APP,在对路由器进行相关设置操做时,非常便捷,没有卡顿现象,非常流畅真的很便利。5无线性能测试及评测总结无线信号测试  在无线性能测试上,我们会分别在手机和笔记本终端使用软件逐一对测试点进行监测,取稳定值。本次,笔者以家居作为测试环境,选取A、B、C、D四个具有代表性的测试点,在2.4GHz与5GHz频段上对其进行测试,并将设备无线状态保持为默认值。需要说明的是,测试家居实际环境测试,家居环境无线网络较为复杂,存在一定的信号干扰问题。此外,由于终端之间所采用的芯片技术各有不同,因此测得的数据也会存在一定差异,故本此数据仅供参考。测试环境说明  A点:路由到卫生间的距离(小于5米),有一道实木屋门、一道木框玻璃门相隔  B点:路由到厨房(小于8米),中间有走廊,有一道实木屋门、一道木框玻璃门相隔  C点:路由到次卧的距离(约8-10米),中间是走廊,有一道实木门  D点:路由到主卧的距离(约10-15米),一堵承重墙测试环境示意图其他说明  测试软件:WirelessMon专业版、WIFI分析仪  终端平台(PC端):Lenovo IdeaPad S410p  终端平台(手机端):HUAWEI EMUI4.1  SSID:lqszy、lqszy_5g&&PC端&&A点、B点&&C点、D点  从PC端实际测得的数据来看,四点中A点信号强度最强(-41dBm),B点测得数值为-46dBm,C点读数为-51dBm。由于B、C两点均经过过道,且距离放置路由器的次卧最远,因此这在一定程度上削弱了该两点的信号强度,其中C点的信号尤为薄弱。我们继续往下来看看手机端的测试数据如何。&&手机端2.4GA点B点C点D点  以上是斐讯K2手机端2.4G频段的测试数据,其数值变化趋势,基本与PC端一直,A、D两点信号最强,B点与C点信号稍有损耗;此外,在信号稳定性上来看,除了D点波动较小,与其它三点相比更为平缓、稳定。&&手机端5GA点B点C点D点  我们再来看下斐讯K2在5G频段的表现如何。与2.4G的复杂无线环境相比,5G频段少了很多信号干扰,在笔者测试的无线环境中,5G只有2个无线信号源;信号稳定性方面,线条平缓。只是由于5G物理特性所致,其信号强度随着距离以及障碍物的增多,衰减较多。  评测总结:从家居环境下的测试结果来看,斐讯K2在型号强度以及稳定性方面,表现的都很不错。当然,这要得力于其采用了Skyworks公司的PA+LNA模组,PA提高无线信号发射功率,LNA可以降低无线信号接收噪声干扰,收发兼备。在智能应用方面,斐讯K2不仅可以智能调节信号,还可以远端管理十分方便。外观方面,斐讯K2也是可圈可点,大气美观。综合来看,斐讯K2都是家庭组网的不错选择。
总排行榜我在第22位
参考价:¥399
网友评分: 5
网络设备论坛帖子排行
最新资讯离线随时看
聊天吐槽赢奖品
浏览本产品的网友还关注:K2P的5G速率问题(可能是我的个例情况) - 斐讯版面(未经论坛许可请勿发布广告) -
恩山无线论坛 -
Powered by Discuz!
后使用快捷导航没有帐号?
只需一步,快速开始
请完成以下验证码
请完成以下验证码
查看: 3444|回复: 15
K2P的5G速率问题(可能是我的个例情况)
本帖最后由 dengpinshi 于
22:36 编辑
昨天到手K2P,测试了一下5G情况,先说一下自己之前的情况,主路由用的极1s多拨,然后lan口有线接了个水星的MAC1200R当做二级路由转发5G,使用speedtest或者是腾讯电脑管家的网速测试都能到10M+
下面是重点,昨天拿回来的K2P我也做了测试,我也是当二级路由接在了极1s下面,结果5G最多跑7.xM(多个设备都测试了,设备如下:iphone5s,红米note3(heliox10),pc(intel 3160)),同样的情况下换到我得水星路由网速还是10M没有问题,说明线路正常
然后跑了一下迅雷,却又能上9M的样子(K2P管理界面显示10M+)
然后想了一下测试了一下K2P的有线,测速能到10M+,正常,然后测试了一下在K2P的5G环境下拖放极1s的sd卡内的文件,速度也是正常(SD卡一般般,正常也就跑10M)
也不是很懂路由器,可能是和固件上的nat硬件加速有关
问了几个群友,有人说也和我一样出现了只能跑7.xM的情况,但是也有正常的,我目前是联系了京东进行了换货,大概明后天到(这里表扬一下京东的换货政策,是先把要换的货发过来,然后配送员拿着新机器直接来上面换之前的),到货之后再测试看看,如果还是这样,可能就是固件的问题了吧,那就只能看第三方固件了或者是官方更新(有第三方我肯定刷第三方啦,目前信息来看,老毛子是要出K2P的,也有人把K2P邮寄给Lintle去适配了,H大也要高考完了,breed应该也不久就搞定了,论坛也有人改好了USB2.0以及闪存和内存,目前来看,还是不错的)
目前测试了几遍结果是迅雷下载跑的网速没问题,但是测速网站或者软件就跑不起来
我的恩山、我的无线
The best wifi forum is right here.
也只有在等等了
我的恩山、我的无线
The best wifi forum is right here.
对 我也发现好像有问题
具体啥问题,和我差不多的样子?&
我的恩山、我的无线
The best wifi forum is right here.
对 我也发现好像有问题
具体啥问题,和我差不多的样子?
我的恩山、我的无线
The best wifi forum is right here.
接口速率的问题, 我试过了,接上端百兆口,5G 只能跑80M, 我接千兆口,跑满我峰值120M
那感觉还是固件问题?毕竟我其他路由器接上端的百兆口没问题。。&
我的恩山、我的无线
The best wifi forum is right here.
我做主路由,试了一次,手机speedtest跑满了,没法刷机,暂时先没用着
可能就是楼上说的情况&
我的恩山、我的无线
The best wifi forum is right here.
接口速率的问题, 我试过了,接上端百兆口,5G 只能跑80M, 我接千兆口,跑满我峰值120M
那感觉还是固件问题?毕竟我其他路由器接上端的百兆口没问题。。
我的恩山、我的无线
The best wifi forum is right here.
我做主路由,试了一次,手机speedtest跑满了,没法刷机,暂时先没用着
可能就是楼上说的情况
我的恩山、我的无线
The best wifi forum is right here.
50M联通 ac9 5g 跑到75 。k2p 5g 50 不知道是否个例
我的恩山、我的无线
The best wifi forum is right here.
有人说是5G的设置问题,好像默认是b/g
我的恩山、我的无线
The best wifi forum is right here.
目前不差路由用,K2P激活了就放着吃灰了。
我的恩山、我的无线
The best wifi forum is right here.
2.4g跑13.5m,5g -80-11ac跑16.2m
我的恩山、我的无线
The best wifi forum is right here.
我这边完全正常,5G 做AP和路由都跑满200光纤,苹果,安卓,笔记本都测了一遍,有线端口也全部在千M
看描述的速率,应该是端口局限在百M了,极路由,线路,K2P都有可能嘛
具体原因不清楚,但是换其他路由没问题的&
我的恩山、我的无线
The best wifi forum is right here.
我这边完全正常,5G 做AP和路由都跑满200光纤,苹果,安卓,笔记本都测了一遍,有线端口也全部在千M
看描述的速 ...
具体原因不清楚,但是换其他路由没问题的
我的恩山、我的无线
The best wifi forum is right here.
应该不是个案,无线情况下我20M也是跑不满,接有线就可以。
我的恩山、我的无线
The best wifi forum is right here.
Powered by您的位置:
购买理由 去年就听说了京东上的免费路由器K2一直不敢入手,直到在什么值得买上看到了值友们的分享,才决定入手...
去年就听说了京东上的免费路由器K2一直不敢入手,直到在什么值得买上看到了值友们的分享,才决定入手,但又觉的K2是去年的款,想买一个新款的路由器,K3一直没货,6月一号又发布了新款路由器K2P 京东直达链接这款是K2的升级版,但是价格却翻了一倍!反正是免费的,会返钱的 就入手了!六月一号零点不睡觉抢到的,还送个U盘,但是U盘的做工就差了很多,反正是送的,也无所谓了!
外观展示 还是以前K2的老包装盒,但写着是K2P,我想这个P的意思 应该是Plus的意思了!正面背面
背面是产品的规格 和制造商:上海斐讯数据通信技术有限公司 真面目
图片拍摄的由于灯光的问题显示的是银白色的 实际上是看起来是深灰色的,也挺好看的! 全家福
一台路由器、说明书、电源器、联壁金融小卡片背面
路由器背面有很多的散热孔,更利于路由器散热,来保证路由器的性能!正面细节图
4根天线,与上一代K2相比较增加了金属外壳,更佳浅薄
买过K2的值友们,应该能看的出来 新款的路由器更佳的浅薄,外加金属外壳,颜值有了很大的提升! 后背
这款路由器后面的5个接口竟然都是千兆的接口,厉害了我的哥 斐讯k2p的电源器 输出12V 2A 与上一代相比更规则一些吧! 线也变粗了,看来斐讯花成本了!
使用感受 这款千兆级的路由器采用的是802.11AC协议,2.4GZ和5GZ两个频段同时收发,很多人都不知道2.4GZ和5GZ是什么意思!下面我来简单普及一下:目前我们使用的无线网络发展到现在有各种不同的协议,以往我们经常使用的WIFI大多数都是支持IEEE 802.11n(第四代)不限标准的而且工作在2.4GHz这个频段上的称之为2.4G WIFI,2.4G和5G说白了其实就是两种不同协议下的工作频率,理论上来说5G的下载速度大于2.4G,带来的网速更快体验更好,但是5G的最大缺点是穿墙能力比较弱,一面墙是没问题的,二面墙信号就弱了,2.4G在穿墙能力上明显大于5G,但是2.4GHz却是一个使用比较多的频段,常用的家用电器如微波炉、蓝牙等都是用的2.4G,小区里面每家都有路由器,所以存在一定的干扰情况,导致信号差或者断线等情况比较普遍,这是大家都比较讨厌的!而5G的就不会出现这种情况!非常不幸的,我的卧室离路由器比较远,有二个墙的距离吧!连2.4G信号满格,连5G的信号只有二格,但是体验下来5G的网速更好,没掉过线,没卡过! 家里装的是联通50M的光纤,实际测速7.8MB/S,其实家里的路由器特别多,有小米路由器3,和二个杂牌的 腾达路由器,都是非常不满意的,到我的卧室总是信号不好 卡 掉线。
本来是准备入手一款斐讯K3试试,但又担心功率大,辐射强,对家里的人身体不好,从而放弃选择!而这款斐讯k2p,恰好满足我的需求!其实我们消费者要求不高,能满足我们的需求,不坑我们就好!优点:金属外壳、浅薄机身、强大的双频同时收发、千兆接口、0元免费的价格!缺点:价格太贵,虽然都会返给你,但是799元入门价还是太高,分3个月返,时间太长!
扫描关注沙发管家微信
“扫一扫”微信登录Android逆向之旅
我的图书馆
Android逆向之旅
Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)
&& 来源:jiangwei的专栏&&
一、前言今天我们继续来看破解apk的相关知识,在前一篇:我们今天主要来看如何使用IDA来调试Android中的native源码,因为现在一些app,为了安全或者效率问题,会把一些重要的功能放到native层,那么这样一来,我们前篇说到的Eclipse调试smali源码就显得很无力了,因为核心的都在native层,Android中一般native层使用的是so库文件,所以我们这篇就来介绍如何调试so文件的内容,从而让我们破解成功率达到更高的一层。二、知识准备我们在介绍如何调试so文件的时候,先来看一下准备知识:第一、IDA工具的使用早在之前的一篇文章:中使用IDA工具静态分析so文件,通过分析arm指令,来获取破解信息,比如打印的log信息,来破解apk的,在那时候我们就已经介绍了如何使用IDA工具:这里有多个窗口,也有多个视图,用到最多的就是:1、Function Window对应的so函数区域:这里我们可以使用ctrl+f进行函数的搜索2、IDA View对应的so中代码指令视图:这里我们可以查看具体函数对应的arm指令代码3、Hex View对应的so的十六进制数据视图:我们可以查看arm指令对应的数据等当然在IDA中我们还需要知道一些常用的快捷键:1、强大的F5快捷键可以将arm指令转化成可读的C语言,帮助分析首先选中需要翻译成C语言的函数,然后按下F5:看到了,立马感觉清爽多了,这些代码看起来应该会好点了。下面我们还需要做一步,就是还原JNI函数方法名一般JNI函数方法名首先是一个指针加上一个数字,比如v3+676。然后将这个地址作为一个方法指针进行方法调用,并且第一个参数就是指针自己,比如(v3+676)(v3…)。这实际上就是我们在JNI里经常用到的JNIEnv方法。因为Ida并不会自动的对这些方法进行识别,所以当我们对so文件进行调试的时候经常会见到却搞不清楚这个函数究竟在干什么,因为这个函数实在是太抽象了。解决方法非常简单,只需要对JNIEnv指针做一个类型转换即可。比如说上面提到a1和v4指针:我们可以选中a1变量,然后按一下y键:然后将类型声明为:JNIEnv*。确定之后再来看:修改之后,是不是瞬间清晰了很多?另外有人( 貌似是看雪论坛上的)还总结了所有JNIEnv方法对应的数字,地址以及方法声明:2、Shirt+F12快捷键,速度打开so中所有的字符串内容窗口有时候,字符串是一个非常重要的信息,特别是对于破解的时候,可能就是密码,或者是密码库信息。3、Ctrl+S快捷键,有两个用途,在正常打开so文件的IDA View视图的时候,可以查看so对应的Segement信息可以快速得到,一个段的开始位置和结束位置,不过这个位置是相对位置,不是so映射到内存之后的位置,关于so中的段信息,不了解的同学可以参看这篇文章:这篇文章介绍的很很清楚了,这里就不在作介绍了。当在调试页面的时候,ctrl+s可以快速定位到我们想要调试的so文件映射到内存的地址:因为一般一个程序,肯定会包含多个so文件的,比如系统的so就有好多的,一般都是在/system/lib下面,当然也有我们自己的so,这里我们看到这里的开始位置和结束位置就是这个so文件映射到内存中:这里我们可以使用cat命令查看一个进程的内存映射信息:cat /proc/[pid]/maps我们看到映射信息中有多so文件,其实这个不是多个so文件,而是so文件中对应的不同Segement信息被映射到内存中的,一般是代码段,数据段等,因为我们需要调试代码,所以我们只关心代码段,代码段有一个特点就是具有执行权限x,所以我们只需要找到权限中有x的那段数据即可。4、G快捷键:在IDA调试页面的时候,我们可以使用S键快速跳转到指定的内存位置这里的跳转地址,是可以算出来的,比如我现在想跳转到A函数,然后下断点,那么我们可以使用上面说到的ctrl+s查找到so文件的内存开始的基地址,然后再用IDA View中查看A函数对应的相对地址,相加就是绝对地址,然后跳转到即可,比如这里的:Java_cn_wjdiankong_encryptdemo_MainActivity_isEquals 函数的IDA View中的相对地址(也就是so文件的地址):E9C上面看到so文件映射到内存的基地址:74FE4000那么跳转地址就是:74FEFE4E9C注意:一般这里的基地址只要程序没有退出,在运行中,那么他的值就不会变,因为程序的数据已经加载到内存中了,基地址不会变的,除非程序退出,又重新运行把数据加载内存中了,同时相对地址是永远不会变的,只有在修改so文件的时候,文件的大小改变了,可能相对地址会改变,其他情况下不会改变,相对地址就是数据在整个so文件中的位置。这里我们可以看到函数映射到内存中的绝对地址了。注意:有时候我们发现跳转到指定位置之后,看到的全是DCB数据,这时候我们选择函数地址,点击P键就可以看到arm指令源码了:5、调试快捷键:F8单步调试,F7单步进入调试上面找到函数地址之后,我们可以下断点了,下断点很简单,点击签名的绿色圈点,变成红色条目即可,然后我们可以点击F9快捷键,或者是点击运行按钮,即可运行程序:其中还有暂停和结束按钮。我们运行之后,然后在点击so的native函数,触发断点逻辑:这时候,我们看到进入调试界面,点击F8可以单步调试,看到有一个PC指示器,其实在arm中PC是一个特殊的寄存器,用来存储当前指令的地址,这个下面会介绍到。好了到这里,我们就大致说了一下关于IDA在调试so文件的时候,需要用到的快捷键:1、Shift+F12快速查看so文件中包含的字符串信息2、F5快捷键可以将arm指令转化成可读的C代码,这里同时可以使用Y键,修改JNIEnv的函数方法名3、Ctrl+S有两个用途,在IDA View页面中可以查看so文件的所有段信息,在调试页面可以查看程序所有so文件映射到内存的基地址4、G键可以在调试界面,快速跳转到指定的绝对地址,进行下断点调试,这里如果跳转到目的地址之后,发现是DCB数据的话,可以在使用P键,进行转化即可,关于DCB数据,下面会介绍的。5、F7键可以单步进入调试,F8键可以单步调试第二、常用的ARM指令集知识我们在上面看到IDA打开so之后,看到的是纯种的汇编指令代码,所以这就要求我们必须会看懂汇编代码,就类似于我们在调试Java层代码的时候一样,必须会smali语法,庆幸的是,这两种语法都不是很复杂,所以我们知道一些大体的语法和指令就可以了,下面我们来看看arm指令中的寻址方式,寄存器,常用指令,看完这三个知识点,我们就会对arm指令有一个大体的了解,对于看arm指令代码也是有一个大体的认知了。1、arm指令中的寻址方式1&. 立即数寻址也叫立即寻址,是一种特殊的寻址方式,操作数本身包含在指令中,只要取出指令也就取到了操作数。这个操作数叫做立即数,对应的寻址方式叫做立即寻址。例如:MOV R0,#64 ;R0 ← 642&. 寄存器寻址寄存器寻址就是利用寄存器中的数值作为操作数,也称为寄存器直接寻址。例如:ADD R0,R1, R2 ;R0 ← R1 + R23&. 寄存器间接寻址寄存器间接寻址就是把寄存器中的值作为地址,再通过这个地址去取得操作数,操作数本身存放在存储器中。例如:LDR R0,[R1] ;R0 ←[R1]4&. 寄存器偏移寻址这是ARM指令集特有的寻址方式,它是在寄存器寻址得到操作数后再进行移位操作,得到最终的操作数。例如:MOV R0,R2,LSL #3 ;R0 ← R2 * 8 ,R2的值左移3位,结果赋给R0。5&. 寄存器基址变址寻址寄存器基址变址寻址又称为基址变址寻址,它是在寄存器间接寻址的基础上扩展来的。它将寄存器(该寄存器一般称作基址寄存器)中的值与指令中给出的地址偏移量相加,从而得到一个地址,通过这个地址取得操作数。例如:LDR R0,[R1,#4] ;R0 ←[R1 + 4],将R1的内容加上4形成操作数的地址,取得的操作数存入寄存器R0中。6&. 多寄存器寻址这种寻址方式可以一次完成多个寄存器值的传送。例如:LDMIA R0,{R1,R2,R3,R4} ;R1←[R0],R2←[R0+4],R3←[R0+8],R4←[R0+12]7&. 堆栈寻址堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用堆栈指针(Stack Pointer, SP)指示当前的操作位置,堆栈指针总是指向栈顶。堆栈寻址举例如下:STMFD SP!,{R1-R7, LR} ;将R1-R7, LR压入堆栈。满递减堆栈。LDMED SP!,{R1-R7, LR} ;将堆栈中的数据取回到R1-R7, LR寄存器。空递减堆栈。2、ARM中的寄存器R0-R3:用于函数参数及返回值的传递R4-R6, R8, R10-R11:没有特殊规定,就是普通的通用寄存器R7:栈帧指针(Frame Pointer).指向前一个保存的栈帧(stack frame)和链接寄存器(link register, lr)在栈上的地址。R9:操作系统保留R12:又叫IP(intra-procedure scratch )R13:又叫SP(stack pointer),是栈顶指针R14:又叫LR(link register),存放函数的返回地址。R15:又叫PC(program counter),指向当前指令地址。3、ARM中的常用指令含义ADD 加指令SUB 减指令STR 把寄存器内容存到栈上去LDR 把栈上内容载入一寄存器中.W 是一个可选的指令宽度说明符。它不会影响为此指令的行为,它只是确保生成 32 位指令。Infocenter.arm.com的详细信息BL 执行函数调用,并把使lr指向调用者(caller)的下一条指令,即函数的返回地址BLX 同上,但是在ARM和thumb指令集间切换。CMP 指令进行比较两个操作数的大小4、ARM指令简单代码段分析C代码:#include int func(int a, int b, int c, int d, int e, int f){ int g = a + b + c + d + e +}对应的ARM指令:add r0, r1 将参数a和参数b相加再把结果赋值给r0ldr.w r12, [sp] 把最的一个参数f从栈上装载到r12寄存器add r0, r2 把参数c累加到r0上ldr.w r9, [sp, #4] 把参数e从栈上装载到r9寄存器add r0, r3 累加d累加到r0add r0, r12 累加参数f到r0add r0, r9 累加参数e到r0三、构造so案例好了,关于ARM指令的相关知识,就介绍这么多了,不过我们在调试分析的时候,肯定不能做到全部的了解,因为本身ARM指令语法就比较复杂,不过幸好大学学习了汇编语言,所以稍微能看懂点,如果不懂汇编的同学那就可能需要补习一下了,因为我们在使用IDA分析so文件的时候,不会汇编的话,那是肯定行不通的,所以我们必须要看懂汇编代码的,如果遇到特殊指令不了解的同学,可以网上搜一下即可。上面我们的准备知识做完了,一个是IDA工具的时候,一个是ARM指令的了解,下面我们就来开始操刀了,为了方便开始,我们先自己写一个简单的Android native层代码,然后进行IDA进行分析即可。这里可以使用AndroidStudio中进行新建一个简单工程,然后创建JNI即可:这里顺便简单说一下AndroidStudio中如何进行NDK的开发吧:第一步:在工程中新建jni目录第二步:使用javah生成native的头文件注意:javah执行的目录,必须是类包名路径的最上层,然后执行:javah 类全名注意没有后缀名java哦第三步:配置项目的NDK目录选择模块的设置选线:Open Module Settings:设置NDK目录即可第四步:copy头文件到jni目录下,然后配置gradle中的ndk选项这里只需要设置编译之后的模块名,就是so文件的名称,需要产生那几个平台下的so文件,还有就是需要用到的lib库,这里我们看到我们用到了Android中打印log的库文件。第五步:编译运行,在build目录下生成指定的so文件,copy到工程的libs目录下即可好了,到这里我们就快速的在AndroidStudio中新建了一个Native项目,这里关于native项目的代码不想解释太多,就是Java层传递了用户输入的密码,然后native做了校验过程,把校验结果返回到Java层即可:具体的校验过程这里不再解释了。我们运行项目之后,得到apk文件,那么下面我们就开始我们的破解旅程了四、开始破解so文件开始破解我们编译之后的apk文件第一、首先我们可以使用最简单的压缩软件,打开apk文件,然后解压出他的so文件我们得到libencrypt.so文件之后,使用IDA打开它:我们知道一般so中的函数方法名都是:Java_类名_方法名那么这里我们直接搜:Java关键字即可,或者使用jd-gui工具找到指定的native方法双击,即可在右边的IDA View页面中看到Java_cn_wjdiankong_encryptdemo_MainActivity_isEquals 函数的指令代码:我们可以简单的分析一下这段指令代码:1&、PUSH {r3-r7,lr} 是保存r3,r4,r5,r6,r7,lr 的值到内存的栈中,那么最后当执行完某操作后,你想返回到lr指向的地方执行,当然要给pc了,因为pc保留下一条CPU即将执行的指令,只有给了pc,下一条指令才会执行到lr指向的地方pc:程序寄存器,保留下一条CPU即将执行的指令lr: 连接返回寄存器,保留函数返回后,下一条应执行的指令这个和函数最后面的POP {r3-r7,pc}是相对应的。2&、然后是调用了strlen,malloc,strcpy等系统函数,在每次使用BLX和BL指令调用这些函数的时候,我们都发现了一个规律:就是在调用他们之前一般都是由MOV指令,用来传递参数值的,比如这里的R5里面存储的就是strlen函数的参数,R0就是is_number函数的参数,所以我们这样分析之后,在后面的动态调试的过程中可以得到函数的入口参数值,这样就能得到一些重要信息3&、在每次调用有返回值的函数之后的命令,一般都是比较指令,比如CMP,CBZ,或者是strcmp等,这里是我们破解的突破点,因为一般加密再怎么牛逼,最后比较的参数肯定是正确的密码(或者是正确的加密之后的密码)和我们输入的密码(或者是加密之后的输入密码),我们在这里就可以得到正确密码,或者是加密之后的密码:到这里,我们就分析完了native层的密码比较函数:Java_cn_wjdiankong_encryptdemo_MainActivity_isEquals如果觉得上面的ARM指令看的吃力,可以使用F5键,查看他的C语言代码:我们这里看到其实有两个函数是核心点:1&is_number函数,这个函数我们看名字应该猜到是判断是不是数字,我们可以使用F5键,查看他对应的C语言代码:这里简单一看,主要是看return语句和if判断语句,看到这里有一个循环,然后获取_BYTE*这里地址的值,并且自增加一,然后存到v2中,如果v3为"\0'的话,就结束循环,然后做一次判断,就是v2-48是否大于9,那么这里我们知道48对应的是ASCII中的数字0,所以这里可以确定的是就是:用一个循环遍历_BYTE*这里存的字符串是否为数字串。2&get_encrypt_str函数,这个函数我们看到名字可以猜测,他是获取我们输入的密码加密之后的值,再次使用F5快捷键查看:这里我们看到,首先是一个if语句,用来判断传递的参数是否为NULL,如果是的话,直接返回,不是的话,使用strlen函数获取字符串的长度保存到v2中,然后使用malloc申请一块堆内存,首指针保存到result,大小是v2+1也就是传递进来的字符串长度+1,然后就开始进入循环,首指针result,赋值给i指针,开始循环,v3是通过v1-1获取到的,就是函数传递进来字符串的地址,那么v6就是获取传递进来字符串的字符值,然后减去48,赋值给v7,这里我们可以猜到了,这里想做字符转化,把char转化成int类型,继续往下看,如果v6==48的话,v7=1,也就是说这里如果遇到字符"0',就赋值1,在往下看,看到我们上面得到的v7值,被用来取key_src数组中的值,那么这里我们双击key_src变量,就跳转到了他的值地方,果不其然,这里保存了一个字符数组,看到他的长度正好是18,那么这里我们应该明白了,这里通过传递进来的字符串,循环遍历字符串,获取字符,然后转化成数字,在倒序获取key_src中的字符,保存到result中。然后返回。好了,到这里我们就分析完了这两个重要的函数的功能,一个是判断输入的内容是否为数字字符串,一个是通过输入的内容获取密码内容,然后和正确的加密密码:ssBCqpBssP 作比较。第二、开始使用IDA进行调试设置那么下面我们就用动态调试来跟踪传入的字符串值,和加密之后的值,这里我们看到没有打印log的函数,所以很难知道具体的参数和寄存器的值,所以这里需要开始调试,得知每个函数执行之后的寄存器的值,我们在用IDA进行调试so的时候,需要以下准备步骤:1、在IDA安装目录下获取android_server命令文件在IDA安装目录\dbgsrv\android_server,这个文件是干嘛的呢?他怎么运行呢?下面来介绍一下:我们是否还记得之前一篇文章: 这篇文章中我们介绍了Android中的调试原理,其实是使用gdb和gdbserver来做到的,gdb和gdbserver在调试的时候,必须注入到被调试的程序进程中,但是非root设备的话,注入别的进程中只能借助于run-as这个命令了,所以我们知道,如果要调试一个应用进程的话,必须要注入他内部,那么IDA调试so也是这个原理,他需要注入(Attach附加)进程,才能进行调试,但是IDA没有自己弄了一个类似于gdbserver这样的工具,那就是android_server了,所以他需要运行在设备中,保证和PC端的IDA进行通信,比如获取设备的进程信息,具体进程的so内存地址,调试信息等。所以我们把android_server保存到设备的/data目录下,修改一下他的运行权限,然后必须在root环境下运行,因为他要做注入进程操作,必须要root。注意:这里把他放在了/data目录下,然后./android_server运行,这里提示了IDA Android 32-bit,所以后面我们在打开IDA的时候一定要是32位的IDA,不是64位的,不然保存,IDA在安装之后都是有两个可执行的程序,一个是32位,一个是64位的,如果没打开正确会报这样的错误:同样还有一类问题:error: only position independent executables (PIE) are supported这个主要是Android5.0以上的编译选项默认开启了pie,在5.0以下编译的原生应用不能运行,有两种解决办法,一种是用Android5.0以下的手机进行操作,还有一种就是用IDA6.6+版本即可。然后我们再看,这里开始监听了设备的23946端口,那么如果要想让IDA和这个android_server进行通信,那么必须让PC端的IDA也连上这个端口,那么这时候就需要借助于adb的一个命令了:adb forward tcp:远端设备端口号(进行调试程序端) tcp:本地设备端口(被调试程序端)那么这里,我们就可以把android_server端口转发出去:然后这时候,我们只要在PC端使用IDA连接上23946这个端口就可以了,这里面有人好奇了,为什么远程端的端口号也是23946,因为后面我们在使用IDA进行连接的时候,发现IDA他把这个端口设置死了,就是23946,所以我们没办法自定义这个端口了。我们可以使用netstat命令查看端口23946的使用情况,看到是ida在使用这个端口2、上面就准备好了android_server,运行成功,下面就来用IDA进行尝试连接,获取信息,进行进程附加注入我们这时候需要在打开一个IDA,之前打开一个IDA是用来分析so文件的,一般用于静态分析,我们要调试so的话,需要在打开一个IDA来进行,所以这里一般都是需要打开两个IDA,也叫作双开IDA操作。动静结合策略。这里记得选择go这个选项,就是不需要打开so文件了,进入是一个空白页:我们选择Debugger选项,选择Attach,看到有很多debugger,所以说IDA工具真的很强大,做到很多debugger的兼容,可以调试很多平台下的程序。这里我们选择Android debugger:这里看到,端口是写死的:23946,不能进行修改,所以上面的adb forward进行端口转发的时候必须是23946。这里PC本地机就是调试端,所以host就是本机的ip地址:127.0.0.1,点击确定:这里可以看到设备中所有的进程信息就列举出来的,其实都是android_server干的事,获取设备进程信息传递给IDA进行展示。注意:如果我们当初没有用root身份去运行android_server:这里就会IDA是不会列举出设备的进程信息:还有一个注意的地方,就是IDA和android_server一定要保持一致。我们这里可以ctrl+F搜索我们需要调试的进程,当然这里我们必须运行起来我们需要调试的进程,不然也是找不到这个进程的双击进程,即可进入调试页面:这里为什么会断在libc.so中呢?android系统中libc是c层中最基本的函数库,libc中封装了io、文件、socket等基本系统调用。所有上层的调用都需要经过libc封装层。所以libc.so是最基本的,所以会断在这里,而且我们还需要知道一些常用的系统so,比如linker:我们知道,这个linker是用于加载so文件的模块,所以后面我们在分析如何在.init_array处下断点还有一个就是libdvm.so文件,他包含了DVM中所有的底层加载dex的一些方法:我们在后面动态调试需要dump出加密之后的dex文件,就需要调试这个so文件了。3、找到函数地址,下断点,开始调试我们使用Ctrl+S找到需要调试so的基地址:74FE4000然后通过另外一个IDA打开so文件,查看函数的相对地址:E9C那么得到了函数的绝对地址就是:74FE4E9C,使用G键快速跳转到这个绝对地址:跳转到指定地址之后,开始下断点,点击最左边的绿色圆点即可下断点:然后点击左上角的绿色按钮,运行,也可以使用F9键运行程序:我们点击程序中的按钮:触发native函数的运行:看到了,进入调试阶段了,这时候,我们可以使用F8进行单步调试,F7进行单步进入调试:我们点击F8进行单步调试,达到is_number函数调用出,看到R0是出入的参数值,我们可以查看R0寄存器的内容,然后看到是123456,这个就是Java层传入的密码字符串,接着往下走:这里把is_number函数返回值保存到R0寄存中,然后调用CBZ指令,判断是否为0,如果为0就跳转到locret_74FE4EEC处,查看R0寄存器的值不是0,继续往下走:看到了get_encrypt_str函数的调用,函数的返回值保存在R1寄存器中,查看内容:zytyrTRA*B了,那么看到,上层传递的:123456=》zytyrTRA*B了,前面我们静态分析了get_encrypt_str函数的逻辑,继续往下看:看到了,这里把上面得到的字符串和ssBCqpBssP作比较,那么这里ssBCqpBssP就是正确的加密密码了,那么我们现在的资源是:正确的加密密码:ssBCqpBssP,加密密钥库:zytyrTRA*BniqCPpVs,加密逻辑get_encrypt_str那么我们可以写一个逆向的加密方法,去解析正确的加密密码得到值即可,这里为了给大家一个破解的机会,这里就不公布正确答案了,这个apk我随后会上传,手痒的同学可以尝试破解一下。加密apk下载地址:第三、总结IDA调试的流程到这里,我们就分析了如何破解apk的流程,下面来总结一下:1、我们通过解压apk文件,得到对应的so文件,然后使用IDA工具打开so,找到指定的native层函数2、通过IDA中的一些快捷键:F5,Ctrl+S,Y等键来静态分析函数的arm指令,大致了解函数的执行流程3、再次打开一个IDA来进行调试so1&将IDA目录中的android_server拷贝到设备的指定目录下,修改android_server的运行权限,用Root身份运行android_server2&使用adb forward进行端口转发,让远程调试端IDA可以连接到被调试端3&使用IDA连接上转发的端口,查看设备的所有进程,找到我们需要调试的进程。4&通过打开so文件,找到需要调试的函数的相对地址,然后在调试页面使用Ctrl+S找到so文件的基地址,相加之后得到绝对地址,使用G键,跳转到函数的地址处,下好断点。点击运行或者F9键。5&触发native层的函数,使用F8和F7进行单步调试,查看关键的寄存器中的值,比如函数的参数,和函数的返回值等信息总结就是:在调试so的时候,需要双开IDA,动静结合分析。五、使用IDA来解决反调试问题那么到这里我们就结束了我们这期的破解旅程了?答案是否定的,因为我们看到上面的例子其实是我自己先写了一个apk,目的就是为了给大家演示,如何使用IDA来进行动态调试so,那么下面我们还有一个操刀动手的案例,就是2014年,阿里安全挑战赛的第二题:AliCrackme_2:阿里真会制造氛围,还记得我们破解的第一题吗,这次看到了第二题,好吧,下面来看看破解流程吧:首先使用aapt命令查看他的AndroidManifest.xml文件,得到入口的Activity类:然后使用dex2jar和jd-gui查看他的源码类:com.yaotong.crackme.MainActivity:看到,他的判断,是securityCheck方法,是一个native层的,所以这时候我们去解压apk文件,获取他的so文件,使用IDA打开查看native函数的相对地址:11A8这里的ARM指令代码不在分析了,大家自行查看即可,我们直接进入调试即可:在打开一个IDA进行关联调试:选择对应的调试进程,然后确定:使用Ctrl+S键找到对应so文件的基地址:74EA9000和上面得到的相对地址相加得到绝对地址:74EA=74EAA1A8 使用G键直接跳到这个地址:下个断点,然后点击F9运行程序:擦,IDA退出调试页面了,我们再次进入调试页面,运行,还是退出调试页面了,好了,这下蛋疼了,没法调试了。这里其实是阿里做了反调试侦查,如果发现自己的程序被调试了,就直接退出程序,那么这里有问题了,为什么知道是反调试呢?这个主要还是看后续自己的破解经验了,没技术可言,还有一个就是阿里如何做到的反调试策略的,这里限于篇幅,只是简单介绍一下原理:前面说到,IDA是使用android_server在root环境下注入到被调试的进程中,那么这里用到一个技术就是Linux中的ptrace,关于这个这里也不解释了,大家可以自行的去搜一下ptrace的相关知识,那么Android中如果一个进程被另外一个进程ptrace了之后,在他的status文件中有一个字段:TracerPid 可以标识是被哪个进程trace了,我们可以使用命令查看我们的被调试的进行信息:status文件在:/proc/[pid]/status看到了,这里的进程被9187进程trace了,我们在用ps命令看看9187是哪个进程:果不其然,是我们的android_server进程,好了,我们知道原理了,也大致猜到了阿里在底层做了一个循环检测这个字段如果不为0,那么代表自己进程在被人trace,那么就直接停止退出程序,这个反检测技术用在很多安全防护的地方,也算是一个重要的知识点了。那么下面就来看看如何应对这个反调试?我们刚刚看到,只要一运行程序,就退出了调试界面,说明,这个循环检测程序执行的时机非常早,那么我们现在知道的最早的两个时机是:一个是.init_array,一个是JNI_OnLoad.init_array是一个so最先加载的一个段信息,时机最早,现在一般so解密操作都是在这里做的JNI_OnLoad是so被System.loadLibrary调用的时候执行,他的时机要早于哪些native方法执行,但是没有.init_array时机早那么知道了这两个时机,下面我们先来看看是不是在JNI_OnLoad函数中做的策略,所以我们需要先动态调试JNI_OnLoad函数我们既然知道了JNI_OnLoad函数的时机,如果阿里把检测函数放在这里的话,我们不能用之前的方式去调试了,因为之前的那种方式时机太晚了,只要运行就已经执行了JNI_OnLoad函数,所以就会退出调试页面,幸好这里IDA提供了在so文件load的时机,我们只需要在Debug Option中设置一下就可以了:在调试页面的Debugger 选择 Debugger Option选项:然后勾选Suspend on library load/unload即可这样设置之后,还是不行,因为我们程序已经开始运行,就在static代码块中加载so文件了,static的时机非常早,所以这时候,我们需要让程序停在加载so文件之前即可。那么我想到的就是添加代码waitForDebugger代码了,这个方法就是等待debug,我们还记得在之前的调试smali代码的时候,就是用这种方式让程序停在了启动出,然后等待我们去用jdb进行attach操作。那么这一次我们可以在System.loadLibrary方法之前加入waitForDebugger代码即可,但是这里我们不这么干了,还有一种更简单的方式就是用am命令,本身am命令可以启动一个程序,当然可以用debug方式启动:adb shell am start -D -n com.yaotong.crackme/.MainActivity这里一个重要参数就是-D,用debug方式启动运行完之后,设备是出于一个等待Debugger的状态:这时候,我们再次使用IDA进行进程的附加,然后进入调试页面,同时设置一下Debugger Option选项,然后定位到JNI_OnLoad函数的绝对地址。但是我们发现,这里没有RX权限的so文件,说明so文件没有加载到内存中,想一想还是对的,以为我们现在的程序是wait Debugger,也就是还没有走System.loadLibrary方法,so文件当然没有加载到内存中,所以我们需要让我们程序跑起来,这时候我们可以使用jdb命令去attach等待的程序,命令如下:jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700其实这条命令的功能类似于,我们前一篇说到用Eclipse调试smali源码的时候,在Eclipse中设置远程调试工程一样,选择Attach方式,调试机的ip地址和端口,还记得8700端口是默认的端口,但是我们运行这个命令之后,出现了一个错误:擦,无法连接到目标的VM,那么这种问题大部分都出现在被调试程序不可调试,我们可以查看apk的android:debuggable属性:果不其然,这里没有debug属性,所以这个apk是不可以调试的,所以我们需要添加这个属性,然后在回编译即可:回编译:java -jar apktool.jar b -d out -o debug.apk签名apk:java -jar .\sign\signapk.jar .\sign\testkey.x509.pem .\sign\testkey.pk8 debug.apk debug.sig.apk然后在次安装,使用am 命令启动:第一步:运行:adb shell am start -D -n com.yaotong.crackme/.MainActivity出现Debugger的等待状态第二步:启动IDA 进行目标进程的Attach操作第三步:运行:jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700第三步:设置Debugger Option选项第四步:点击IDA运行按钮,或者F9快捷键,运行看到了,这次jdb成功的attach住了,debug消失,正常运行了,但是同时弹出了一个选择提示:这时候,不用管它,全部选择取消按钮,然后就运行到了linker模块了:这时候,说明so已经加载进来了,我们再去获取JNI_OnLoad函数的绝对地址Ctrl+S查找到了基地址:用静态方式IDA打开so查看相对地址:1B9C相加得到绝对地址:B9C=7515BB9C,然后点击S键,跳转:跳转到指定的函数位置:这时候再次点击运行,进入了JNI_OnLoad处的断点:下面咋们就开始单步调试了,但是当我们每次到达BLX R7这条指令执行完之后,就JNI_OnLoad就退出了:经过好几次尝试都是一样的结果,所以我们发现这个地方有问题,可能就是反调试的地方了我们再次进入调试,看见BLX跳转的地方R7寄存器中是pthread_create函数,这个是Linux中新建一个线程的方法所以阿里的反调试就在这里开启一个线程进行轮训操作,去读取/proc/[pid]/status文件中的TrackerPid字段值,如果发现不为0,就表示有人在调试本应用,在JNI_OnLoad中直接退出。其实这里可以再详细进入查看具体代码实现的,但是这里限于篇幅问题,不详细解释了,后续在写一篇文章我们自己可以实现这种反调试机制的。本文的重点是能够动态调试即可。那么问题找到了,我们现在怎么操作呢?其实很简单,我们只要把BLX R7这段指令干掉即可,如果是smali代码的话,我们可以直接删除这行代码即可,但是so文件不一样,他是汇编指令,如果直接删除这条指令的话,文件会发生错乱,因为本身so文件就有固定的格式,比如很多Segement的内容,每个Segement的偏移值也是有保存的,如果这样去删除会影响这些偏移值,会破坏so文件格式,导致so加载出错的,所以这里我们不能手动的去删除这条指令,我们还有另外一种方法,就是把这条指令变成空指令,在汇编语言中,nop指令就是一个空指令,他什么都不干,所以这里我们直接改一下指令即可,arm中对应的nop指令是:00 00 00 00那么我们看到BLX R7对应的指令位置为:1C58查看他的Hex内容是:37 FF 2F E1我们可以使用一些二进制文件软件进行内容的修改,这里使用010Editor工具进行修改:这里直接修改成00 00 00 00:这时候,保存修改之后的so文件,我们再次使用IDA进行打开查看:哈哈,指令被修改成了:ANDEQ R0,R0,R0了那么修改了之后,我们在替换原来的so文件,再次重新回编译,签名安装,再次按照之前的逻辑给主要的加密函数下断点,这里不需要在给JNI_OnLoad函数下断点了,因为我们已经修改了反调试功能了,所以这里我们只需要按照这么简单几步即可:第一步:启动程序第二步:使用IDA进行进程的attach第三步:找到Java_com_yaotong_crackme_MainActivity_securityCheck函数的绝对地址第四步:打上断点,点击运行,进行单步调试看到了吧,这里我们可以单步调试进来了啦啦,说明我们修改反调试指令成功了。下面就继续F8单步调试:调试到这里,发现一个问题,就是CMP指令之后,BNE 指令就开始跳转到loc_74FAF2D0处了,那么我们就可以猜到了,CMP指令比较的应该就是我们输入的密码和正确的密码,我们再次从新调试,看看R3和R1寄存器的值看到了这里的R3寄存器的值就是用寄存器寻址方式,赋值字符串的,这里R2寄存器就是存放字符串的地址,我们看到的内容是aiyou...但是这里肯定不是全部字符串,因为我们没看到字符串的结束符:"\0',我们点击R2寄存器,进入查看完整内容:这里是全部内容:aiyou,bucuoo我们继续查看R1寄存器的内容:这里也是同样用寄存器寻址,R0寄存器存储的是R1中字符串的地址,我们看到这里的字符串内容是:jiangwei这个就是我输入的内容,那么这里就可以豁然开朗了,密码是上面的:aiyou,bucuoo我们再次输入这个密码:哈哈哈,破解成功啦啦~~手痒的同学可以下载项目来玩玩~~项目下载:六、技术总结到这里我们算是讲解完了如何使用IDA来调试so代码,从而破解apk的知识了,因为这里IDA工具比较复杂,所以这篇文章篇幅有点长,所以同学们可以多看几遍,就差不多了。下面我们来整理一下这篇文章中涉及到的知识点吧:第一、IDA中的常用快捷键使用1、Shift+F12可以快速查看so中的常量字符串内容,有时候,字符串内容是一个很大的突破点2、使用强大的F5键,可以查看arm汇编指令对应的C语言代码,同时可以使用Y键,进行JNIEnv*方法的还原3、使用Ctrl+S键,可以在IDA View页面中查看so的所有段信息,在调试页面可以查找对应so文件映射到内存的基地址,这里我们还可以使用G键,进行地址的跳转4、使用F8进行单步调试,F7进行单步跳入调试,同时可以使用F9运行程序第二、ARM汇编指令相关知识1、了解了几种寻址方式,有利于我们简单的读懂arm汇编指令代码2、了解了arm中的几种寄存器的作用,特别是PC寄存器3、了解了arm中常用的指令,比如:MOV,ADD,SUB,LDR,STR,CMP,CBZ,BL,BLX第三、使用IDA进行调试so的步骤,这里分两种情况1、IDA调试无反调试的so代码步骤:1》把IDA安装目录中的android_server拷贝到设备的指定目录中,修改android_server的权限,并且用root方式运行起来,监听23946端口2》使用adb forward命令进行端口的转发,将设备被调试端的端口转发到远程调试端中3》双开IDA工具,一个是用来打开so文件,进行文件分析,比如简单分析arm指令代码,知道大体逻辑,还有就是找到具体函数的相对位置等信息,还有一个IDA是用来调试so文件的,我们在Debugger选项中设置Debugger Option,然后附加需要调试的进程4》进入调试页面之后,通过Ctrl+S和G快捷键,定位到需要调试的关键函数,进行下断点5》点击运行或者快捷键F9,触发程序的关键函数,然后进入断点,使用F8单步调试,F7单步跳入调试,在调试的过程中主要观察BL,BLX指令,以及CMP和CBZ等比较指令,然后在查看具体的寄存器的值。2、IDA调试有反调试的so代码步骤:1》查看apk是否为可调式状态,可以使用aapt命令查看他的AndroidManifest.xml文件中的android:debuggeable属性是否为true,如果不是debug状态,那么就需要手动的添加这个属性,然后回编译,在签名打包从新安装2》使用adb shell am start -D -n com.yaotong.crackme/.MainActivity 命令启动程序,出于wait Debug状态3》打开IDA,进行进程附加,进入到调试页面4》使用jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700 命令attach之前的debug状态,让程序正常运行5》设置Debug Option选项,设置Suspend on library start/exit/Suspend on library load/unload/Suspend on process entry point选项6》点击运行按钮或者F9键,程序运行停止在linker模块中,这时候表示so文件加载进来了,我们通过Ctrl+S和G键跳转到JNI_OnLoad函数出,进行下断点7》然后继续运行,进入JNI_OnLoad断点处,使用F8进行单步调试,F7进行单步跳入调试,找到反调试代码处8》然后使用二进制软件修改反调试代码为nop指令,即00值9》修改之后,在替换原来的so文件,进行回编译,从新签名打包安装即可10》按照上面的无反调试的so代码步骤即可第四、学习了如何做到反调试检测现在很多应用防止别的进程调试或者注入,通常会用自我检测装置,原理就是循环检测/proc/[mypid]/status文件,查看他的TracerPid字段是否为0,如果不为0,表示被其他进程trace了,那么这时候就直接退出程序。因为现在的IDA调试时需要进程的注入,进程注入现在都是使用Linux中的ptrace机制,那么这里的TracePid就可以记录trace的pid,我们可以发现我们的程序被那个进程注入了,或者是被他在调试。进而采取一些措施。第五、IDA调试的整体原理我们知道了上面的IDA调试步骤,其实我们可以仔细想一想,他的调试原理大致是这样的:首先他得在被调试端安放一个程序,用于IDA端和调试设备通信,这个程序就是android_server,因为要附加进程,所以这个程序必须要用root身份运行,这个程序起来之后,就会开启一个端口23946,我们在使用adb forward进行端口转发到远程调试端,这时候IDA就可以和调试端的android_server进行通信了。后面获取设备的进程列表,附加进程,传递调试信息,都可以使用这个通信机制完成即可。IDA可以获取被调试的进程的内存数据,一般是在 /proc/[pid]maps 文件中,所以我们在使用Ctrl+S可以查看所有的so文件的基地址,可以遍历maps文件即可做到。破解法则:时刻需要注意关键的BL/BLX等跳转指令,在他们执行完之后,肯定会有一些CMP/CBZ等比较指令,这时候就可以查看重要的寄存器内容来获取重要信息。七、总结总算是说完了IDA调试so了这个知识点,我们也知道了一种全新的方式去破解native层的代码,现在有些程序依然把关键代码放在了Java层,那么这里我们可以使用Eclipse调试samli即可破解,如果程序为了安全,可能还会把关键代码放到native层,那么这时候,我们可以使用IDA来调试so代码来破解,当然破解和加密总是相生相克的,现在程序为了安全做了加固策略,那么这也是我们下一篇文章需要介绍的,如何去破解那些加固的apk。更多内容:PS: 关注公众号,最新Android技术实时推送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}

我要回帖

更多关于 斐讯k2路由器端口映射 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信