精华内容
下载资源
问答
  • 动态规划解题步骤

    千次阅读 2020-04-06 21:55:23
    动态规划解题步骤? 判断原问题是否能用递归解决 分析递归过程中是否存在重复子问题 采用备忘录法记录重复子问题的解(剪枝) 改用自底向上的地推(动态规划) 我们以编辑距离为例来分析上面的步骤: 给你两个...

    动态规划解题步骤?

    • 判断原问题是否可递归求解
    • 分析递归过程中是否存在重复子问题
    • 采用备忘录法记录重复子问题的解(剪枝)
    • 改用自底向上的递推(动态规划)

    我们以编辑距离为例来分析上面的步骤:

    给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。

    你可以对一个单词进行如下三种操作:

    插入一个字符
    删除一个字符
    替换一个字符

    示例 1:

    输入:word1 = “horse”, word2 = “ros”
    输出:3
    解释:
    horse -> rorse (将 ‘h’ 替换为 ‘r’)
    rorse -> rose (删除 ‘r’)
    rose -> ros (删除 ‘e’)

    分析:

    1、当第一个字符串的第一个字符和第二个字符串的第一个字符相同时,对结果没有增益效果。
    2、当第一个字符串的第一个字符和第二字符串的第一个字符不相同时,有三种情况

    a.插入一个字符
    b.删除一个字符
    c.替换一个字符

    递归加备忘录:递归加备忘录
    动态规划:
    在这里插入图片描述

    展开全文
  • 动态分析Android App之动态调试

    千次阅读 多人点赞 2019-08-24 18:36:38
    动态分析Android App之动态调试 这个系列一共有五篇左右,内容主要介绍如何动态分析和调试Android App,和网上其他教程相比,内容更充实,体系更健全,深入而浅出。闻道有先后,术业有专攻,希望能给刚入门Android...

    这个系列一共有五篇左右,内容主要介绍如何在Java层动态分析和调试Android App,和网上其他教程相比,内容更充实,体系更健全,深入而浅出
    闻道有先后,术业有专攻,希望能给刚入门Android逆向的同侪们些微帮助。出于各种原因,文章有两个遗憾,一是只包含了Java层代码的动态分析和调试,Jni和Native层并没有涉及;二是对Hook框架的介绍和使用不是很充分,因为Hook值得另外很多个五篇去写。逆向太深太广了,吾辈将上下而求索。

    本篇内容所涉及到的资源
    链接:https://pan.baidu.com/s/14ZF-7pop4NbrDPydtRQOeg
    提取码:8fs8

    一、认识动态分析Android程序

    我们将需要运行应用程序才能实施和完成的分析方法统称为动态分析方法,不要被这个名词吓到了,抓包、动态调试、观察App页面的UI设计和交互、使用Xposed/Frida Hook App中某个函数、Smali插桩等等,这些都可以称为动态分析,有时候我们也会认为Smali插桩是一种静态的技术,但这里不用过分区分和计较,我们最应该关注的是技术和思路。
    这个系列会逐一讲解和介绍这些动态分析工具的使用,为了防止我讲的不够清楚,每一个知识点和技术都会配上数篇详细可靠的同类型文章。当然,你也可以直接Google获取这些知识,但需要稍加甄别搜索到的内容。我们第一篇说一下Smali动态调试。

    1.1 什么是Smali动态调试?

    调试分为源码级调试和反汇编级别调试,源码级调试是什么自然不用说,程序员大多都使用过诸如Pycharm这样的IDE对自己的程序进行过源码级调试,从而了解程序运行情况,分析程序的执行流程,观察变量的动态值等。而我们进行逆向分析时,手里不可能有App的源码,这就需要进行反汇编级的调试,也就是我们常说的的Smali动态调试。

    当我学习Smali时,产生过各种各样的困惑,smali是什么?我写的是java代码,怎么变成smali了?为什么可以smali代码可以调试?Jadx反编译出来的java代码如此优雅,能不能根据这些代码进行源码级调试?
    我们一一来探讨这些问题。

    从Java源码到编译打包成APK文件,会经过非常复杂和繁多的步骤,我们这里只关注代码的编译过程。

    Android平台上主要使用Java语言来开发程序,但Android上的程序运行机制和标准的Java程序并不一样。
    我们先看一下Java程序从编写到执行的过程

    第一步:编写Java代码
    第二步:所有的Java代码通过Java编译器被编译成java字节码,即.class文件
    第三步:Java字节码在Java虚拟机上被解释成机器语言后,程序执行
    

    在这里插入图片描述
    手机系统内存和处理器速度有限,为了解决运行效率的问题,以及摆脱和Java母公司的版权纠纷,Google开发了Dalvik虚拟机,Android程序就运行在其上,我们来看一下App中Java代码的编译过程。

    第一步:编写Java代码
    第二步:所有的Java代码通过Java编译器(javac)被编译成Java字节码,即.class文件
    第三步:Java字节码通过Android 的dx工具转换为Dalvik字节码,即.dex文件
    第四步:Dalvik字节码在Dalvik虚拟机上运行
    

    在这里插入图片描述
    现在我们已经知道解压Apk后,那些奇怪的dex是哪来的了,那Smali又是哪来的呢?
    我们看一下Smali代码长啥样
    在这里插入图片描述
    首先澄清一下这两个概念

    反汇编:将可执行的文件中的二进制经过分析转变为汇编程序。
    反编译:将可执行的程序经过分析转变为高级语言的源代码格式,一般完全的转换不太可能,因为有编译器的优化等因素在里面。

    各种各样反编译工具几乎都用到了Baksmali这个工具,我们来看一下它和孪生兄弟的介绍:

    Smali,Baksmali分别是指安卓系统里的Java虚拟机(Dalvik)所使用的一种.dex格式文件的汇编器,反汇编器。
    其语法是一种宽松式的Jasmin/dedexer语法,而且它实现了.dex格式所有功能(注解,调试信息,线路信息等)。
    Smali,Baksmali分别是冰岛语中编译器,反编译器的叫法。

    也就是说,Smali代码是利用Baksmali反汇编(disassemble)dex文件得到的一种类汇编代码,它完整的实现了.dex格式所有功能(注解,调试信息,线路信息等),谈起Smali和dex之间的关系,我们常常称为转化(convert),即还原度极高,这也是Smali可以胜任动态调试的重要原因。而利用Smali汇编器,我们可以修改Smali代码,重新编译成dex文件,进一步可以对Apk进行重打包。

    在这里插入图片描述
    在黑产中,这也是无数盗版应用、破解版应用、功能增强应用、去广告版应用的实现原理。
    在这里插入图片描述

    而我们这些只是想分析App通信协议的程序员,也可以简单的修改Smali进行“Smali插桩”,通过log探针输出一些可疑的信息,或者根据探针是否触发,探测程序运行逻辑。

    提到Smali插桩,玩法也不少,Android逆向人员在仰望星空时,或多或少都渴望过一种破解App的暴力美学——让每一行代码都自动吐出来一句话“爷,我在这儿,我是干嘛的,我前面又是啥。”
    换成可以通过代码实施的方案,也就是在每个方法内打印调用栈或者log输出一下它在哪个方法里,该怎么做呢?方法非常多,我们看一下暴力插桩的三个思路。

    1.直接对smali代码进行文法分析,写一些正则表达式的判断,实现在每行代码后面加上log输出的Smali代码,然后使用Smali汇编器编译成dex文件,进而重打包Apk,最后运行App查看log输出。具体实现可以参考这篇文章,实现出来的效果也很不错实现出来的效果也很好。
    《Android应用逆向——分析反编译代码之大神器》 https://blog.csdn.net/charlessimonyi/article/details/52027563
    在这里插入图片描述
    2.直接对Dex进行操作,可以使用的工具有ReDex,Dexter等。但由于Dalvik发展尚浅,且由于Dalvik字节码比Java字节码的结构更加紧凑,所以修改起来比较复杂,笔者暂时没有看到逆向中应用Dex插桩的具体实现。

    3.既然Dex紧凑而且不好搞,那能不能搞Java字节码进行插桩呢?答案是完全可以的,对Java字节码进行操作的工具非常多且成熟,可以通过AspectJ、Asm、javassit等工具对Java字节码进行操作。下面这个工具,就是将Dex文件转换为Java字节码,再使用asm操作字节码,最后再用dx工具(Android Java代码编译流程第三步中提到的Android自带工具)编译成dex,进而重打包Apk,最后运行App查看log输出。
    《带你开发一款给Apk中自动注入代码工具icodetools》
    https://blog.csdn.net/jiangwei0910410003/article/details/53386071

    Smali和Smali插桩就介绍到这儿了,感兴趣的同学可以去试一下。
    讲道理,我们应该先花一万字讲一下smali语法和smali如何实现基础的插桩,但动态调试Smali实在是方便又迷人,我发誓,在掌握Smali动态调试后,你们很快就会将又麻烦又容易出错的Smali插桩忘在脑后。

    但这绝不意味着我们就不需要能看懂和理解Smali语法了,原因主要有两个

    1. Smali动态调试基于Smali代码,断点该下在哪里,程序跑到哪儿了,如何查看调试中的变量值……这些都需要你稍微懂一些Smali语法。
    2. Jadx之类的工具虽然号称做到了Dex到Java的一站式反编译(Dex to Java decompiler),但在其内部,是先将Dex反汇编成smali,再用asm将smali转成class字节码,最后解析查看Java代码。如果说Dex到Smali是一种convert(转化),得到的是可调式、精准靠谱的源码,那么Dex到Java就是一种translation(翻译),虽然看着可能还不错,但其实和源码相差甚远,只能称为Java伪代码,正因为相差甚远,所以我们才无法使用Jadx反编译出来的java代码进行源码级的调试,而只能进行稍显晦涩的Smali调试。所以你可能会在使用Jadx反编译过程中遇到部分逻辑无法翻译成java代码的情况,或者翻译的Java代码和真实的Smali逻辑有差异,这个时候就需要老老实实看Smali代码。

    在下一篇中,我们将结合小红书应用来讲解Smali的语法,这一篇的主角还是实现如何进行动态调试。

    1.2 为什么要进行Smali动态调试?

    动态调试能更充分的展示程序的运行逻辑,简而言之倍儿爽。

    1.3 不能进行Java调试吗?

    在上面我们已经讲的很清楚了,反编译得到的Java代码只是一种翻译而来的伪代码,它无法支撑其源代码级的动态调试。

    接下来我们开始动态调试Smali之旅。

    二、推开调试之门

    出于安全考虑,Android系统并不允许应用被随意调试,官方文档称需要满足二者之一的条件。

    1.App的AndroidManifest.xml中Application标签必选包含属性android:debuggable=“true”;
    2./default.prop中ro.debuggable的值为1;

    我们先来看第一个条件有没有办法满足,首先,发行版的App都会将debuggable设置为 false,使第三方不能直接调试分析APP,这也是厂商出于安全的考虑,那我们就需要反编译Apk,修改后进行重打包,这也是绝大多数教程的做法,但我个人非常非常不建议这么操作,因为重打包容易遭受无妄之灾,这也是我不喜欢Smali插桩的原因——它们需要重打包App
    你想研究App的通讯协议和加密字段,这已经足够让人焦头烂额,你可能会遇到繁杂的代码、诡异的反抓包,So层的加密……而如果你对App进行重打包,那就要面对App额外的保护措施,比如重打包失败,签名验证等。因为重打包这个操作主要是开发盗版App和破解版App做的事,这对厂商来说更加难以忍受,只是修改一个debuggable字段就要揽上这么多事,显然吃力不讨好。

    那第二个条件好满足吗?default.prop 文件非常好找,它就在Android的根目录下,我们可以通过ES文件浏览器找到它。
    在这里插入图片描述
    在这里插入图片描述
    很不幸的发现,这台手机的debuggable标识为0,不可调试。一个朴素的想法是直接修改这个值不就可以了?但是这是不可以的,这个值只在系统启动时,也就是开机时才会读取和加载一次。那重启?抱歉,每次重启,这个值就会恢复默认。所以就造成了一个死循环。
    那我们是怎么解决它的呢?有这样几种办法。
    1.改写系统文件,修改ro.debuggable为1,重新编译系统镜像文件,刷入设备。
    难度稍大,但一劳永逸,缺点是对新手很不友好。可以参考这篇文章,https://bbs.pediy.com/thread-197334.htm。
    2.注入init进程,修改内存中ro.debuggable的值,这个也是之前惯常的做法。
    通过大佬写的mprop工具可以修改内存中所有的属性值,只需要按照操作步骤,cmd敲七八行即可,还有人出了一键式的bat脚本。资源放在了我分享的百度资源里,大家也可以去制作者那儿下载。https://bbs.pediy.com/thread-223294.htm。 需要注意的是,因为是修改内存值,所以文件中的ro.debuggable值并不会变化,且每次重启设备都要重新注入。
    3.使用开发版/测试版的手机系统,ro.debuggable值常常为1
    4.使用模拟器,比如雷电模拟器、Genymotion等,许多模拟器天然支持动态调试,尽管defalut.prop中值并不为1,打开adb shell,用getprop ro.debuggable命令查看内存中的debuggable值却为1。
    在这里插入图片描述
    在这里插入图片描述
    5.Xposed Hook系统判定函数,Android系统凭什么判断某个App是一个可调试的应用?从读取AndroidManifest.xml中android:debuggable属性值,到打开这个应用,里面有非常多的门路,找一个合适的时机进行hook,就可以实现狸猫换太子,这需要逆向分析人员了解Android源码,我们这里不去说它,因为成熟的工具已经有很多了,只需要下载Apk,在Xposed中激活后重启手机,就可以一劳永逸。

    • BDOpener 开启APK调试与备份选项的Xposed模块 https://security.tencent.com/index.php/opensource/detail/17
    • Xinstall 如何不重打包调试Android应用 https://www.open-open.com/lib/view/open1426304176732.html
    • BuildProp Enhancer Make all application attribute android:debuggable=“true” https://repo.xposed.info/module/com.jecelyin.buildprop
    • XDebug make all app on your phone debuggable https://github.com/deskid/XDebug

    我个人平时用BDopener,网盘资源中存放了数种开启调试的工具,请自行选择,Xinstall是个十分优秀的Xposed框架,我们日后还会用到它。

    三、选择调试目标

    我猜测你很可能选择了雷电模拟器,或者在真机上装了BDOpener,我并不觉得意外,因为这两种方法确实最为便捷,之所以我们要讲那么多种方法,是为了避免意外,有的机型或者有的App存在闪退行为,这样你就可以求助于另外一个方法。

    我们演示在雷电模拟器上调试新浪博客的一个sign参数,不难,但又不是纸玩具,非常适合我们进行测试。
    下载新浪博客最新版,我在百度云里也放了apk。开启Fiddler/Charles抓包工具后,打开App。
    在这里插入图片描述
    点开一条博客
    在这里插入图片描述
    查看Fiddler,多出四五条数据,根据数据包大小和内容找到我们需要的那一条。
    在这里插入图片描述
    这是一个GET请求,字段有九个
    在这里插入图片描述
    deviceid、chno,appver,appid是固定不变的,Is_default可以不填,login_uid因为没有登录也不用管,article_id是每篇文章的id,显然这个sign是比较好玩的。
    它是64位十六进制数,猜测是两个md5拼接,不太确定哦。

    我们接下来使用Jadx反编译Apk,搜索url链接的末尾部分,即get_article_info.php,放一张之前教程的截图
    在这里插入图片描述
    在这里插入图片描述
    只有m字符串是符合要求,双击代码进去看一下,在这个config(配置)包里,以类变量的方式存放着大量的字符串,如果想引用它,就是b.m
    在这里插入图片描述
    在这里插入图片描述
    右键查看用例,看一下这个url在哪儿被使用了,发现只有一处
    在这里插入图片描述
    双击第二行的代码,查看详细引用
    在这里插入图片描述
    它包装了一个a方法来取我们的目标URL,再次查找用例
    在这里插入图片描述
    点开第一个,你会发现其实它就是a方法上面的那个方法
    在这里插入图片描述
    看到这些代码你应该感到喜闻乐见了,我们发送网络请求,首先就要进行字段的获取和拼接,在Java中往往由集合map完成,格式类似于{”id“:3,“name”:“lilac”},put存入,get取出,这儿就是一个典型的Hashmap。

    它第一步初始化一个map,之后巴拉巴拉放进去很多东西,看着和我们get请求中的字段一致。接下来我们用Smali动态调试跟踪一下集合m从初始化到塞满东西的全部过程
    首先我要说明,这儿不用动态调试也是完全可以的,但App并不总是很简单,可以一目了然。

    首先我们要获取反编译的Smali代码,因为我们的调试就是基于Smali的。你可以使用Apktool敲几行命令完成,但我个人更喜欢可视化的界面,市面上有很多集成了这些工具,可视化拖拽操作的工具。
    我这边演示windows下的操作,工具放在了网盘里,也可以自行搜索下载。
    在这里插入图片描述
    操作选择反编译apk——拖拽apk到源文件——点击操作,依据电脑性能和Apk的大小,反编译所需时间要几十秒到十分钟不等,反编译完成后自动弹出文件目录。
    在这里插入图片描述
    mac可以下载这个工具https://github.com/Jermic/Android-Crack-Tool ,界面和操作几乎和windows中一样。
    在这里插入图片描述
    都讲这么久了,我们都还没说调试工具,是这样的,几乎所有的主流Java IDE配上smalidea插件都可以对Smali进行动态调试,除此之外,JEB也可以直接调试Smali,IDA也有调试DEX的能力,还有Qtrace等等工具,但调试Smali,我只推荐Android Studio+smalidea插件这个组合,操作简单,功能强大,效果也很稳定。

    接下来打开Android Studio(注:Android studio版本需要大于3.0,我个人是3.5Beta版)
    先下载smalidea插件,可以直接用我的百度云链接,也可以去官网下载 https://bitbucket.org/JesusFreke/smali/downloads/
    在这里插入图片描述
    Android Studio–>Settings–>Plugins–>Install plugin from desk…,安装插件;需要注意smalidea路径最好不要有中文路径,可能会出问题。安装好后重启生效。
    在这里插入图片描述
    打开项目【Open an existing Android Studio Project】,选择sinablog文件夹,等待其加载,过程会持续数分钟。
    在这里插入图片描述
    加载完成之后,你需要配置一下JDK和SDK,SDK并不一定要和我一样,29,22……或者别的其他版本都可以。
    在这里插入图片描述
    在这里插入图片描述

    我们要在想要跟踪的程序起始处下断电,重新上一下图,它是类com.sina.sinablog.network.d中的一个a方法,我们要在smali文件夹中找到它。
    在这里插入图片描述
    在目录中,我们可以看到两个smali文件夹,这是由于dex分包造成的,你暂时可以不用理解它,smali1文件夹找不到对应的包,就去下一个找即可,注意要切换到Project目录。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    接下来找到a方法,我们需要了解Smali语法才能读懂它,这一部分我打算下一节结合Smali插桩讲,大家也可以自行搜索和学习。
    我们现在只需要知道".method"和“.end method”分别是方法开始和结束的地方即可。下图红框即a方法的两个重载方法,它们对应着我们前面分析的Jadx伪代码。
    在这里插入图片描述
    对比一下Jadx反编译的结果
    在这里插入图片描述
    显然Smali代码更长的那个才是我们需要的重载方法,在代码左边空白处单击即可下断点。
    在这里插入图片描述

    下好断点后,就可以准备开始运行了。
    首先,红框一圈出来的设备信息处,必须要有一个蓝色的设备在运行,如果你的是黑色,可以重启一下模拟器。
    在这里插入图片描述
    在这里插入图片描述
    确定设备没问题后,点击那个带箭头的小虫子
    在这里插入图片描述
    在这里插入图片描述
    我们现在要找到我们应用的包名,查看应用包名以及其他信息的方法和工具非常多,我这里推荐一个非常优雅的工具Apk Messenger,在反编译的第一步,我们需要对应用进行查壳,我也建议使用它,因为它实在是难得的UI设计好看的反编译工具。这是它的官网,https://www.ghpym.com/apkinfo.html ,百度云也放了相应的资源。

    在这里插入图片描述
    直接拖拽Apk 进去
    在这里插入图片描述
    细心的小伙伴可能会发现,它判定应用进行了腾讯加固,这似乎是一个误报。这是为什么呢?事实上,Apk的查壳工具都并不算聪明,是通过检查Apk目录中是否由加固软件的特征文件判断的,我们来看一下APK Messenger的判断库。
    在这里插入图片描述
    再用360压缩或者别的压缩工具打开Apk,会在assets目录下找到这些。
    在这里插入图片描述
    所以不用去管它,我们反编译内容正常,就不用考虑它为什么是个“假加固”的事了。
    现在我们知道了包名,在模拟器中打开App,在列表中找到com.sina.sinablog附加调试即可,反复调试Smali代码时,可能会出现进程列表里没有这个App的状况,重启App即可。
    在这里插入图片描述
    在这里插入图片描述
    网上很多教程都让你用DDMS查看端口,再用adb动态转发端口之类的,其实这些步骤一般都是不需要的。
    我们现在已经开始了Smali调试,只需要触发断点即可。
    在这里插入图片描述
    点击一条博客
    在这里插入图片描述
    关于Android Studio调试工具如何使用,网上已经有非常多的文章了,不熟悉的可以看一下这篇文章https://blog.csdn.net/yy1300326388/article/details/46501871

    我们这里需要使用到下图这些功能
    在这里插入图片描述
    我们来看一下Smali代码,我们下一篇才会讲Smali语法,但如果大家先学习了Smali语法,会对Smali调试有非常大的帮助。在这里插入图片描述
    运行完move-result-object v0 这一行后,我们在Watches监视器中添加v0,接下来我们就可以一路F8,感受它的变化了。
    初始化hashmap时,那个方法已经塞进去五个字段了,一步步F8,你会发现v0里的字段越来越多,没过多久,Get请求的九个字段就全部躺在了v0中。
    在这里插入图片描述
    在这里插入图片描述
    光靠F8一行一行走是没办法得知的,你可以退出调试模式,更加精细的看一下,F7进入到子方法,Shift+F8跳出方法,这样子多走几遍,你就理解了。
    在m方法中,获得了5个字段
    在这里插入图片描述
    出了m方法后,得到了三个字段
    在这里插入图片描述
    我们用Jadx的Java代码上标记一下
    在这里插入图片描述在这里插入图片描述
    SIGN是怎么生成的呢?
    在这里插入图片描述
    不熟悉Smali可以在Jadx中对应看一下
    在这里插入图片描述
    sign值是由CpltUtil.invoke()方法生成的,参数是两个字符串,第一个是固定字符串“/apicheck/blog”,第二个参数是八个参数的字符串,我们可以用计算器查看一下。

    在如图这一步,v0即包含了8个字段的map,点击图中红框的计算器,它叫Evaluate Expression,可以在这儿运行各种各样的表达式
    输入new JSONObject(v0).toString();
    你会发现JSONObject飘红,按照提示进行导包
    在这里插入图片描述
    导包后Evaluate
    在这里插入图片描述
    好吧,报错,那我们就不转JsonObject了,直接toString转成字符串看看什么样
    在这里插入图片描述
    在这里插入图片描述
    结果为{is_default=0, login_uid=, blog_uid=1260074450, article_id=4b1b35d20102yvlj, appver=6.1.2, appid=2, deviceid=e9ec21f2f9a7dc8f9c4e10694bdc6143, chno=515_104},和预期一样。
    接下来我们在Jadx中看一下这个CpltUtil.invoke()方法

    在这里插入图片描述
    一看这名字,似乎是个native方法,Ctrl+左键进入
    在这里插入图片描述
    竟然是一个native层的加密函数,在之后native层破解时我们再提它,大家可以先试一下。
    去lib库中找到libcrossplt.so文件,在ida中反编译,这个函数是静态注册的,所以很容易就可以在Exports列表中找到它,之后F5反汇编成c代码,静态分析c代码或者ida动态调试即可。

    不入so层,就还没有入门逆向,大家加油,下一篇可能讲Smali相关的东西。
    在这里插入图片描述

    展开全文
  • 安卓逆向分析步骤总结

    千次阅读 2020-09-03 16:30:50
    这篇博客用于总结我对安卓逆向分析的学习理解,主要以分析步骤来表现,当然同时也提供给大家学习交流,仅此而已。 我们应当努力奋斗,有所作为。这样,我们就可以说,我们没有虚度年华,并有可能在时间的沙滩上...

    start:2020年9月3日

    一、前言

    安卓逆向说好听一点叫逆向分析学习技术,说不好听就叫破解App了。但是,技术这个东西本身不分好坏,只是看你学会它之后用在哪些方面了。这篇博客用于总结我对安卓逆向分析的学习理解,主要以分析的步骤来表现,当然同时也提供给大家学习交流,仅此而已。

    我们应当努力奋斗,有所作为。这样,我们就可以说,我们没有虚度年华,并有可能在时间的沙滩上留下我们的足迹。——拿破仑

     

    二、工具准备

    主要:

    • Android Killer   用于反编译/回编APK

    • jadx-gui  用于反编译dex文件,进行java层的静态分析

    • NotePad  用于记录分析线索,总结分析结果

    调用工具:

    • DDMS  查看程序运行log / 方法追踪分析 
    • IDA  动态分析工具 / 反汇编工具 / 内存修改工具 / 脱壳 /  JNI 层分析

    其他:

    • Android Studio  用于编码 /  Java层动态分析
    • Jeb
    • ApkToolBox
    • GDA
    • WinHex
    • 010

     

    三、功能分析

    要想分析某款App的某个功能,首先你就需要使用一下这个功能,然后记录下其中的关键字,一般来说:比如那些Toast弹出的提示、Dialog显示的文字、按键的名字等待,这些都可以作为关键字进行代码定位。但是我个人喜欢通过组件的id来定位,这样可以排除String被处理了,然后直接找组件被使用的地方,快速的找到突破口。为了演示本博客中采用String定位代码位置。

     

     

    关键字:您的会员已到期,请升级VIP

     

    四、Android Killer反编译

    打开AK工具,将Apk拖入,等待反编译完成,出现下图所示即可:

     

    五、通过关键字定位代码位置

    将AK工具切换到工程搜索界面,搜索我们刚才记录的关键字,如下图:

     

    搜索后发现,结果是一个xml的布局文件,这就说跟定会有一个Activity这样的活动类会引用它,我在根据这个布局文件的名称进行搜索。(关键字:dialog_package_upgrade)结果如下:

     

     

    发现还是没有想要的smali文件,但是我们发现了R文件,我们可以通过里面定义的16进制的id值,再次进行搜索,结果如下:

     

     

    终于我们找到了第一个关键字的被调用的位置,就决定是你了。关键字:PackageUpgradeDialogFragment

    由于smali代码可阅读性差,我们接下来就用jadx将smali代码转换成java代码来进行下一步的分析,当然AK自带有这个功能,但是我个人觉得不好用。(jadx的使用方法这里就不讲了,不懂的就CSDN一下)

     

    六、分析Java代码,找突破口

    打开jadx,将apk拖入,然后打开搜索界面,等待反编译结束,然后搜索关键得到下图:

     

    进入第一个结果:

     

     

    发现是一个封装好的DialogFragment类,那么我们就看看那些地方实例化了它,然后分析得出这个地方使我们要找的地方:

     

     

    继续跟踪,我们就找到了我们真正需要的地方:

     

     

    记录逻辑函数:ischeckAccunt()

     

    七、修改smali代码,回编

    找到我们想要的逻辑函数之后,我们就分析它的逻辑,然后尝试修改smali代码,回编(修改逻辑这里就不提供了):

     

     

    八、安装测试

     

     

     

    九、总结

    本次逆向分析发现,现在大多的App在安全防御方面还是比较欠缺的,可以说是比较落后的,在我看来一个App至少需要对两个地方进行防御:

    • java代码:1.关键逻辑代码用JNI进行编写    2.将Apk进行加固   3.代码混淆...
    • 网络传输:1.协议Body加密   2.服务器验证  3.防止VPN代理...

     

    声明:本博客仅用于移动安全领域的技术研究,不用于任何商业活动,本人不承担任何责任,后果自负,如果本博客有写的不妥的地方请联系我,我会及时整改。

     

     

    end:by take

    展开全文
  • ANSYS入门——模态分析步骤与实例详解

    万次阅读 多人点赞 2020-05-27 22:15:58
    本文主要是针对初学ANSYS者,讲述了模态分析的理论、求解步骤以及一个实例

    目录

    一、ANSYS求解模态分析步骤

     建模

     施加载荷和求解

    扩展模态(这是区别于其他分析的一个关键)

    查看结果

    二、模态分析实例(均匀直杆的子空间法模态分析)

    1.问题描述

    2.有限元分析

    1)进入ansys经典界面

    2)设置单元类型:Solid Brick 20 node 186

    3)设置材料属性

    4)建模

    5)划分网格单元

    6)加载:模态分析只有零约束

    7)分析的相关设置

    8)扩展模态阶数设置

    9)求解

    10)查看分析结果

    11)动画观察某一阶数的振动模态

    12)查看某一阶数的振型云图

    疑问?


    模态分析的理论基础可见:

    https://blog.csdn.net/qq_45769063/article/details/106391925

    一、ANSYS求解模态分析步骤

           模态分析用于分析结构的振动特性,即确定结构的固有频率和振型,它也是谐响应分析、瞬态动力学分析以及谱分析等其他动力学分析的基础。

    Ansys提供的模态提取方法有:子空间法(subspace)、分块法(block lanczos)、缩减法(reduced/huoseholder) 、动态提取法( power dynamics ) 、非对称法(unsymmetric)、阻尼法(damped)、QR尼法(QR damped)等,大多数分析都可使用子空间法、分块法、缩减法来完成。

    模态分析包括建模、施加载荷和求解、扩展模态和查看结果等几个步骤。

     建模

    模态分析的建模过程与其他分析相似,包括定义单元类型、定义单元实常数、定义材料特性、建立几何模型和划分网格等。需要注意的是Ansys的模态分析是线形分析(即模态分析的材料特性设置在线性那里进行设置Linear-Elastic-Isotropic),任何非线性特性,例如塑性、接触单元等,即使被定义了也将被忽略。在材料特性中必须定义材料的弹性模量和密度

     

     施加载荷和求解

    包括指定分析类型、指定分析选项、施加约束、设置载荷选项,并进行固有频率的求解等。

    指定分析类型:Main Menu->Solution->Analysis Type->New Analysis,选择Modal。

    指定分析选项:Main Menu->Solution->Analysis Type->Analysis Option,选择MODOPT(模态提取方法),设置模态提取数量MXPAND。

    若使用缩减法,需定义主自由度

    施加约束:Main Menu->Solution->Define Loads->Apply->Structural->Displacement.在模态分析中载荷施加只有零约束,即全约束,其他任何形式的载荷施加都会被忽略

    求解:Main Menu->Solution->Solve->Current LS.

     

    扩展模态(这是区别于其他分析的一个关键)

    如果要在POST1中观察结果,必须先扩展模态,即将振型写入结果文件。过程包括重新进入求解器、激活扩展处理及其选项、指定载荷步选项、扩展处理等。

    激活扩展处理及其选项:Main Menu->Solution->Load Step Opts->Expansionpass->Single Expand->Expand modes.

    扩展处理:Main Menu->Solution->Solve->Current LS.

    扩展模态可以如前述办法单独进行,也可以在施加载荷和求解阶段同时进行。

    查看结果

    模态分析的结果包括结构的频率、振型、相对应力和力等。

    二、模态分析实例(均匀直杆的子空间法模态分析)

    1.问题描述

    2.有限元分析

    1)进入ansys经典界面

    2)设置单元类型:Solid Brick 20 node 186

    3)设置材料属性

    4)建模

    5)划分网格单元

            拾取菜单Main Menu-Preprocessor-Meshing-MeshTool。弹出对话框,单击''Size. Controls'',区域中"Lines"后"Set",按钮,弹出拾取窗口,任意拾取块x轴和y轴方向的边各一条(短边),单击OK"按钮,弹出对话框, 在"NDIV"文本框中输入3,单击"Apply"按钮:再次弹出拾取窗口,拾取块z轴方向的边(长边),单击"OK"按钮。在"NDIV"文木框中输入15,单击"OK"按钮。

           在Mesh区域,选择单元形状为"Hex"(六面体),选择划分单元的方法为"Mapped"(映射)单击Mesh按钮,弹出拾取窗口,单击"OK"按钮。

    6)加载:模态分析只有零约束

            拾取菜单Main Menu--Solution-Define Loads-Apply-Structural-Displacement-On Areas弹出拾取窗口,拾取z=0的平面,单击"OK"按钮.弹出对话框,在列表中选择"UZ",单击"Apply"按钮;再次弹出拾取窗口,拾取y=0的平面,单击"OK"按钮,弹出对话框,在列表中选择"UY",单击"Apply"按钮再次弹出拾取窗口,拾取x=0的平面,单击"OK"按钮,弹出对话框,在列表中选择"UX",单击"OK"按钮。所加约束与图8-1不同.主要是为了与推导式(8-1)所作的轴向振动假设一致。约束施加的正确与否,对结构模态分析的影响十分显著,因此对于该问题应十分注意,保证对模型施加的约束与实际情况尽量符合

    (对于约束怎么约束这个暂时不懂)???

    7)分析的相关设置

    拾取菜单Main Menu-Solution-Analysis Type-New Analysis。弹出对话框,选择"Type of Analysis"为"Modal",单击"OK"按钮。

    拾取菜单Main Menu-Solution-Analysis Type-Analysis Options。弹出对话框,在"No. of modes to extract"文本框中输入5,单击“OK"按钮:弹出"Block Lanczos Method",单击"OK"按钮。

    8)扩展模态阶数设置

    拾取菜单Main Menu-Solution-Load Step Opts-Expansionpass-Single Expand-Expand modes。弹出对话框,在"NMODE"文本框中输入5,单击"OK"按钮。

    9)求解

    拾取菜单Main Menu-Solution-Solve-Current LS

    10)查看分析结果

    拾取菜单Main Me-General Postproc-Results Summary。弹出窗口,列表中显示了模型的前5阶频率,与表8-1相对照,可以看出结果虽然存在一定的误差,但与解析解是基本符合的。查看完毕后,关闭该窗口

    从结果文件读结果,拾取菜单Main Menu-General Postproc-Read Results-First Set.

    改变视点,为便于更好地观察模型的模态。拾取菜单Utility Menu-PlotCtrls-Pan Zoom Rotate.在弹出的对话框中,单击“Left”按钮.

    11)动画观察某一阶数的振动模态

    拾取菜单Utility Menu-PlotCtrls-Animate-Mode Shape。弹出对话框,单击“OK”按钮。观察完毕,单击“Animation Controller”对话框的"close"按钮。

               拾取菜单Main Menu-General Postproc-Read Results-Next Set.依次将其余各阶模态的结果读入,然后重复步骤15

    观察完模型的各阶模态后,请读者自行分析频率结果产生误差的原因,并改进以上分析过程。

    12)查看某一阶数的振型云图

    先在READ result那读取想看的阶数,再plot results进行云图绘制

    疑问?

    1.模态分析的激励是从哪里来的?

    2.模态分析时约束该怎么设置?即怎么根据实例来进行位移的约束施加?

    答案见:https://blog.csdn.net/qq_45769063/article/details/106398686

    展开全文
  • 动态规划的求解步骤

    千次阅读 2014-11-30 13:48:09
    动态规划算法适合于求解最优化问题,通常可按下列步骤来设计动态规划算法: (1)分析最优解的性质,并刻画其最优子结构特征; (2)确定状态表示S(x1,x2,...)和状态递推方程,递归地定义最优值; (3)根据...
  • 海量数据日志实时分析步骤

    千次阅读 2014-03-03 10:39:25
    实时的数据计算和分析可以动态实时地刷新用户访问数据,展示网站实时流量的变化情况,分析每天各小时的流量和用户分布情况,这对于大型网站来说具有重要的实际意义。 2)    数据量大且无法或没必要预算,但...
  • 图解动态规划的解题四步骤

    千次阅读 2020-04-02 20:36:44
    本文会以 House Robber 题目为例子,讲解动态规划题目的四个基本步骤动态规划的的四个解题步骤是: 定义子问题 写出子问题的递推关系 确定 DP 数组的计算顺序 空间优化(可选) 下面我们一步一步地进行讲解。 ...
  • 程序动态分析工具调研

    千次阅读 2015-10-19 17:03:05
    综述本文是对程序动态工具的调研,通对各种动态分析工具的原理、功能、优缺点等方面的调研分析来使读者在使用工具时更有针对性。 作为调研,本文并不过多的涉及工具的细节,主要关注点在于工的原理、功能、优缺点...
  • 需求分析——需求分析步骤

    万次阅读 2019-05-27 21:52:33
    需求分析学习指导目录:...(3)需求建模:use-case建模、静态模型、动态模型。 (4)形成需求文档:形成标准的软件需求规格说明书。 (5)需求确认:与用户...
  • 浅谈逆向-动态分析之OD界面介绍OD的配置 界面介绍 A区域:view菜单功能项的快捷按钮 B+C+D+E+F: CPU窗口 (OD打开一个可执行文件后,会立刻加载,自动分析后并列出汇编代码,默认打开CPU窗口) B区域:反汇编...
  • 上一篇博文中我们讲解了smali语法,今天就带大家如何进行动态调试smali代码。你可能要问,为什么要学会动态调试smali代码?那就是为了减轻我们逆向分析的负担! 在上篇的博文中我们已经了解到,一个smali文件中代码...
  • Java数据结构和算法——动态规划做题步骤详细总结

    千次阅读 多人点赞 2020-07-11 18:19:48
    文章目录动态规划题目类型动态规划解题步骤动态规划实例讲解硬币问题机器人路径问题青蛙跳石头问题 动态规划题目类型 1、计数: 有多少种方式走到右下角 有多少种方法选出k个数使得和为Sum 2、求最大最小值: 从左上...
  • DFMEA步骤二:结构分析

    千次阅读 2020-02-07 12:25:38
    目的 设计结构分析的目的是将设计识别和分解为系统、子系统、组件和零件,以便进行技术...● 功能分析步骤的基础 系统结构 系统结构由系统要素组成。根据分析的范围,设计结构的系统要素可以由系统、子系统、装配件...
  • 方法一——动态规划思路分析代码实现(Java)复杂度 一、算法目录合集 1.地址    算法目录合集 2.说明   该地址指向所有由本人自己所经历的算法习题(也有可能仅仅是一个入门的案例或者是经典案例),仅仅为我做过...
  • 动态规划算法的基本步骤

    万次阅读 2015-01-05 15:03:53
    动态规划
  • 文章目录1.序2.动态规划的基本概念[^1]3.动态规划算法的基本思想[^2]4....这篇文章主要介绍动态规划算法的基本思想、使用动态规划算法求解问题的基本步骤动态规划算法的两个基本要素以及一些经典的动态规划问题。...
  • 设计FMEA步骤三:功能分析

    千次阅读 2020-02-07 12:32:34
    目的 设计功能分析的目的是确保要求/规范中规定的功能被适当地分配给系统要素。无论DFMEA使用什么工具创建,其分析都要用功能术语编写,这点至关重要。 设计功能分析的主要目标是: ...● 失效分析步骤的基础...
  • 动态规划相信大家都知道,动态规划算法也是新手在刚接触算法设计时很苦恼的问题,有时候觉得难以理解,但是真正理解之后,就会觉得动态规划其实并没有想象中那么难。网上也有很多关于讲解动态规划的文章,大多都是...
  • 恶意代码的分析方法:静态分析、动态分析 恶意代码静态分析技术主要包括 :反病毒软件扫描、文件格式识别、字符串提取分析、二进制结构分析、反汇编、反编译、代码结构与逻辑分析、加壳识别和代码脱壳。 反病毒...
  • Ubuntu16.04 Caffe 安装步骤记录(超详尽)

    万次阅读 多人点赞 2017-05-19 19:09:11
    历时一周终于在 ubuntu16.04 系统成功安装 caffe 并编译,网上有很多教程,但是某些步骤并没有讲解详尽,导致配置过程总是出现各种各样匪夷所思的问题,尤其对于新手而言更是欲哭无泪,在我饱受折磨后决定把安装步骤...
  • Java JDK 动态代理(AOP)使用及实现原理分析

    万次阅读 多人点赞 2019-05-08 21:28:06
    二、Java 动态代理类 三、JDK的动态代理怎么使用? 四、动态代理怎么实现的? 五、结论 一、什么是代理? 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为...
  • 结构化分析过程的各个步骤如下:1.问题描述2.画分层的数据流图 数据流图、实体-关系图(E-R图)、状态转换图、数据字典3.决定哪些部分需要计算机化和怎样计算机化4.数据细节描述5.定义处理逻辑6.定义物理资源7....
  • 动态规划所处理的问题是一...动态规划算法基本求解步骤:  (1)划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。在划分阶段时,注意划分后的阶段一定要是有序的或者是可排序的,否则问题就无法求解。 ...
  • 三维分析动态可视域分析

    千次阅读 2019-07-08 14:04:02
    动态可视域分析是在三维场景中,根据指定的路线,基于一定的水平视角、垂直视角及指定范围半径,分析沿路线行驶过程中的指定范围内的通视情况。可以动画形式播放演示从分析路线起点到终点的可视域分析结果,分析结果...
  • Java动态代理分析

    万次阅读 多人点赞 2017-04-12 20:27:16
    Java动态代理机制的出现,使得Java开发人员不用手工编写代理类,只要简单地制定一组接口及委托类对象,便能动态地获得代理类。代理类会负责将所有的方法调用分配到委托对象上反射执行,配置执行过程中,开发人员还...
  • 动态规划(1):基本思路以及步骤

    万次阅读 多人点赞 2016-07-31 11:05:11
    基本思想动态规划是针对一类求最优解的问题的算法, 其核心是将一个问题分解成为若干个子问题(这里对应下文的子问题使用条件), 部分类似于分治的思想(不懂得可以参考归并排序), 通过求每一次的最优决策, 来...
  • 关键词:状态图,软件工程,动态模型  动态模型着重于系统的控制逻辑,考察在任何时候对象及其关系的改变,描述这些涉及时序和改变的状态。动态模型包括事件跟踪图和状态图。事件跟踪图则侧重于说明系统执行过程中...
  • 目录1动态规划思想2适用场景3例题分析3.1示例1:42.接雨水 1动态规划思想 2适用场景 3例题分析 3.1示例1:42.接雨水 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接...
  • 点击上方 蓝字 关注我们当老板、业务向你要一份数据的时候,如果你只给出一份苍白无力的原始数据的话,那你就输了,是一个“取数工具人”无疑了!也别怪别人把咱当做“查数姑”。都说数据分析师要发...
  • 转载一篇近似动态规划和强化学习入门介绍的博文,原文地址...第二阶段的特点是通过微分方程对动态系统进行分析,Fourier和Laplace变换,状态空间法、随机方法、Hilbert空间等数学工具奠定了控

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 241,247
精华内容 96,498
关键字:

动态分析的步骤