html渗透提权进去怎么提权

posts - 826,&
comments - 7,&
trackbacks - 0
对新手来讲,一个Java工程内部的多个文件夹经常会让大家困惑。更可恶的是莫名其妙的路径问题,在Eclipse编写Java程序中,出现频率最高的错误很可能就是路径问题。
这些问题原因其实都是一个,就是关于Java工程内的文件结构理解不清,虽然我也不是老手,但有一些经验,拿来和大家分享:
eclipse的基本工程目录叫做workspace,每个运行时的eclipse实例只能对应一个workspace,也就是说,workspace是当前工作的根目录。我们在workspace中可以随意创建各种java相关的工程,普通的java应用,java web应用,web service应用等,我们仅拿普通的java application来说明。
通常我们创建一个java
application工程,会创建一个工程目录,假设工程名称为:TestProject,那么在当前的workspace里讲创建一个目录名为TestProject,同时我们选择src作为源码文件夹,bin作为输出路径,这样就构成了一个基本的java
application工程。,在workspace中存在如下文件夹:
+workspace
& +TestProject
这个时候我们创建的代码将写入src目录,输出的class文件将存在于bin目录。
(对于新手来说,区分src目录和bin目录很重要,通常情况下,src目录只存放源代码,而所有工程相关的其他输出文件都会存放在bin目录下,最为重
要的是:用Eclipse进行打包时根目录就是bin,用jar包调用工程的时候默认的路径也要以bin为准,到bin的层级数目就是最终的数目,因此可
以说bin是最为重要的目录,而不是src)
这时候我们在src目录下创建一个类,就叫做TestClass,里面有一个main方法如下:
public&static&void&main(String[]&args){
&&&&System.out.println(new&File("test.txt").exist());
同时在src目录下创建一个空的文件test.txt。什么都不要做,保存工程,打开资源管理器,我们来查看workspace/TestProject/bin目录,下面会存在两个文件:TestClass.class和test.txt。
此时我们设想,程序的内容就是检查test.txt文件是否存在,按照现在的目录规划,我们认为,在控制台上将打出&true&,ok,我们回到eclipse中,运行TestClass这个类。控制台输出了:false!
为什么我们得到了并非我们预期的结果呢?先别着急,我们打开windows的命令行界面(或者linux的shell都ok),将目录切换到workspace/TestProject/bin目录下,执行如下命令java
TestClass,看看出现什么结果?true!对,就是true。
为啥同样的程序会有不同的结果呢?这个答案很简单,就出在java.exe本身的一个参数-cp(classpath)上!
eclipse默认的classpath包括三个部分:
1、jdk的bin目录;
2、工程引用的所有其他jar包路径
3、工程根路径(对,不是bin路径)
那么我们就可以理解来,在classpath的根路径中并不存在这个test.txt文件,用相对路径描述,这个文件实际存在于src/test.txt
和bin/test.txt。也就是说,classpath默认的路径是workspace-testproject下,而不是workspace-
testproject-bin下,所以才找不到这个文件。这是经常出现的问题!
那么这个时候就有疑问了,如果我们打包发布工程,是不是jar包中会把testproject根目录作为包中的根目录呢?幸运的是,eclipse考虑好
了这个问题。通过eclipse的导出jar能力,bin目录会作为jar的根目录,而不是bin的上层的工程目录,这样类的包路径就是正确的,同时,工
程目录下的资源文件、配置文件等也被拷贝到这里,也就是相当于把工程目录下的这些文件拷贝到来bin目录后再打包,这样文件的相对路径也就符合默认的
classpath了。
从上面可以总结出来:Eclipse直接运行时,是以工程的根目录作为基准目录。而打包成jar运行时,则是以bin目录作为基准目录。这两者相差了一级目录,如果理解的不好,可能会导致错误。希望大家注意!
阅读(...) 评论()专注于IT技术,只做IT技术的分享与研究,欢迎广大IT技术人员参与分享与讨论!...
HTML————5、HTML 标题
在 HTML 文档中,标题很重要。
标题(Heading)是通过 &h1& - &h6& 标签进行定义的.
&h1& 定义最大的标题。 &h6& 定义最小的标题。
&h1&这是一个标题。&/h1&
&h2&这是一个标题。&/h2&
&h3&这是一个标题。&/h3&
注释: 浏览器会自动地在标题的前后添加空行。
标题很重要
请确保将 HTML 标题 标签只用于标题。不要仅仅是为了生成粗体或大号的文本而使用标题。
搜索引擎使用标题为您的网页的结构和内容编制索引。
因为用户可以通过标题来快速浏览您的网页,所以用标题来呈现文档结构是很重要的。
应该将 h1 用作主标题(最重要的),其后是 h2(次重要的),再其次是 h3,以此类推。
HTML 水平线
&hr& 标签在 HTML 页面中创建水平线。
hr 元素可用于分隔内容。
&p&这是一个段落。&/p&
&p&这是一个段落。&/p&
&p&这是一个段落。&/p&
可以将注释插入 HTML 代码中,这样可以提高其可读性,使代码更易被人理解。浏览器会忽略注释,也不会显示它们。
注释写法如下:
&!-- 这是一个注释 --&
注释: 开始括号之后(左边的括号)需要紧跟一个叹号,结束括号之前(右边的括号)不需要,合理地使用注释可以对未来的代码编辑工作产生帮助。。
HTML 提示 - 如何查看源代码
你是否看过一些网页然后惊叹它是如何实现的的。
如果您想找到其中的奥秘,只需要单击右键,然后选择"查看源文件"(IE)或"查看页面源代码"(Firefox),其他浏览器的做法也是类似的。这么做会打开一个包含页面 HTML 代码的窗口。
HTML 标签参考手册
菜鸟教程的标签参考手册提供了有关这些标题及其属性的更多信息。
您将在本教程下面的章节中学到更多有关 HTML 标签和属性的知识。
定义 HTML 文档
定义文档的主体
定义 HTML 标题
定义水平线
扫码向博主提问
非学,无以致疑;非问,无以广识
擅长领域:
没有更多推荐了,&p&看了那么多答案,我想说,你们不要误人子弟。请相信我的回答。为了增加自己的说服力,必须亮一下自己的经历了。&br&清华大学硕士毕业,在北京写过两年Java,在杭州写过三年Python,深入定制过Python虚拟机,现在从事arm上的javascript虚机机的开发。虽然仍然不是什么牛人,但我觉得我的经验能对大多数新入门的从业人员提供参考。以下是正式回答。&/p&&p&这三门当中,首推Java。真的,Python当然是好,但是对于一个新入门的人,最重要的是先找到工作不是吗?而找工作的话,Java无疑是最容易的。对于跨行业的人而言,最困难的其实是第一步,那就是如何进入这个行业。如果你连进都进不来,第一份工作迟迟无法开始,那么好好努力,补上数据结构,设计模式,算法设计这些差距就根本无从说起,不是吗?&/p&&p&不要被什么科班出身之类的说法吓坏了。虽然我是科班出身,但我始终觉得,只要你肯努力,这里面并没有什么无法逾越的鸿沟,最重要的是不要好高骛远,也不要急于求成。学习和积累是有一个过程的,在程序员这个行当,你一分付出,就会有一分回报。尊重学习的内在规律,循序渐进,终有一天,你会成为你想成为的那个人的。&/p&&p&接着,我来谈谈具体的规划。&br&1. 了解Java的运行环境。搞清楚path和classpath是干什么的,怎么在命令行进行编译,执行。知道IDE的各个按钮后面真正发生了什么事情。&br&2. 掌握Java的语法。搞清楚包,接口,类,继承这些基本概念。掌握多态,overwrite,死背下IO的接口,包括InputStream/OutputStream和Writer/Reader,死背下网络编程和GUI编程的接口,死背JDBC接口。这一步,推荐的书是《 Thinking in Java》。&br&3. 掌握多线程编程。弄明白ConcurrencyHashMap是怎么实现的,搞清楚synchronized是怎么回事,弄明白为什么要有Runnable接口。&/p&&p&在第二步和第三步掌握到80%的时候,你就可以考虑找工作了。&/p&&p&4. 在工作中体会一下设计模式。推荐《Java与模式》这本书。看完里面的Decorator,IO接口你再也不会去死记硬背了。用的时候,根据Adaptor和Decorator的命名规则,自己临时推都推得出来。&br&5. 恶补数据结构。 搞清楚 LinkedList和 ArrayList的实现机制,了解它们的每一个接口的时间复杂度。同样的还有其他容器,Map啊,Set啊,都是一样的。栈,队列,二叉树,图贯穿编程始终,如果这一步你迈不过去,那就只能在低阶程序员里打转。&br&6. 如果有可能,最好对一些算法设计也有所涉猎。比如动态规则的思路,贪心算法,诸如KMP这种奇妙的算法等。这一步没有数据结构那么重要,学得好当然好,学不好也不用太挫败。&/p&&p&到了这一步,你和科班程序员之间的差距就不大了。可以在工作中独立承担开发任务了。&/p&&p&7. 进阶,这时候就可以有自己的思考了。Java发展到现在,被用在各种各样的情景之中,说它是应用最广泛的编程语言并不过分。你在打好基础以后,就可以考虑应该向哪个方向发展了。比如服务端的架构,最好能学习一下JavaEE。JEE一直以来,都是让人觉得门槛太高。这个其实可以从Spring入手,搞清楚反射,控制反转,依赖注射都是什么鬼(这些神叨叨的名词其实都是为了解决Java本身不够动态这个缺陷而出现的,这里不展开,我只想提醒的是,这些概念没有什么大不了的东西,不要被爱装逼的家伙吓住了)。还有消息这个东西,还有ORM这个东西,都去搞搞清楚。想一下它们要解决什么问题,再猜一下他们是怎么实现的。我面试的时候发现,其实大多数优秀的开发者,即使以前没思考过这个问题,让他现场设计一下Hibernate,都能设计得差不多。这说明,这些框架性的东没有什么大不了的。有了基础,你也能设计出来。关键是要去动脑筋想。以上是以服务端开发举例,那么对于客户端,你就去思考事件响应机制是如何工作的(这个我不熟悉,就不再多说了)。还可以深入研究一下JVM的源代码,以及其实现机制,了解一下垃圾回收算法等等。&/p&&p&到了这一步,你就可以应聘Java高级开发了。如果运气好,年薪30万是有可能的。保底也要20万了。&/p&&p&8. 架构。到了这一步,你就算是登堂入室,真正迈入高级开发人员了。这一步,你要思考更多的东西,比如,如何处理高并发,如何应对分布式系统,如何提供更健壮的数据服务。到了这一步,那就没有什么可以参考的,现成的东西了。全靠自己的悟性了。那最后能达到什么高度,就不是我这个层次能点评的了。&/p&&p&编程的世界永远向所有热爱编程的人开放,这是一个自由,平等,共享的世界,我始终是这样坚信的。&/p&&p&希望你能成为一个成功的程序员。祝好。&/p&&p&以上。&/p&&p&======
下面是广告时间。&/p&&p&&a href=&https://zhuanlan.zhihu.com/hinus& class=&internal&&知乎专栏&/a&&/p&&p&我的知乎专栏,进击的Java新人,为Java新手们准备的教程。专栏里的内容是完全免费的。欢迎大家关注。&/p&&p&以及我的公众号:&/p&&p&&a href=&//link.zhihu.com/?target=http%3A//www.jianshu.com/p/dcb& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&我的公众号&/a&&/p&
看了那么多答案,我想说,你们不要误人子弟。请相信我的回答。为了增加自己的说服力,必须亮一下自己的经历了。 清华大学硕士毕业,在北京写过两年Java,在杭州写过三年Python,深入定制过Python虚拟机,现在从事arm上的javascript虚机机的开发。虽然仍然不…
&figure&&img src=&https://pic1.zhimg.com/v2-9b1dea04f7ee1f6bd9b895_b.jpg& data-rawwidth=&750& data-rawheight=&750& class=&origin_image zh-lightbox-thumb& width=&750& data-original=&https://pic1.zhimg.com/v2-9b1dea04f7ee1f6bd9b895_r.jpg&&&/figure&&p&本目录已加入&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&挖坑不填系列&/a&套餐&/p&&a href=&https://zhuanlan.zhihu.com/p/& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic1.zhimg.com/v2-18f16b2c4ea43c85df30d9d9cd6c6e60_180x120.jpg& data-image-width=&427& data-image-height=&281& class=&internal&&vczh:CS新手如何以正确的态度开始学习&/a&&a href=&https://zhuanlan.zhihu.com/p/& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic4.zhimg.com/v2-bafd0f2b393_180x120.jpg& data-image-width=&660& data-image-height=&495& class=&internal&&vczh:什么样的人能通过读计算机专业而获得成功?&/a&&a href=&https://zhuanlan.zhihu.com/p/& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic3.zhimg.com/v2-ab8184bde620f6cf0.jpg& data-image-width=&2000& data-image-height=&972& class=&internal&&vczh:C++需要不断地练习 ——vczh&/a&&a href=&https://zhuanlan.zhihu.com/p/& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic1.zhimg.com/v2-62ca021c9fbax120.jpg& data-image-width=&1430& data-image-height=&953& class=&internal&&vczh:沈向洋:You Are What You Write,大家都要看&/a&&a href=&https://zhuanlan.zhihu.com/p/& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic3.zhimg.com/v2-bbb868f9f24de903ccb2bd6_180x120.jpg& data-image-width=&468& data-image-height=&298& class=&internal&&vczh:神文系列(2)——喜鹊开发者&/a&&a href=&https://zhuanlan.zhihu.com/p/& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic4.zhimg.com/v2-60dae651db578eaax120.jpg& data-image-width=&600& data-image-height=&335& class=&internal&&vczh:觉得很有必要再次推荐编程自学界神文&/a&&a href=&https://zhuanlan.zhihu.com/p/& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic4.zhimg.com/v2-982d42be03_120x160.jpg& data-image-width=&820& data-image-height=&1334& class=&internal&&vczh:最近问我职业规划的好像有点多&/a&&a href=&https://zhuanlan.zhihu.com/p/& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic4.zhimg.com/4e01b87c67f1f6e77f71415daa94da4b_180x120.jpg& data-image-width=&811& data-image-height=&607& class=&internal&&vczh:为什么我们需要学习(设计)模式&/a&&a href=&https://zhuanlan.zhihu.com/p/& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic1.zhimg.com/2eeefd7cd9bf0_180x120.jpg& data-image-width=&900& data-image-height=&500& class=&internal&&vczh:靠谱的代码和DRY (图片是GacUI)&/a&&a href=&https://zhuanlan.zhihu.com/p/& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic4.zhimg.com/802c7cf2f9e874b975d210ca5f2e2ec7_180x120.jpg& data-image-width=&627& data-image-height=&382& class=&internal&&vczh:如何成为牛逼的程序员&/a&&p&&/p&
本目录已加入套餐
&p&本文来自于&a href=&https://link.zhihu.com/?target=https%3A//bugly.qq.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&腾讯bugly开发者社区&/a&,非经作者同意,请勿转载,原文地址:&a href=&https://link.zhihu.com/?target=http%3A//dev.qq.com/topic/577e0acc896e9ebb& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&dev.qq.com/topic/577e0a&/span&&span class=&invisible&&cc896e9ebb&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&如果您有耐心看完这篇文章,您将懂得如何着手进行app的分析、追踪、注入等实用的破解技术,另外,通过“入侵”,将帮助您理解如何规避常见的安全漏洞,文章大纲:&/p&&ul&&li&简单介绍ios二进制文件结构与入侵的原理&/li&&li&介绍入侵常用的工具和方法,包括pc端和手机端&/li&&li&讲解黑客技术中的静态分析和动态分析法&/li&&li&通过一个简单的实例,来介绍如何综合运用砸壳、寻找注入点、lldb远程调试、追踪、反汇编技术来进行黑客实战&/li&&li&讲解越狱破解补丁和不需越狱的破解补丁制作方法和差别&/li&&/ul&&h2&黑客的素养&/h2&&ul&&li&&p&&strong&敏锐的嗅觉&/strong& 有时候通过一个函数名,一个类名,就能大致的判断出它的作用,这就是嗅觉;功力已臻化境时,甚至可以使用第六感判断出一些注入点&/p&&/li&&li&&p&&strong&面对失败的勇气&/strong& 破解有时候很耗时,和程序开发正好相反,它耗时不是耗在写代码上,而是耗在寻找注入点和逆向工程上,有可能你花了3天时间去找程序的破绽,但是最终的破解代码可能就2行,不到一分钟就搞定了;但是你也需要做好面对失败的准备,如果路选错了,有可能你这3天完全是在浪费脑细胞&/p&&/li&&li&&p&&strong&洪荒之力&/strong& 洪荒之力-即入侵过程中需要借助的各种工具,工欲善其事,必先利其器,工具都是前人智慧的结晶,能用工具解决的,绝不要手动去搞&/p&&/li&&/ul&&h2&iOS黑客关键字&/h2&&p&iOS的入侵离不开越狱开发,一切的破解、入侵都是建立在越狱的基础上的,如果没有拿到系统级权限,一切的想法都是空谈了,当然,市面上存在免越狱的破解补丁,但是它的开发过程,也是基于越狱环境的&/p&&h3&tweak&/h3&&p&在iOS的黑客界,要做破解或越狱开发,就必须了解tweak,它是各种破解补丁的统称,在google上,如果你想搜索一些越狱开发资料或者开源的破解补丁代码,它是最好的关键字。&/p&&p&iOS的tweak大致分为两种:&/p&&ul&&li&&p&第一种是在cydia上发布的,需要越狱才能安装,大部分是deb格式的安装包,iOS在越狱后,会默认安装一个名叫mobilesubstrate的动态库,它的作用是提供一个系统级的入侵管道,所有的tweak都可以依赖它来进行开发,目前主流的开发工具有theos和iOSOpenDev,前者是采用makefile的一个编译框架,后者提供了一套xcode项目模版,可以直接使用xcode开发可调试,但是这个项目已经停止更新了,对高版本的xcode支持不好,大家酌情选择(本文中的例子全部采用theos)&/p&&/li&&li&&p&第二种是直接打包成ipa安装包,并使用自己的开发证书或者企业证书签名,不需越狱也可以安装,可直接放到自己的网站上,可实现在线安装;对于没有越狱的手机,由于权限的限制,我们是没有办法写系统级的tweak的,例如springboard的补丁是没法运行的,这种tweak大多是针对某个app,把目标app进行修改注入处理,再重新签名和发布,有点类似于windows软件的xxx破解版、xxx免注册版&/p&&/li&&/ul&&p&没有越狱的机器由于系统中没有mobilesubstrate这个库,我们有二个选择,第一个是直接把这个库打包进ipa当中,使用它的api实现注入,第二个是直接修改汇编代码;第一个适用于较为复杂的破解行为,而且越狱tweak代码可以复用,第二种适用于破解一些if...else...之类的条件语句&/p&&h3&Mobilesubstrate&/h3&&p&下面的图展示的就是oc届著名的method swizzling技术,他就是iOS的注入原理,类似于windows的钩子,所以我们注入也称为hook&/p&&figure&&img src=&https://pic1.zhimg.com/f5c56a3e30cde738868d_b.jpg& data-rawwidth=&629& data-rawheight=&321& class=&origin_image zh-lightbox-thumb& width=&629& data-original=&https://pic1.zhimg.com/f5c56a3e30cde738868d_r.jpg&&&/figure&&br&&p&Mobilesubstrate为了方便tweak开发,提供了三个重要的模块:&/p&&ul&&li&&p&&strong&MobileHooker&/strong& 就是用来做上面所说的这件事的,它定义一系列的宏和函数,底层调用objc-runtime和fishhook来替换系统或者目标应用的函数&/p&&/li&&li&&p&&strong&MobileLoader&/strong& 用来在目标程序启动时根据规则把指定目录的第三方的动态库加载进去,第三方的动态库也就是我们写的破解程序,他的原理下面会简单讲解一下&/p&&/li&&li&&p&&strong&Safe mode&/strong& 类似于windows的安全模式,比如我们写的一些系统级的hook代码发生crash时,mobilesubstrate会自动进入安全模式,安全模式下,会禁用所有的第三方动态库&/p&&/li&&/ul&&h3&app注入原理&/h3&&p&上面讲到了mobileloader,他是怎么做到把第三方的lib注入进目标程序的呢?这个我们要从二进制文件的结构说起,从下面的图来看,Mach-O文件的数据主体可分为三大部分,分别是头部(Header)、加载命令(Load commands)、和最终的数据(Data)。mobileloader会在目标程序启动时,会根据指定的规则检查指定目录是否存在第三方库,如果有,则会通过修改二进制的loadCommands,来把自己注入进所有的app当中,然后加载第三方库。&/p&&figure&&img src=&https://pic3.zhimg.com/1eaa81aafffdee6ab135835_b.jpg& data-rawwidth=&523& data-rawheight=&570& class=&origin_image zh-lightbox-thumb& width=&523& data-original=&https://pic3.zhimg.com/1eaa81aafffdee6ab135835_r.jpg&&&/figure&&br&&p&为了让大家看的更清楚,下面我用machoview来打开一个真实的二进制文件给大家看看,可以看出,二进制当中所有引用到的动态库都放在Load commands段当中,所以,通过给这个段增加记录,就可以注入我们自己写的动态库了&/p&&figure&&img src=&https://pic2.zhimg.com/93fd1afa037e4bccff7a2_b.jpg& data-rawwidth=&917& data-rawheight=&624& class=&origin_image zh-lightbox-thumb& width=&917& data-original=&https://pic2.zhimg.com/93fd1afa037e4bccff7a2_r.jpg&&&/figure&&br&&p&那么问题来了,在这里插入我们自己的动态库有什么用?我们自己写的代码没有执行的入口,我们一样没发干坏事,嗯,恭喜你问到点子上了,我们还需要一个&main&函数来执行我们自己的代码,这个&main&函数在oc里面称为构造函数,只要在函数前声明 &&strong&attribute&/strong&((constructor)) static& 即可,有了它我们就可以发挥想象力,进行偷天换日干点坏事了:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&#import &CaptainHook/CaptainHook.h&
CHDeclareClass(AnAppClass);
CHMethod(1, void, AnAppClass, say, id, arg1)
NSString* tmp=@&Hello, iOS!&;
CHSuper(1, AnAppClass, say, tmp);
__attribute__((constructor)) static void entry()
NSLog(@&Hello, Ice And Fire!&);
CHLoadLateClass(AnAppClass);
CHClassHook(1, AnAppClass,say);
&/code&&/pre&&/div&&p&到这里为止,我们已经知道了怎么在目标程序注入自己的代码,那么我们怎么知道需要hook哪些方法?怎么找到关键点进行实际的破解呢?下面讲一下常见的app入侵分析方法&/p&&h3&iOS逆向分析方法&/h3&&p&逆向分析最常用的有三种方法:&/p&&ol&&li&&p&&strong&网络分析&/strong& 通过分析和篡改接口数据,可以有效的破解通过接口数据来控制客户端行为的app,常用的抓包工具有Tcpdump, WireShark, Charles等,windows平台有fidller&/p&&/li&&li&&p&&strong&静态分析&/strong& 通过砸壳、反汇编、classdump头文件等技术来分析app行为,通过这种方式可以有效的分析出app实用的一些第三方库,甚至分析出app的架构等内容,常用的工具有dumpdecrypted(砸壳)、hopper disassembler(反汇编)、class_dump(导头文件)&/p&&/li&&li&&p&&strong&动态分析&/strong& 有静就有动,万物都是相生相克的,动态分析指的是通过分析app的运行时数据,来定位注入点或者获取关键数据,常用的工具有cycript(运行时控制台)、 lldb+debugserver(远程断点调试)、logify(追踪)&/p&&/li&&/ol&&h2&demo:微信抢红包插件&/h2&&p&上面讲了很多原理性的东西,相信大家已经看的不耐烦了,下面我们一起动点真格的,我们从头开始,一步一步的做一个微信的自动抢红包插件,当然,网上可能已经有相关的开源代码了,但是我这里要讲的是,这些代码是怎么得出来的,我么重点讲一讲分析过程&/p&&h3&工欲善其事,必先利其器&/h3&&p&一台越狱的手机,并装有以下软件&/p&&ul&&li&cycript&/li&&li&dumpdecrypted&/li&&li&debug server&/li&&li&openssh&/li&&/ul&&p&一台苹果电脑,并装有以下软件&/p&&ul&&li&class_dump&/li&&li&Theos&/li&&li&Hopper Disassembler v3&/li&&li&xcode&/li&&li&insert_dylib&/li&&li&pp助手&/li&&/ul&&h3&寻找注入点&/h3&&h4&砸壳&/h4&&p&首先我们要做的就是把微信的壳砸掉,砸壳其实是为了把它的头文件classdump出来,因为从appstore下载的app二进制都是经过加密的,直接进行classdump操作是啥也看不出来的&/p&&ul&&li&用pp助手把dumpdecrypted.dylib文件copy到微信的documents目录&/li&&li&ssh到手机的终端,cd到documents目录中,执行下面的命令进行砸壳操作&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&xxx$ cp /usr/lib/dumpdecrypted.dylib /path/to/app/document
xxx$ DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /path/to/WeChat
&/code&&/pre&&/div&&/li&&li&最后砸壳完成后会在documents目录生成砸了壳后的二进制文件,用pp助手copy出来并class-dump他的头文件备用&/li&&/ul&&p&执行完这几行命令后,会在微信的documents目录生成一个WeChat.decrypted文件,这就是砸壳后的二进制文件;当然了,这一步不是必须的,我们可以直接从91或者pp助手下载一个已经砸过壳的版本&/p&&h4&动态分析-cycript&/h4&&p&要想实现自动抢红包,我们必须找到收到红包消息的handler方法,怎么入手呢?我们先从界面出发,进入微信的消息首发窗口:&/p&&figure&&img src=&https://pic2.zhimg.com/86662eaefc_b.jpg& data-rawwidth=&322& data-rawheight=&496& class=&content_image& width=&322&&&/figure&&br&&ul&&li&ssh进手机的终端,输入ps命令,查找到微信的进程id&/li&&/ul&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&ps aux | grep WeChat
&/code&&/pre&&/div&&ul&&li&祭起神器cycript,根据上一步找到的pid注入到微信的进程&/li&&/ul&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&cycript -p pidxxx
&/code&&/pre&&/div&&ul&&li&在cycript的终端输入这一串方法,作用就是打印出当前界面的view层级,(cycript还有很多妙用,大家可以上官网看文档,这里不详细介绍)&/li&&/ul&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&UIApp.keyWindow.recursiveDescription().toString()
&/code&&/pre&&/div&&p&最终的输出如下,内容太多,大家肯定看不清楚,不过没关系,这个不是重点,这里只是展示一下打印的结果形式:&/p&&figure&&img src=&https://pic2.zhimg.com/3d7d8a833d76ee483c374f_b.jpg& data-rawwidth=&635& data-rawheight=&324& class=&origin_image zh-lightbox-thumb& width=&635& data-original=&https://pic2.zhimg.com/3d7d8a833d76ee483c374f_r.jpg&&&/figure&&br&&p&我们可以随机的选取一个节点不要太靠树叶,也不要太靠树根,例如我选的是标红的部分,把这个节点的内存地址copy出来,这个内存地址,就代表了这个节点的view对象,ios开发的老油条们都知道,通过view的nextResponder方法,可以找出它所属的视图控制器ViewController,所以我么在cycript的控制台中持续输入如下的命令:&/p&&figure&&img src=&https://pic4.zhimg.com/0aee4875cd8eec43a8f84_b.jpg& data-rawwidth=&819& data-rawheight=&285& class=&origin_image zh-lightbox-thumb& width=&819& data-original=&https://pic4.zhimg.com/0aee4875cd8eec43a8f84_r.jpg&&&/figure&&p&看到没有,通过四个nextResponder方法调用,我么找到了当前聊天窗口的ViewController类名,他就是&strong&BaseMsgContentViewController&/strong&,现在我们缩小了目标范围,下面我们还需要继续缩小范围,要找到具体的消息处理函数才行。&/p&&h4&动态分析-Logify&/h4&&p&要继续缩小范围,就得祭起神器Logify了,它是theos的一个模块,作用就是根据头文件自动生成tweak,生成的tweak会在头文件的所有方法中注入NSLog来打印方法的入参和出参,非常适合追踪方法的调用和数据传递&/p&&p&现在我们根据此前砸壳后class_dump出来的头文件,找到&strong&BaseMsgContentViewController&/strong&在pc终端执行如下命令:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&logify.pl /path/to/BaseMsgContentViewController.h & /out/to/Tweak.xm
&/code&&/pre&&/div&&p&输出的tweak文件大概是这个样子的:&/p&&figure&&img src=&https://pic3.zhimg.com/bebe5aa5635_b.jpg& data-rawwidth=&967& data-rawheight=&358& class=&origin_image zh-lightbox-thumb& width=&967& data-original=&https://pic3.zhimg.com/bebe5aa5635_r.jpg&&&/figure&&br&&p&这里带百分号的关键字,例如 &strong&%hook、%log、%orig&/strong& 都是mobilesubstrate的MobileHooker模块提供的宏,其实也就是把method swizzling相关的方法封装成了各种宏标记,使用起来更简单,大家想要更深入了解各种标记,可以google一下logos语言&/p&&h4&theos创建tweak&/h4&&p&上面我们用logify生成了一个tweak代码,我们要把它安装到手机上,首先需要使用theos进行编译,安装了theos之后,在pc终端输入nic.pl:&/p&&figure&&img src=&https://pic1.zhimg.com/bc5eafa371fd01a6e8a72f3_b.jpg& data-rawwidth=&1084& data-rawheight=&438& class=&origin_image zh-lightbox-thumb& width=&1084& data-original=&https://pic1.zhimg.com/bc5eafa371fd01a6e8a72f3_r.jpg&&&/figure&&br&&p&首先选择项目模版当然是tweak啦,然后是项目名称、作者,后面两个选项要注意:&/p&&ul&&li&首先是bundle filter,这个需要填你需要注入的目标app的bundle id,MobileLoader模块会根据它来寻找你的tweak的注入目标&/li&&li&最后是list id applications to terminate upon installation,这里指定当tweak安装成功之后,需要kill的进程,我们要hook微信,这里就填微信的二进制文件名就可以了,为什么要kill? 因为我么的插件是需要在app启动时加载进去的,如果不重启app,插件是不会生效的&/li&&/ul&&p&最后一切都完成后,在当前目录会生成下列文件:&/p&&figure&&img src=&https://pic2.zhimg.com/c15dddb5c_b.jpg& data-rawwidth=&592& data-rawheight=&130& class=&origin_image zh-lightbox-thumb& width=&592& data-original=&https://pic2.zhimg.com/c15dddb5c_r.jpg&&&/figure&&br&&p&把上面logify生成的tweak文件覆盖到当前目录,并用文本编辑器打开makefile文件,在文件的开头增加你的ios设备的ip地址和ssh端口:&/p&&figure&&img src=&https://pic1.zhimg.com/5e0f05f1fde7c6dac7cb_b.jpg& data-rawwidth=&485& data-rawheight=&349& class=&origin_image zh-lightbox-thumb& width=&485& data-original=&https://pic1.zhimg.com/5e0f05f1fde7c6dac7cb_r.jpg&&&/figure&&br&&p&最后在pc终端进入项目目录,输入 make package install 命令:&/p&&figure&&img src=&https://pic1.zhimg.com/81a6d5f65f53a0bac701ff2b91ccefaa_b.jpg& data-rawwidth=&1038& data-rawheight=&272& class=&origin_image zh-lightbox-thumb& width=&1038& data-original=&https://pic1.zhimg.com/81a6d5f65f53a0bac701ff2b91ccefaa_r.jpg&&&/figure&&br&&p&期间会让你输入设备的ssh密码,越狱机器的默认ssh密码是alpine,make命令会生成deb安装包,放在debs目录,我们如果想对外发布自己的插件,可以把生成的安装包上传到cydia即可&/p&&p&安装成功后再次进入微信的聊天界面,并使用另外一个微信在群里发个普通消息,连接xcode打开越狱机器控制台,查看输出,会发现有类似下面的输出:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&Jun
7 09:56:13 Administratorde-iPhone WeChat[85972] &Notice&: [1;36m[WxMsgPreview] [m[0;36mTweak.xm:308[m [0;30;46mDEBUG:[m -[&BaseMsgContentViewController: 0x15e0c9a00& addMessageNode:{m_uiMesLocalID=2, m_ui64MesSvrID=0, m_nsFromUsr=ccg*675~9, m_nsToUsr=@chatroom, m_uiStatus=1, type=1, msgSource=&(null)&}
layout:1 addMoreMsg:0]
&/code&&/pre&&/div&&p&看出来了吧,消息处理函数是BaseMsgContentViewController的&strong&addMessageNode:layout:addMoreMsg:&/strong&方法,大家可以看出,方法的参数内容也打印出来了&/p&&h4&动态分析-lldb&/h4&&p&到目前为止,我么已经把范围缩小到了具体的函数,看起来注入点已经找到了,但是请大家思考一下,如果我们在这个函数中注入抢红包逻辑,那我们的tweak会不会有什么致命的缺陷?&/p&&p&是的,因为BaseMsgContentViewController这个类是微信群聊天窗口对应的controller,我么必须进入到群的聊天界面,这个类才会创建,如果不进入聊天窗口,我们的插件就不生效了,而且,即使进入聊天窗口,也只是能自动枪当前群的红包而已,其他群就无能为力了,是不是有点low?&/p&&p&所以为了使我们的插件显得上流一些,我么还要继续追根溯源,寻找消息的源头,这里就用到了lldb远程调试,使用lldb打断点的方式,通过调用栈,我们可以就可以看到当消息来到时,方法的调用顺序,找到最先执行的消息处理函数。&/p&&p&要在刚刚追踪到的&strong&addMessageNode:layout:addMoreMsg:&/strong&方法中打断点,首先我们得知道它在运行时的内存地址,那么内存地址怎么来呢?有这么一个公式:&/p&&ul&&li&&p&&font color=red&内存地址=进程内存基地址+函数在二进制中的偏移量 &/font&&/p&&/li&&/ul&&p&首先偏移量我们可以通过反汇编工具hooper来查,在pc上用hooper打开微信的二进制文件(&font color=red&注意,打开时会让你选择armv7或者arm64,这需要根据你越狱手机的cpu类型来选,一定要和你的手机一致&/font&),hooper的界面非常简洁,左侧有个搜索框,可以输入函数名,直接找到函数在二进制中的位置&/p&&figure&&img src=&https://pic3.zhimg.com/4bea747abba899cbcbbf_b.jpg& data-rawwidth=&840& data-rawheight=&674& class=&origin_image zh-lightbox-thumb& width=&840& data-original=&https://pic3.zhimg.com/4bea747abba899cbcbbf_r.jpg&&&/figure&&p&通过左侧的搜索框搜addMessageNode关键字,找到它的偏移量是&font color=red&0xd7c6c&/font&:&br&&figure&&img src=&https://pic4.zhimg.com/41deb7e6f330_b.jpg& data-rawwidth=&997& data-rawheight=&95& class=&origin_image zh-lightbox-thumb& width=&997& data-original=&https://pic4.zhimg.com/41deb7e6f330_r.jpg&&&/figure&&/p&&p&找到了偏移量,还需要进程的基地址,这个地址需要连lldb,所以下面讲一下如何连接lldb进行远程调试,先ssh进越狱手机的终端,在终端输入如下命令(&font color=red&注意,你的手机必须连xcode调试过才会有这个命令&/font&):&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&debugserver *:19999 -a WeChat
&/code&&/pre&&/div&&p&然后在pc端新起一个终端窗口,输入如下命令来连接手机端进行调试:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&lldb
process connect connect://deviceIP:19999
&/code&&/pre&&/div&&p&如果连接成功,会进入lldb的控制台,我们在lldb的控制台输入如下命令来获取微信进程的基地址:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&image list -o -f
&/code&&/pre&&/div&&p&执行这个命令会打印很多行数据,像下面图中这样,我么要找到微信的二进制文件所在的行,记录它的内存地址&font color=red&0XE800&/font&:&/p&&figure&&img src=&https://pic2.zhimg.com/c7b60c03bee2faa26b3138_b.jpg& data-rawwidth=&880& data-rawheight=&53& class=&origin_image zh-lightbox-thumb& width=&880& data-original=&https://pic2.zhimg.com/c7b60c03bee2faa26b3138_r.jpg&&&/figure&&br&&p&到这里我们两个地址都找到了,再通过br命令打断点:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&br s -a '0XE800+0xd7c6c'
&/code&&/pre&&/div&&p&打好断点后继续向群里面发消息,我们会发现进程被断掉了,这时输入bt指令,就可以看到当前的调用栈,就像下图这样:&/p&&figure&&img src=&https://pic3.zhimg.com/24bb34d0f1c53a580993_b.jpg& data-rawwidth=&1047& data-rawheight=&590& class=&origin_image zh-lightbox-thumb& width=&1047& data-original=&https://pic3.zhimg.com/24bb34d0f1c53a580993_r.jpg&&&/figure&&br&&p&分析堆栈的时候,重点找出模块时WeChat的项,这些都是微信模块的方法调用,有了堆栈,我们需要根据堆栈的内存地址找出它的具体函数名,思路还是先根据上面讲到的公式来计算出栈地址在二进制中的偏移量,然后用hooper找到偏移量对应的函数名&/p&&ul&&li&&p&&font color=red&函数在二进制中的偏移量=内存地址 - 进程内存基地址 &/font&&/p&&/li&&/ul&&p&例如根据箭头所指的内存地址和刚刚得到的进程基地址,计算偏移量:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&0xad02f4 – 0xe8000 =
&/code&&/pre&&/div&&p&然后在hooper中搜索这个地址,得到结果如下:&/p&&figure&&img src=&https://pic2.zhimg.com/eb33af9b7dd8cb46deb1fa1_b.jpg& data-rawwidth=&1102& data-rawheight=&361& class=&origin_image zh-lightbox-thumb& width=&1102& data-original=&https://pic2.zhimg.com/eb33af9b7dd8cb46deb1fa1_r.jpg&&&/figure&&br&&p&最终把所有的栈都进行还原,得出调用栈是这个样子的:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&-[CMessageMgr MainThreadNotifyToExt:]:
-[BaseMsgContentLogicController OnAddMsg:MsgWrap:]:
-[RoomContentLogicController DidAddMsg:]
-[BaseMsgContentLogicController DidAddMsg:]
—————-&
-[BaseMsgContentViewController addMessageNode:layout:addMoreMsg:]:
&/code&&/pre&&/div&&p&CMessageMgr这个类浮出水面了,是时候发挥黑客的嗅觉了,根据方法名我们能判断出&font color=red&MainThreadNotifyToExt:&/font&这个方法仅仅是用来发送通知的,如果hook这个方法,我们是拿不到消息内容的&/p&&p&由于这里可能是一个异步调用,用断点的方式,可能已经打印不出来栈信息了,所以还得使用logify来继续追踪CMessageMgr这个类,讲过的内容我就不重复了,直接得到最终的消息处理函数:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&-(void)AsyncOnAddMsg:(id)message MsgWrap:(CMessageWrap* )msgWrap
&/code&&/pre&&/div&&h3&实现“抢”的动作&/h3&&p&上一节我们已经找到了hook的关键点,那么该如何去实现抢的动作?同样我们需要结合动态分析和静态分析,首先得到红包消息体的数据特征,然后再分析处理消息的关键点&/p&&h4&数据包分析&/h4&&p&首先我们的代码需要分辨哪些才是红包消息,方法很简单,用logify追踪BaseMsgContentViewController,然后向微信群发一个红包,观察手机日志输出,我们可以看出消息的数据结构中有个type字段,值是49,这个type应该就是标记消息类型的,如果不确定,可以再发个图片或者文本之类的消息,这个值是不同的:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&Administratorde-iPhone WeChat[47410] &Notice&: [1;36m[WxMsgPreview] [m[0;36mTweak.xm:308[m [0;30;46mDEBUG:[m -[&BaseMsgContentViewController: 0x15e0c9a00& addMessageNode:{m_uiMesLocalID=16, m_ui64MesSvrID=0425509, m_nsFromUsr=@chatroom, m_nsToUsr=ccg*675~9, m_uiStatus=4, type=49, msgSource=&&msgsource&
&silence&0&/silence&
&membercount&3&/membercount&
&/msgsource&
layout:1 addMoreMsg:0]
&/code&&/pre&&/div&&p&现在我们能分辨消息类型了,重点来了,怎么实现&strong&抢&/strong&这个事呢,可能聪明人已经猜到了,从ui入手,先找到微信本身的&strong&抢红包&/strong&函数,我们自己来给它构造参数并调用他不就行了?&/p&&figure&&img src=&https://pic3.zhimg.com/dfa197ba15d67b_b.jpg& data-rawwidth=&306& data-rawheight=&528& class=&content_image& width=&306&&&/figure&&br&&p&把红包点开后,用cycript打印出当前view的层次,就像下面这个,一眼就可以看到重点,WCRedEnvelopesReceiveHomeView就是开红包弹框的类名&/p&&figure&&img src=&https://pic1.zhimg.com/d4ffdcd2654_b.jpg& data-rawwidth=&640& data-rawheight=&274& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic1.zhimg.com/d4ffdcd2654_r.jpg&&&/figure&&br&&p&知道类名后,用cycript追踪它,点击开红包,在日志中找到了下图中的内容,从名字来看,这是一个事件处理函数,我们现在要做的,就是把他还原成oc代码,真正实现抢红包功能&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&Administratorde-iPhone WeChat[91173] &Notice&: [1;36m[WxMsgPreview] [m[0;36mTweak.xm:8[m [0;30;46mDEBUG:[m -[&WCRedEnvelopesReceiveHomeView: 0x13cdda8c0& OnOpenRedEnvelopes]
&/code&&/pre&&/div&&h4&静态分析法&/h4&&p&怎么把他还原成oc代码,真正实现抢红包功能呢?还得借助一点点汇编技能,只是一点点而已,因为现在的反汇编工具已经很强大了,我们不需要挨个去看寄存器了&/p&&p&在pc上用hooper打开微信的二进制文件,搜索&font color=red&OnOpenRedEnvelopes&/font&,查看汇编代码,注意在图片中最后一行调用了一个&font color=red&WCRedEnvelopesReceiveHomeViewOpenRedEnvelopes&/font&函数&/p&&figure&&img src=&https://pic2.zhimg.com/198c1eef14cb9e9b_b.jpg& data-rawwidth=&661& data-rawheight=&48& class=&origin_image zh-lightbox-thumb& width=&661& data-original=&https://pic2.zhimg.com/198c1eef14cb9e9b_r.jpg&&&/figure&&figure&&img src=&https://pic4.zhimg.com/eed333a2ccff197f41b6d7_b.jpg& data-rawwidth=&863& data-rawheight=&397& class=&origin_image zh-lightbox-thumb& width=&863& data-original=&https://pic4.zhimg.com/eed333a2ccff197f41b6d7_r.jpg&&&/figure&&p&继续搜索WCRedEnvelopesReceiveHomeViewOpenRedEnvelopes这个方法,找到它的汇编代码&/p&&ul&&li&首先他不知道从哪里获取了一个payinfoitem&/li&&li&然后又获取了payinfo的m_c2cNativeUrl属性&/li&&li&然后调用substringfromindex吧navtiveurl的前缀截断,并调用bizutil的一个方法把url参数转换成了一个字典&/li&&/ul&&figure&&img src=&https://pic4.zhimg.com/b0ae84f98ad83_b.jpg& data-rawwidth=&944& data-rawheight=&570& class=&origin_image zh-lightbox-thumb& width=&944& data-original=&https://pic4.zhimg.com/b0ae84f98ad83_r.jpg&&&/figure&&p&最终反解出的代码如下,是不是很简单?&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&NSString *nativeUrl = [[msgWrap m_oWCPayInfoItem] m_c2cNativeUrl];
nativeUrl = [nativeUrl substringFromIndex:[@&wxpay://c2cbizmessagehandler/hongbao/receivehongbao?& length]];
NSDictionary *nativeUrlDict = [%c(WCBizUtil) dictionaryWithDecodedComponets:nativeUrl separator:@&&&];
&/code&&/pre&&/div&&p&继续往下看, 在这里前面三行创建了一个mutable dictionary:&/p&&ul&&li&紧接着下面三个框框处都是调用了setobject:forkey:向里面填东西,那填的东西是啥呢?&/li&&li&其实这里已经可以看的很清楚了,第一个key是msgtype,值是字符串1,第二个sendid,值是调用了一个objectforkey从另一个字典中取出来的,很显然,另一个字典就是上面从url解析得到的,后面的channelid也是同样的道理&/li&&/ul&&figure&&img src=&https://pic3.zhimg.com/0becd0a207af3d72c60edee6_b.jpg& data-rawwidth=&781& data-rawheight=&605& class=&origin_image zh-lightbox-thumb& width=&781& data-original=&https://pic3.zhimg.com/0becd0a207af3d72c60edee6_r.jpg&&&/figure&&br&&p&最终得到的代码如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&NSMutableDictionary *args = [[%c(NSMutableDictionary) alloc] init];
[args setObject:nativeUrlDict[@&msgtype&] forKey:@&msgType&];
[args setObject:nativeUrlDict[@&sendid&] forKey:@&sendId&];
[args setObject:nativeUrlDict[@&channelid&] forKey:@&channelId&];
&/code&&/pre&&/div&&p&继续往下看从箭头所指的几处,我们可以看见,它的代码是这样的,共分为四步&/p&&ul&&li&第一个箭头调用了mmservicecenter的defaultcenter方法来获取mmservicecenter实例&/li&&li&第二个箭头调用了CContactMgr的class方法&/li&&li&第三个箭头调用了第一步获取的mmservicecenter实例的getservice方法,而这个方法是把第二步得到的class作为参数&/li&&li&第四个箭头很明白了吧,第三步得到了CContactMgr实例,这里就是调用CContactMgr实例的getselfcontact方法获取自己的账户资料&/li&&/ul&&figure&&img src=&https://pic2.zhimg.com/7febad5bb2a0b658a6f733_b.jpg& data-rawwidth=&954& data-rawheight=&473& class=&origin_image zh-lightbox-thumb& width=&954& data-original=&https://pic2.zhimg.com/7febad5bb2a0b658a6f733_r.jpg&&&/figure&&br&&p&最终还原的到的代码如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&CContactMgr *contactManager = [[%c(MMServiceCenter) defaultCenter] getService:[%c(CContactMgr) class]];
CContact *selfContact = [contactManager getSelfContact];
&/code&&/pre&&/div&&p&继续往下看,这里使用刚刚得到的selfcontact来获取displayname和headimgurl,并把它们设置到刚刚的字典里面了,key分别是nickname和headimg&/p&&figure&&img src=&https://pic2.zhimg.com/1ee9ee73ed472c2df180f6_b.jpg& data-rawwidth=&884& data-rawheight=&386& class=&origin_image zh-lightbox-thumb& width=&884& data-original=&https://pic2.zhimg.com/1ee9ee73ed472c2df180f6_r.jpg&&&/figure&&br&&p&最终的代码:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&[args setObject:[selfContact getContactDisplayName] forKey:@&nickName&];
[args setObject:[selfContact m_nsHeadImgUrl] forKey:@&headImg&];
&/code&&/pre&&/div&&p&接着看,接下来这两段就比较蛋疼了,完全是从内存地址里面取的值,我也不知道他从哪里来,怎么办呢?有没有不懂汇编就能搞定它的捷径呢,答案是有!&/p&&ul&&li&对于第一个,我可以通过它的key猜出来,还记得最开始的时候我们取过payinfo的一个nativeurl属性吧,我们姑且把他传进去&/li&&li&对于第二个,我们可以猜测sessionUserName大概是会话名称,也就是群名称的意思,从哪里取这个值呢?我们先把也设置成伪代码&/li&&/ul&&figure&&img src=&https://pic4.zhimg.com/ec931ebd8bd27fdc032e3859_b.jpg& data-rawwidth=&725& data-rawheight=&329& class=&origin_image zh-lightbox-thumb& width=&725& data-original=&https://pic4.zhimg.com/ec931ebd8bd27fdc032e3859_r.jpg&&&/figure&&br&&p&最终的结果如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&[args setObject:nativeUrl forKey:@&nativeUrl&];
[args setObject:xxx forKey:@&sessionUserName&];
&/code&&/pre&&/div&&p&继续往下看,接下来这一段还是用mmservicecenter来获取WCRedLogicMgr对象,然后调用WCRedLogicMgr的open方法来拆红包,可以想象open方法的参数就是上面我们辛苦组装的字典&/p&&figure&&img src=&https://pic3.zhimg.com/cac3bc5dd19229eefe2e7b756c0e2a56_b.jpg& data-rawwidth=&826& data-rawheight=&470& class=&origin_image zh-lightbox-thumb& width=&826& data-original=&https://pic3.zhimg.com/cac3bc5dd19229eefe2e7b756c0e2a56_r.jpg&&&/figure&&br&&p&代码如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&[[[%c(MMServiceCenter) defaultCenter] getService:[%c(WCRedEnvelopesLogicMgr) class]] OpenRedEnvelopesRequest:args];
&/code&&/pre&&/div&&h4&领红包逻辑&/h4&&p&到这里,我们再总结一下我们上面分析的过程......&/p&&ul&&li&得到m_oWCPayInfoItem属性&/li&&li&解析m_oWCPayInfoItem的m_c2cNativeUrl属性&/li&&li&得到selfcontact&/li&&li&组装相关参数&/li&&li&调用OpenRedEnvelopesRequest:领取红包&/li&&/ul&&p&最终的抢红包代码合并起来如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&#import &WxMsgPreview.h&
%hook CMessageMgr
-(void)AsyncOnAddMsg:(id)message MsgWrap:(CMessageWrap* )msgWrap {
if(msgWrap.m_uiMessageType == 49){
CContactMgr *contactManager = [[%c(MMServiceCenter) defaultCenter] getService:[%c(CContactMgr) class]];
CContact *selfContact = [contactManager getSelfContact];
if ([msgWrap.m_nsContent rangeOfString:@&wxpay://c2cbizmessagehandler/hongbao/receivehongbao&].location != NSNotFound) { // 红包
NSString *nativeUrl = [[msgWrap m_oWCPayInfoItem] m_c2cNativeUrl];
nativeUrl = [nativeUrl substringFromIndex:[@&wxpay://c2cbizmessagehandler/hongbao/receivehongbao?& length]];
NSDictionary *nativeUrlDict = [%c(WCBizUtil) dictionaryWithDecodedComponets:nativeUrl separator:@&&&];
NSMutableDictionary *args = [[%c(NSMutableDictionary) alloc] init];
[args setObject:nativeUrlDict[@&msgtype&] forKey:@&msgType&];
[args setObject:nativeUrlDict[@&sendid&] forKey:@&sendId&];
[args setObject:nativeUrlDict[@&channelid&] forKey:@&channelId&];
[args setObject:[selfContact getContactDisplayName] forKey:@&nickName&];
[args setObject:[selfContact m_nsHeadImgUrl] forKey:@&headImg&];
[args setObject:nativeUrl forKey:@&nativeUrl&];
[args setObject:msgWrap.m_nsFromUsr forKey:@&sessionUserName&];
[[[%c(MMServiceCenter) defaultCenter] getService:[%c(WCRedEnvelopesLogicMgr) class]] OpenRedEnvelopesRequest:args];
&/code&&/pre&&/div&&p&刚才说了,有两个疑难点没有解决:&/p&&ul&&li&第一:我们不知道payinfo是哪里来的,&/li&&li&第二:sessionusername我们也不知道是哪里来的&/li&&/ul&&blockquote&&p&这时候我们可以从我们注入点的参数入手,首先用logify打印出addmsg方法的参数信息,会发现,它的第二个参数刚好有一个payinfo的属性,这样第一个问题迎刃而解了&/p&&p&第二个我们已经猜测到它代表群名称,所以我们从修改几次群名称,然后再观察logify打印出的参数值的变化,就可以确认出从哪里取了&/p&&/blockquote&&p&通过一番折腾,得出了抢红包的核心代码,再结合上面章节所讲的theos制作tweak包的方法,打包并安装到手机,发个红包试试,是不是秒抢?&/p&&h3&免越狱插件&/h3&&h4&检查依赖项&/h4&&p&如果设备没有越狱,是没有mobilesubstrate等环境的,而且一些系统目录是没有读写权限的,这时我么只能从目标app的二进制文件入手,通过手动修改load commands来加载自己的dylib,那么上面我们的插件又是使用theos基于mobilesubstrate编译的,有没有办法确定我们的dylib有没有依赖其他的库呢?&/p&&p&使用osx自带的otool工具即可,可以看出,我们的lib是依赖于substrate库的,其他的都是系统库,所以我们从越狱设备中把cydiasubstrate文件copy出来重命名为libsunstrate.dylib,和我们的dylib一起放入wechat.app目录中&/p&&p&最后使用install_name_tool命令修改动态库的路径把它指向app二进制文件的同级目录&/p&&figure&&img src=&https://pic2.zhimg.com/687f1a18daafbfcccfca00_b.jpg& data-rawwidth=&1280& data-rawheight=&786& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic2.zhimg.com/687f1a18daafbfcccfca00_r.jpg&&&/figure&&br&&h4&制作安装包&/h4&&p&解决了依赖问题,然后要把我们的库注入到二进制weixin的二进制文件,这一步使用开源的insert_dylib即可 (@executable_path是一个环境变量,指的是二进制文件所在的路径)&/p&&blockquote&&p&insert_dylib命令格式: ./insert_dylib 动态库路径 目标二进制文件&/p&&/blockquote&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&//注入动态库
./insert_dylib @executable_path/wxmsgpreview.dylib WeChat
//打包成ipa
xcrun -sdk iphoneos PackageApplication -v WeChat.app -o ~/WeChat.ipa
&/code&&/pre&&/div&&p&最后使用用企业证书或者开发证书签名对ipa重新签名,就可以放到自己的渠道进行发布了!&/p&&h2&结语&/h2&&p&通过综合运用各种工具,进行静态和动态分析,我们通过实战破解了微信的抢红包逻辑,明白了入侵常用的工具,上面的抢红包代码还有很多改进之处,比如没有判断红包的发送者是不是自己、也没有判断红包里面的文字是不是&font color=red&抢错三倍&/font&,有兴趣的童鞋可以尝试优化一下!&/p&&p&更多精彩内容欢迎关注bugly的微信公众账号:&b&weixinBugly&/b&&/p&&p&&a href=&https://link.zhihu.com/?target=https%3A//bugly.qq.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&腾讯 Bugly&/a&是一款专为移动开发者打造的质量监控工具,帮助开发者快速,便捷的定位线上应用崩溃的情况以及解决方案。智能合并功能帮助开发同学把每天上报的数千条 &a href=&https://link.zhihu.com/?target=https%3A//bugly.qq.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Crash&/a& 根据根因合并分类,每日日报会列出影响用户数最多的崩溃,精准定位功能帮助开发同学定位到出问题的代码行,实时上报可以在发布后快速的了解应用的质量情况,适配最新的 iOS, Android 官方操作系统,鹅厂的工程师都在使用,快来加入我们吧!&/p&
本文来自于,非经作者同意,请勿转载,原文地址:如果您有耐心看完这篇文章,您将懂得如何着手进行app的分析、追踪、注入等实用的破解技术,另外,通过“入侵”,将帮助您理解如何规避常见的安全漏洞,文章大纲:简…
&figure&&img src=&https://pic2.zhimg.com/v2-bd29c9f2b4f2ad2de009c2e7a2128279_b.jpg& data-rawwidth=&450& data-rawheight=&400& class=&origin_image zh-lightbox-thumb& width=&450& data-original=&https://pic2.zhimg.com/v2-bd29c9f2b4f2ad2de009c2e7a2128279_r.jpg&&&/figure&&p&一、瞎扯部分 &/p&&p&『现在安全技术岗招人拿到的简历,除了工作比较久的,大部分的应届毕业生啥的,10个里能有近9个写有渗透测试能力,然后9个里,8个的渗透测试其实是黑盒漏洞测试,提权、域渗透等后渗透部分基本是0,8个里问到怎么发现的漏洞,能有7个说不清楚…还有个共同的点是简历里一般会有各种CTF比赛获奖记录,SRC挖洞记录,SRC挖洞就不说了,现在CTF比赛那么容易获奖吗?很多比赛还都没听过…还有个感受,两极分化严重,好的确实不错,踏实;实际没啥东西的一般自我感觉良好』 &/p&&p&&br&&/p&&p&…………………………………………引言自安全圈某大佬……………………………………&/p&&p&&br&&/p&&p&回顾起三个月前的自己,就是大佬所吐槽的那一类人。『8个的渗透渗透测试其实是黑盒漏洞测试』emm...毕竟白盒代码审计不会嘛 『提权、与渗透等后渗透部分基本是0』爆破出一个弱口令就高兴坏了赶紧去提交了,生怕被人重复了,提权?后渗透?什么鬼,能吃吗? 『8个里问到怎么发现的漏洞,能有7个说不清楚』要是都能说清楚还怎么继续做菜逼啊!CTF部分不解读,自己不玩CTF。玩笑归玩笑,大佬说的这几点都是直击要害的,对很多刚入门想要从事安全,吃这口饭的人,反思过后补足自己的不足才是正道。&/p&&p&那么我是如何从放弃到入门,最后顺利找到一份安全工作的,以下,大佬可以撤退了,萌新或者有一点基础却不知道如何入门的小菜,可以看看。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-921eca9dec445a159742_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&553& data-rawheight=&38& class=&origin_image zh-lightbox-thumb& width=&553& data-original=&https://pic3.zhimg.com/v2-921eca9dec445a159742_r.jpg&&&/figure&&p&&br&&/p&&p&为了避免空口说瞎话的嫌疑,这里贴上我个人在菜鸟src的排名,目前还有若干漏洞的积分没加上来,暂时排16位。&/p&&p&二、刷src需要做哪些准备&/p&&p&
1.首先你得准备好一个自己搭建的乌云漏洞库(也可以直击用网上的景象,但不建议,以前偷懒就直接用在线的,但是好多个开一会儿就关了或者就没了,老老实实自己搭一个吧)&/p&&p&这里推荐GitHub上的一个虚拟机项目:&u&&a href=&http://link.zhihu.com/?target=https%3A//github.com/hanc00l/wooyun_public& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&github.com/hanc00l/wooy&/span&&span class=&invisible&&un_public&/span&&span class=&ellipsis&&&/span&&/a&&/u& 下这个↓&/p&&figure&&img src=&https://pic4.zhimg.com/v2-eca3d3a6f6a0f0b785fb_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&554& data-rawheight=&300& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&https://pic4.zhimg.com/v2-eca3d3a6f6a0f0b785fb_r.jpg&&&/figure&&p&&br&&/p&&p&下载好之后直接拖到虚拟机里运行,打开后,ifconfig 能看到搭建的虚拟机服务器占用的局域网网点,在本机浏览器打开便可以开始看了。!漏洞库一定要刷,这个是最直接的让自己了解安全全貌的方式。也是成长最快的路径!&/p&&p&(Tips:这个漏洞库好在可以查询关键字,但是关键字查询如果多页,但是没法翻页,这里可以通过在url后拼接 &page=2 来实现翻页 例如:
&u&&a href=&http://link.zhihu.com/?target=http%3A//192.168.190.129/searchbug.php%3Fdetail%3Don%26q%3Daspcms%26page%3D2& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&192.168.190.129/searchb&/span&&span class=&invisible&&ug.php?detail=on&q=aspcms&page=2&/span&&span class=&ellipsis&&&/span&&/a&&/u&)&/p&&p&&br&&/p&&p&2. 你需要准备一些常规的渗透工具,并且知道常规的一些用法,例如kali(集成了sqlmap,nmap,python运行环境)、burpsuite、layer的域名爆破或者 lijiejie在GitHub上的项目 subdomain.py 。另外推荐一个指纹识别的网站&a href=&http://link.zhihu.com/?target=http%3A//www.yunsee.cn& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&yunsee.cn&/span&&span class=&invisible&&&/span&&/a&。&/p&&p&Tips:layer子域爆破用的是字典,比较暴力,但是会占用cpu,subdomain比较灵活,可以搭配着来,另外,Googlehacking语法也是一个很重要的搜索子域名,后台,敏感文件的方式,这里不再赘述。&/p&&p&在用yunsee做指纹是别的时候,有时候可以找到一些通用型系统,比如用友,金蝶,或者一些开源cms,这种时候就可以在乌云漏洞库里搜索相关漏洞,对新手来说,这是一个边实践边学习的过程,复测过一次,下次就知道了。另外乌云漏洞库做搜索的时候,可以搜索一些存在漏洞的目录,比如用友系统的 /uapws/ 。自己实际碰到的可以举一反三。&/p&&p&&br&&/p&&p&3. 找一个稳定流畅的vpn,这个不光光是一个渗透的习惯,wooyun 16年关站,所以漏洞库的漏洞也定格在了那里,有时候就需要上&a href=&http://link.zhihu.com/?target=https%3A//www.exploit-db.com/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&exploit-db.com/&/span&&span class=&invisible&&&/span&&/a&去搜索一些最新漏洞的exp,这个网站用的google的验证码,没vpn是没法搜索的。实际渗透中,之前有挖到一个zabbix的注入,这个就是在exploit-db上找到的exp。&/p&&p&Tips:&u&&a href=&http://link.zhihu.com/?target=https%3A//www.exploit-db.com/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&exploit-db.com/&/span&&span class=&invisible&&&/span&&/a&&/u& 上的exp并不全,最全的是 &u&&a href=&http://link.zhihu.com/?target=http%3A//cve.mitre.org/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&cve.mitre.org/&/span&&span class=&invisible&&&/span&&/a&&/u& 在上面可以搜索年份或者组件信息,搜索出cve编号,找不到cve相关的exp可以去GitHub上直接搜cve编号。&/p&&p&4. 对可能存在的漏洞类型,大概要有点b数,这里给一个流出的绿盟的加固手册。&a href=&http://link.zhihu.com/?target=https%3A//wenku.baidu.com/view/d5be5aae45c3b35c2a5.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&wenku.baidu.com/view/d5&/span&&span class=&invisible&&be5aae45c3b35c2a5.html&/span&&span class=&ellipsis&&&/span&&/a&对照这个手册看一下,里面有些漏洞虽然老,比如heartbleed,但是还是存在的。&/p&&p&5. 在微博或者Twitter多关注一些大牛,一手漏洞都是从这上面流出来的,比如前不久的weblogic的RCE。&/p&&p&三、怎么刷&/p&&p& 1.每个src大佬,都有一套属于自己的渗透测试流程,该怎么刷其实得根据自己实际情况来,但是有一些常识,能够让你少走一些弯路。『前台相对安全,大多数漏洞都在后台』,这句话严格来说,不完全对,因为前台同样会存在很多危害严重的逻辑漏洞,csrf,xss,钓鱼之类漏洞,只是相比较来说,前端框架下,很多时候只是给用户呈现html页面,或者用的一些流行框架,很多功能点都在后台。后台有身份认证的一道关卡,开发人员在开发的时候会忽略一些对参数的过滤,以及黑名单白名单的限制,只是相对而言。至于『渗透70%要看信息搜集』这句也是对上面一句的衍生,很多时候通过一个弱口令进入后台,找出一堆sql注入,xss,甚至上传getshell,甚至一个vpn弱口令进入内网,都是常规操作。&/p&&p&2.渗透讲究一个耐心,仔细。域名搜集得怎么样了,每个ip有没有用nmap去扫过端口,自己实战中就碰到过nmap扫端口结果出来一个列目录漏洞,有很多敏感信息,直接就是严重级别的漏洞。还有在测试逻辑漏洞的时候,参数每个都看过了吗?一整套流程的包都抓过了吗,有没有另外备一台手机,或者手机小号来接受短信?发现参数改负过滤了,那么有没有尝试订单合并来绕过呢?很多时候我们不能像审计牛那样直接把源码审一遍,然后提一个rce,技术有限的前提下,我们能做到的就是耐心,仔细。&/p&&p&四、一路走来的感悟&/p&&p&我相信很多新手,会困惑一个问题,为什么要学习一门编程语言。这个问题在我提交了一些高危漏洞之后,以及实际工作之后渐渐明白其中的意义。简单的说,网上的exp,你看不懂payload没有问题,但是python脚本你得会用吧?简单的修改得会吧?实际工作中,上手的一个app项目,数据包是用加密传输的,用了aes的加密。可能很多时候碰到这样的,换做是我,还没在工作的时候,就放弃了,去测别的吧,但是现在这是工作了,你该怎么办?&/p&&p&App首先要脱壳,不会,现学。脱壳完了之后反编译,不会,现学。反编译之后去源码里找key,偏移值,去溯源加密方式,Java代码看不懂怎么办?这些问题,事后都顺利解决了,但是最重要的是让我明白懂代码的含义。&/p&&p&安全,不只是web安全。通过web入门应该说是比较容易的,也让我这个大学学的文科的人顺利找到了一份安全工作。但是这远远不够,如果只会这些皮毛,脚本小子都算不上,只有不断学习,前面的路才一片广阔。&/p&
一、瞎扯部分 『现在安全技术岗招人拿到的简历,除了工作比较久的,大部分的应届毕业生啥的,10个里能有近9个写有渗透测试能力,然后9个里,8个的渗透测试其实是黑盒漏洞测试,提权、域渗透等后渗透部分基本是0,8个里问到怎么发现的漏洞,能有7个说不清楚…
谢邀。&br&首先声明个人不是老饕,对美食实在没什么研究,各位看官在口腹方面只好将就一下了。&br&另外,本文最后有福利哦~(请不要直接跳到最后好吗!!!)&br&&br&好吧,假如一个人一辈子只有一次机会来杭州玩一天(怎么会这么惨),那这一天该怎么安排呢……啥也别说了,西湖走起吧。&br&早上到东站城站,地铁1号线到&b&龙翔桥&/b&,这是距离西湖最近的地铁站,在这里办一张Z卡,200元押金,100元卡内充值,这300块钱会给你带来高品质的杭州一日游。&br&&br&『请办Z卡,租车玩杭州』&br&什么是Z卡:&a href=&//link.zhihu.com/?target=http%3A//hot.dahangzhou.com/top/hzzxc/009.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&杭州公共自行车租用IC卡(Z卡)申领使用须知&/a&&br&简而言之,Z卡可以在杭州租借自行车,搭乘公交、水上巴士、的士,虽然暂时还刷不了地铁,但是考虑到杭州地铁作为国内知名的战五渣,随它去吧。&br&当然,其中最重要、最划算、最强大的功能是租借公共自行车。&br&什么是公共自行车:&a href=&//link.zhihu.com/?target=http%3A//www.hzzxc.com.cn/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&杭州公共自行车(免费单车)网站&/a&&br&费用如下:&br&1小时之内:免费&p&1小时以上2小时以内:1元&/p&&p&2小时以上3小时以内:2元&/p&&p&3小时以上:每小时3元&/p&&p&杭州市内目前已有几千个借还车点,西湖东边最密集的地方基本上已经到了每隔百米就有一个点的程度。1小时的免费车程,完全可以从一个点赶到下一个点,实在赶不到,可以中途随便找个借还车点还车再借,再实在找不到,不就1块钱嘛!2小时内还找不到,请打开手机定位,确认你还在杭州……除了免费之外,相比去小店租车,公共自行车还有一个好处,那就是到处都可以还,不用整天担心被盗,找地方看管车辆,最后还得回原地还车。公共自行车几千处借还点,通借通还,高端大气上档次。&/p&&p&这样的便宜,你不去占一下,简直令人发指。等你晚上离开杭州之后,就算你觉得西湖不过是个大池塘,你起码会因为自行车而对这个城市恋恋不忘。&br&&/p&&p&(补:貌似如今地铁站办的卡都改叫杭州通了,初次办卡可以预存300元,在第一次租用自行车后,系统会自动将其中的200元转为押金。)&/p&&br&&p&『和自行车在一起的小亭子』&/p&&p&所有的自行车借还点都配有一个小亭子,景区内这个小亭子一般都是旅游咨询点,可以拿到大量的免费旅游指南册页,包括制作足够精良的杭州地图、主题区分非常细致的专题旅游攻略。&/p&&br&&p&&b&步行/骑行路线图&/b&大致如下(这么一看我都为那些你们错过的景致而心痛不已,要是谁看了这篇回答真的只在杭州安排一天游玩时间我会吐血的好吗!):&/p&&p&&figure&&img src=&https://pic1.zhimg.com/50/bc9fbd764f2bde73e72b_b.jpg& data-rawwidth=&846& data-rawheight=&579& class=&origin_image zh-lightbox-thumb& width=&846& data-original=&https://pic1.zhimg.com/50/bc9fbd764f2bde73e72b_r.jpg&&&/figure&如果不算游玩的步程,全程大概也就十几公里的样子,排除自行车搞定的苏堤白堤南山路(但在白堤上骑车不好找归还点,而且游孤山肯定是徒步更便利),其实不会太累,但我个人觉得这条线路还是略赶,实际走下来时间肯定是不够用的,所以大家看自己的兴趣有所取舍吧。顺便说一句,哪怕只是做个图,我舍北山街而取道白堤都心痛不可遏啊,果然是骨灰级的杭州脑残粉。&/p&&p&(想到最近在北京跑步,每天七公里,能在奥森跑已经是幸福感飙升了,可回想在杭州的日子,天天能与西湖为伴……捂住胸口痛哭一场。)&/p&&br&&ul&&li&『看到西湖之前是不是该做点什么』&br&&/li&&/ul&&p&先把想要看到西湖的激动心情整理一下,从龙翔桥往北沿延安路先去参观一下&b&马寅初纪念馆&/b&(全国重点文物保护单位,简称“国保”,下同)和&b&浙江省高等法院和杭县地方法院旧址&/b&(浙江省文物保护单位,简称“省保”,下同),后者辟为杭州城建展览馆,可以大致了解现代的杭州什么样。路口附近就是&b&庆春路购书中心&/b&,可以进去买一本杭州攻略,比如《寻城记·杭州》,虽然很不待见这个系列,但是以旅行类图书整体之糟糕,也让这本文保类的烂书看起来还算不错了。(补:最近的好消息是,国际知名旅行指南Lonely Planet系列终于出了《浙江》本,对于普通游客来说,这本指南足够使用。虽然仍有很多不足之处,但还是非常推荐买这本书。)如果你还想压抑一下看西湖的迫切心情,请继续往北至延安路凤起路路口,这里有杭州最古老的地面建筑&b&龙兴寺经幢&/b&(国保),上刻有佛顶尊胜陀罗尼经,讲的是什么呢?哦,这些都不重要。。。重要的是这个陀罗尼经啊传说尘沾影附有奇效,不要说看过读过经文绕经幢走上那么一圈两圈能够身后超度升天,乃们只要被经幢上的灰尘沾染,或者一不小心走进了经幢的影子,不管什么前世的罪孽今生的恶道,统统被超度啦!(话虽这么说,还是不要乱来好吗!)&/p&&p&走马观花地看完了无关痛痒的三个点(楼主突然想起了你们一日游观光客的身份!),我们沿着庆春路/凤起路(骑车)来到了西湖边。&/p&&br&&ul&&li&『终于来到了西湖边』&br&&/li&&/ul&&p&从&b&钱塘门遗址&/b&出发,我们就出了古代意义上的杭州城了。出城这种事情,在古代是很值得写上几首诗的,是不是有一大波的诗词歌赋涌上了乃们的心头!?什么?一首有关西湖的诗词都不记得?看来很没文化嘛。。。不过既然如此,西湖边立着的那块“杭州西湖”的大石头一定很合你们的口味了!&/p&&p&有文(jiao)化(qing)的朋友们,请沿着&b&圣塘路别墅群&/b&、&b&马可波罗像&/b&、&b&风波亭&/b&(当然是假的了)、&b&蒋经国故居&/b&来到断桥边。&/p&&p&&b&断桥残雪&/b&(西湖十景)近在眼前,你一定忍不住要走上去邂逅一段美丽的爱(yue)情(pao)了吧!喂喂!别真的摇陌陌好吗!&/p&&br&&ul&&li&『这时我们面临两个选择』&br&&/li&&/ul&&p&学究线:走上&b&断桥&/b&,沿着&b&白堤&/b&饱览西湖风光,一不留神就走上了&b&孤山&/b&,哇晒!西湖的精华就在这里了!你发现有&b&平湖秋月&/b&(西湖十景)、&b&浙江省博物馆孤山馆区&/b&(镇馆之宝都在武林馆区,玛蛋!)、&b&西湖美术馆&/b&、&b&浙图古籍部&/b&(省保、四库全书在这里)、&b&文澜阁&/b&(国保)、&b&清行宫遗址&/b&、&b&中山公园&/b&、&b&林逋墓及舞鹤赋&/b&&b&石刻&/b&、&b&西泠印社&/b&(国保)、&b&秋瑾墓&/b&(省保),过了&b&西泠桥&/b&,就是&b&苏小小墓&/b&了。如果你喜欢,坐船进&b&三潭印月&/b&(西湖十景)吧,55块钱泛舟西湖,小意思啦。&/p&&br&&p&呆萌线:断桥右首不远处有条小路可以爬宝石山,&b&保俶塔&/b&(国保)下可以鸟瞰西湖,你看了一眼,就美呆了!下山路上去看看&b&抱朴道院&/b&、&b&连横纪念馆&/b&,回到&b&北山街&/b&(国内最美马路没有之一),一侧是西湖,另一侧是&b&北山街近代建筑群&/b&(省保),北山街走到头就是&b&岳庙&/b&(国保)和&b&曲院风荷&/b&(西湖十景)。&/p&&br&&ul&&li&『汇合了』&br&&/li&&/ul&&p&两条路线汇合为了要做一件事情,骑车游&b&苏堤&/b&。&/p&&p&当然也可以选择幽静的&b&杨公堤&/b&,但既然只有一天,不去苏堤无论如何是说不过去的。沿途赏&b&苏堤春晓&/b&(西湖十景之首),堤的西侧可以远观&b&双峰插云&/b&(西湖十景),从&b&蒋庄&/b&出了苏堤,就是&b&花港观鱼&/b&(西湖十景),再出花港观鱼,就是&b&太子湾&/b&了。太子湾这个地方非常杭州,至于怎么杭州,自己来看看吧。&/p&&p&太子湾公园里面有&b&章太炎墓&/b&(省保)&b&、张苍水墓&/b&(省保)与纪念馆(当然这些不是重点,重点是公园本身),出公园东行,就是&b&南屏晚钟&/b&(西湖十景)和&b&雷峰塔&/b&,之前没有上宝石山鸟瞰过西湖的学究们,花40大洋进去鸟瞰一番吧。&/p&&p&向前来到南山路,&b&浙江美术馆&/b&在南山路的东侧。作为国内目前最大最新最现代化的美术馆之一,浙江美术馆绝对不会让你失望,如果运气好,赶上了诸如“东西贯中”、“煌煌大观”之类的大型展览,那绝对是值得专门安排一天甚至几天来看展听讲的。美术馆里有家书店,顶层的霞光阁可眺望西湖,地面一层北侧的休息厅可以晒太阳。馆内有免费的WIFI,记得多关注官网和美术馆的微博,常有活动可以预约。&/p&&p&继续向前即是&b&柳浪闻莺&/b&(西湖十景),这样,西湖一圈基本走完了,我们走上长桥,发现“孤山不孤,断桥不断,长桥不长”的&b&西湖三绝&/b&已经集齐了。这里是梁祝十八相送的地方,而你和西湖离别的时刻就要到了,可南宋时期的西湖十景还欠着最后一个,于是你带着无限悔恨和不甘,不舍地回头看了一眼——雷峰塔上看不到的&b&雷峰夕照&/b&(西湖十景)居然出现了。&/p&&p&你可以召唤神龙了。&/p&&br&&ul&&li&『夜晚,补课的时间到了』&br&&/li&&/ul&&p&夜晚的南山路别有风情,找个酒吧坐坐,或者找间茶室品一下龙井,夫复何求啊。&/p&&p&但免不了有贪心的人儿打了鸡血不忍错过杭州的一切(那为什么只在杭州安排一天!?),从南山路骑车来到杭城夜生活另一个聚集地,&b&清河坊&/b&。吴山广场南侧是&b&城隍阁&/b&和&b&杭州博物馆&/b&(这个点估计早就关门了,不过不要紧,你只不过因此错过了国宝级的战国水晶杯而已,比起你之前错过的浙博武林馆来说,这点损失根本不算什么),附近还有&b&杭州碑林&/b&(省保,但晚上才来的你什么也看不到,哈哈哈!),作为弥补,你沿清河坊参观&b&铜雕博物馆&/b&(私人博物馆,开放到晚9点,免费)和&b&胡庆余堂&/b&(国保),进去拿杯免费的凉茶。从&b&四拐角&/b&进入&b&中山路&/b&,一路向北,有&b&中山路近代建筑群&/b&、&b&南宋御街陈列馆&/b&、&b&凤凰寺&/b&(国保、东南沿海四大清真寺之一,有幸去过四大清真寺的我最喜欢的就是凤凰、麒麟两寺了,安静、肃穆、友好,开放直到下午5点,但晚上如有活动,或许可以凭借足够的诚意进去感受一番)和&b&浙江兴业银行旧址&/b&(国保),至此,走了一天西湖环线的你,终于无力而勉强地补上了杭州这个吴越南宋故都的中轴线。&/p&&br&&ul&&li&『吃货和败家玩意儿请看』&br&&/li&&/ul&&p&清河坊、中山路上有一些不错的食店,&b&咬不得&/b&的生煎、&b&五芳斋&/b&的粽子、&b&奎元馆&/b&的面条、&b&新丰&/b&的小笼、&b&知味观&/b&的各色小吃,都是值得一试的杭州味道。如果你不是一个人(不是一个人啊不是一个人),那么可以拉上小伙伴去&b&外婆家、新白鹿、绿茶&/b&之类的餐厅,这类餐厅价格实惠、味道尚可,还能够假装自己尝过了杭帮菜,不过等位总是在所难免的。&/p&&p&同样,中山路和清河坊也是广大人民群众喜闻乐见的败手信的好地方,在没有熟人指导又没有火眼金睛的情况下,你既成心不想买到正宗特产,又嫌口袋里的人民币烧得慌,那么,土豪请和我做朋友!&/p&&p&作为书店控,我要推荐一下中山路上的&b&晓风书屋&/b&分店,晓风是杭州比较知名的书店品牌,这家分店店面不大,但能找到品位不错的明信片、手绘地图,当然也有不少旅游图书了,看上喜欢的可以买上一本带着回程看吧。&/p&&p&另外,浙博、浙美里的纪念品商店都值得一逛,明信片的品质算是国内各博物馆中比较入流的。&/p&&br&&p&==================节操掉进了西湖里的分割线===================&/p&&br&&p&『终于,到了离开的时刻』&/p&&p&经过了一天辛苦的跋山涉水,你们一定已经累坏了,于是你提前赶到了车站机场想要趁着等车等灰机的时间歇歇脚。&/p&&p&但是,好像总觉得有点什么不对。。。&/p&&p&这时候,想必聪(diao)明(si)的读者已经想到了,还有三百块钱存在Z卡里面啊,到哪里去退卡呢?&/p&&p&啊哈哈哈哈哈!!!!!身在车站或机场的你已经退不了啦!&/p&&p&就算你回到了市区,有小伙伴告诉我说,Z卡退卡是要三天之后才可以啊哈哈哈。&/p&&p&那么,只好欢迎你下次来杭州喽~~~~~&/p&&br&&p&==================节操奋力地游回岸边的分割线===================&br&&/p&&br&&p&『福利』&/p&&p&既然乃们这么辛苦地看完了,给大家一个福利吧。&/p&&p&辛苦整理的地图(不断完善中),全浙江的国保单位、博物馆、世界遗产地、历史文化名城名镇名村都已在里面了:&a href=&//link.zhihu.com/?target=https%3A//mapsengine.google.com/map/edit%3Fmid%3DzoKx5yZL9u1Q.kbrIQFsHmIlE& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Zhejiang's Cultural Sites&/a&&/p&&br&=============节操不可思议地在湖岸边溺毙了的分割线===============&br&&br&是不是发现福利部分对于了解这个攻略很有用呢?而你一开始却乖乖听了楼主的话没有发现福利导致看得云里雾里不知所云呢?那么,英雄!请从头来过吧!&br&哈哈哈哈哈!
谢邀。 首先声明个人不是老饕,对美食实在没什么研究,各位看官在口腹方面只好将就一下了。 另外,本文最后有福利哦~(请不要直接跳到最后好吗!!!) 好吧,假如一个人一辈子只有一次机会来杭州玩一天(怎么会这么惨),那这一天该怎么安排呢……啥也别…
&figure&&img src=&https://pic2.zhimg.com/v2-4b2ccc44513b8_b.jpg& data-rawwidth=&640& data-rawheight=&640& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic2.zhimg.com/v2-4b2ccc44513b8_r.jpg&&&/figure&&p&很多刚接触健身的朋友&/p&&p&不知道该怎么练&/p&&p&对不同部位的锻炼方法&/p&&p&今天就带来一套健身计划&br&&/p&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-fac0e8bc5d4a17ecf8f75df6a68fe18d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&640& data-rawheight=&758& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic2.zhimg.com/v2-fac0e8bc5d4a17ecf8f75df6a68fe18d_r.jpg&&&/figure&&p&&br&&/p&&p&一周六练,每次一小时左右&/p&&p&选择8-12次力竭的重量&/p&&p&每个动作4-5组,每组8~12次&/p&&p&动作间休息30秒&/p&&p&组间休息1分钟&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-41ec9c9f800adcd82860dd2e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&640& data-rawheight=&640& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic3.zhimg.com/v2-41ec9c9f800adcd82860dd2e_r.jpg&&&/figure&&p&&br&&/p&&p&&b&Day1:胸&/b&&/p&&p&上斜俯卧撑&/p&&p&(热身)&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-6fa04b26fd12e179d2bbaf0baafae347_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&365& data-rawheight=&205& data-thumbnail=&https://pic4.zhimg.com/v2-6fa04b26fd12e179d2bbaf0baafae347_b.jpg& class=&content_image& width=&365&&&/figure&&p&&br&&/p&&p&(史密斯)平板杠铃卧推&/p&&p&(4组×12次)&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-89df5df33c2f4451daf3fc_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&356& data-rawheight=&200& data-thumbnail=&https://pic1.zhimg.com/v2-89df5df33c2f4451daf3fc_b.jpg& class=&content_image& width=&356&&&/figure&&p&&br&&/p&&p&平板哑铃飞鸟&/p&&p&(4组×12次)&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-3bb564b9dad6e40b39534_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&356& data-rawheight=&200& data-thumbnail=&https://pic1.zhimg.com/v2-3bb564b9dad6e40b39534_b.jpg& class=&content_image& width=&356&&&/figure&&p&&br&&/p&&p&上斜杠铃卧推&/p&&p&(4组×12次)&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-0c99bcbdeced05e2f2ce1a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&356& data-rawheight=&200& data-thumbnail=&https://pic1.zhimg.com/v2-0c99bcbdeced05e2f2ce1a_b.jpg& class=&content_image& width=&356&&&/figure&&p&&br&&/p&&p&拉力器夹胸&/p&&p&(4组×12次)&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-e84b0ffdc3f_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&365& data-rawheight=&205& data-thumbnail=&https://pic4.zhimg.com/v2-e84b0ffdc3f_b.jpg& class=&content_image& width=&365&&&/figure&&p&&br&&/p&&p&

我要回帖

更多关于 如何提权 的文章

 

随机推荐