
逆向
嘻嘻兮
Stay hungry,Stay foolish
展开
-
ARM逆向-表达式求值
表达式求值也就是把各类加减乘除的运算都看一遍,这里主要记录的是Release版中的一些优化,各种优化手段我感觉有x86的逆向基础还是会比较好理解的,因为很多都很类似。首先看一下加减的运算,这里主要可能会出现常量折叠和常量传播等优化手段int main(int argc,char* argv[]){ int n1 = argc; int n2 = 0; scanf("%d", &n2); n1 = n1 - 100; n1 = n1 + 5 - n2原创 2020-07-14 21:09:24 · 584 阅读 · 0 评论 -
逆向-字符串
在C语言中,字符串其实就是一个特殊的数组,一个以零结尾的字符数组而已,所以对于定位字符串中的字符的话可以参考上一篇博客-数组。这篇博客主要用于记录字符串的一些操作函数,以便于在逆向识别的时候可以顺利的还原为函数。这里因为在release版下其字符串操作函数会内嵌汇编,也就是说并不是使用call来调用函数,所以我们需要来逆向识别一下。所以下面我们讨论的都是release版下的情况,并且使用的编译...原创 2020-06-29 13:59:38 · 3964 阅读 · 0 评论 -
逆向-数组
对于数组而言,我们需要理解其数组的寻址公式,而其公式又与其内存的分布息息相关,所以当你了解了其内存分布,那么这个公式自然而然也能推出来。首先数组有如下两点性质连续性-排列连续一致性-类型一致因为有其连续的特点,所以其内存模型也就比较好理解,下面我们来看一下如下代码int arr[5] = {0,1,2,3,4}上面就是其内存模型,对于一致性的特点,可以推定其每个元素占...原创 2020-06-14 12:50:17 · 543 阅读 · 0 评论 -
逆向-函数
函数的工作机制主要是依托栈结构来实现的,首先栈的一种后进先出的结构,为什么使用这种数据结构,因为这和我们函数调用的流程很类似,当程序嵌套调用时,最后一个调用的函数总是最先返回。对于函数,我们先从宏观上大体的先去了解,后面在看一些内部细节,简单理解函数调用的话,就是在程序动态的运行中,每进入一个函数,总有一块独立的栈函数空间供它使用,这段空间可以存储各类函数需要用到信息,如局部变量,参数等等,当...原创 2020-06-07 14:13:27 · 738 阅读 · 0 评论 -
逆向-循环结构
对于循环结构而言,主要就三种,do-while循环,while循环,for循环,这三种循环,在debug下其特点还是比较明显的,在release下的话可以说基本上都被优化为do-while循环(效率高),所以说release下的循环,根据其汇编代码我们只能做等价的还原。下面先来看do-while循环int main(int argc, char* argv[]){ int i ...原创 2020-05-26 16:20:58 · 731 阅读 · 0 评论 -
逆向-分支结构下
上一篇说完IF结构,这一篇就接着总结分支结构中的switch,对于switch结构,编译器共有四种方案提供选择,我们不必去关心编译器何时会选择何种结构,因为这个完全取决于编译器作者,所以我们只需能识别出这四种方案是switch结构即可。对于switch结构而言,不管哪种方案,其主要分两部分引导代码case块集合对于不同的方案,其case块集合是不变的,主要在于其引导方式的变化。...原创 2020-05-18 19:03:56 · 367 阅读 · 0 评论 -
逆向-分支结构上
前面把一些基本的运算都记录完了,后面开始流程结构,其流程结构主要分为分支结构和循环结构。对于流程结构的逆向识别,主要在于首先需要识别是什么,然后识别语句体(花括号上下界位置),因为确定好了这两步后,其里面的主体内容就是前面的基本运算或者又是流程结构(递归进行逐步分解)。对于流程结构主要就以debug版为主了,因为debug版更加利于研究其结构如何,而release中除了结构以外,还混有一些的优...原创 2020-05-08 17:12:43 · 394 阅读 · 0 评论 -
逆向-三目运算
首先,先简单回顾一下三目运算符(条件表达式)的格式表达式一 ? 表达式二 : 表达式三当表达式一的结果为真时,选择执行表达式二,否则执行表达式三。看完这个格式,很明显这是一个有分支的结构,那么编译器会老老实实的都按分支语句进行编译么,下面我们还是需要来分情况讨论一下。1.当表达式二或表达式三不为常量2.表达式二或表达式三为常量 2.1 当表达式一为0的等值比较,表达式...原创 2020-04-28 13:58:36 · 411 阅读 · 0 评论 -
逆向-取模运算
除法终于整理结束了,这篇开始整理取模运算,对于取模运算来说,个别的情况还是需要使用除法的,所以除法运算的基础还是得牢靠。取模也叫取余,表达为 a % b。下面需要对b的情况进行区分来分析1. 变量2. 常量 2.1 无符号 2.1.1 2的幂 2.1.2 非2的幂 2.2 有符号 2.1.1 2的幂 ...原创 2020-04-15 14:15:29 · 4341 阅读 · 1 评论 -
逆向-除法优化下
由于除法优化实在太多了,所以这一篇继续讲,前面一篇说了除数为正数情况(常量),那么这篇就来说一说除数为负数的情况。首先里面涉及的很多基础知识请翻上一篇查看,其实如果理解了上一篇的那些基本原理,除法为负的情况也是很好理解的,因为除数为负的情况都是在除数为正的情况之上做了一点点的变化。首先还是先来分一下情况除数为常量-除数为负数情况 1.被除数无符号情况 2.被除数有符号情况...原创 2020-04-10 15:11:07 · 454 阅读 · 0 评论 -
逆向-除法优化上
上一篇说完加减乘的优化,这篇来说说除法,首先先打个铺垫,除法的优化涉及到各种数学公式,这里我们主要探讨一下结论,具体的证明可以参考《C++反汇编与逆向分析技术揭秘》,这里做一个总结。首先,如果除数为变量时,是没有任何的优化空间的,所以老老实实的上对应的汇编代码即可,所以就不讨论了。下面主要来讨论下除数为常量的情况,并且这个常量还是正数,负数情况下一篇博客介绍。首先,先来看一下需要讨...原创 2020-04-02 23:54:28 · 940 阅读 · 0 评论 -
逆向-加减乘运算
后面打算记录一下逆向识别的学习过程,也就是把每个C语言中的基础关键点都反汇编,然后对比观察。虽然说这里的每一步都是很简单,但是就算简单也还是得看,毕竟每个程序都是由这些一个个简单的点组合而成,当进行反汇编还原时,也就是将反汇编一点点拆分成这若干块的小知识点。好了,首先看最基础的四则运算,也就是加减乘除,当然这篇博客并不包括除,除法的话下面博客再记录吧(因为优化有些复杂了,怕篇幅过长)。首先...原创 2020-03-22 19:32:34 · 667 阅读 · 0 评论