Aurore💦 我不是Huai人的
关注数: 21 粉丝数: 164 发帖数: 5,240 关注贴吧数: 21
PBE 加密算法 1、PBE简介 PBE算法,全称password based encrytpion,基于口令的加密,该算法不是新的算法,是融合算法;主要步骤如下: 首先用户输入口令,然后根据salt,采用信息摘要算法(MD5、SHA-256等)计算一个固定长度的摘要出来; 将该固定长度的摘要转换为对称加密算法(DES、AES)要求长度的密钥key; 使用key并采用对称加密算法对数据进行加密。 PBE没有密钥的概念,PBE使用口令替代了密钥。PBE算法是信息摘要算法和对称加密算法的融合,比如PBEWithMD5AndDES是MD5和DES的结合,类似的也可以反推。 2、口令和密钥的区别 口令:一般与用户名对应,是某个用户自己编织的便于记忆的一串单词、数字、汉字字符,口令的特点容易被记忆,也容易泄露和被盗取,容易被社会工程学、暴力破解、撞库等方式获取。 密钥:是经过加密算法计算出来的,密钥一般不容易记忆,不容易被破解,而且很多时候密钥是作为算法的参数出现的,算法对于密钥长度也是有要求的,因为加密算法的作用就是利用密钥来扰乱明文顺序; NOTE:口令不能代替密钥,但是可以用信息摘要算法将口令转换为密钥; 3、eclipse中讲解PBE算法的java代码实现 1)在Mainactivity中分析代码: initSalt、encrypt、decrypt是在PBE类中定义的方法,这几个方法也是在Mainactivity中主要用到的;2、分析PBE类 SecureRandom:实例化安全随机数 generateSeed: 返回给定的种子字节数量,该数量可使用此类将自身设置为种子的生成算法来计算 PBEKeySpec:密钥材料转换 generateSecret:生成密钥小结 1、介绍PBE系列相关的算法以及实现原理。 2、在eclipse中分析了PBE算法的代码。
常见加密算法——SHA系列算法 ## 一:SHA算法简单概要 SHA (Security Hash Algorithm) 是美国的 NIST 和 NSA 设计的一种标准的 Hash 算法,SHA 用于数字签名的标准算法的 DSS 中,也是安全性很高的一种 Hash 算法。 ## 二:SHA系列算法介绍 **1)SHA-1** SHA-1 算法的输入消息长度小于 264bit,最终输出的结果值是 160 Bits,SHA-1 与 MD4 相比较而言,主要增加了扩展变换,将前一轮的输出也加到了下一轮,这样增加了雪崩效应,而且由于其 160 Bits 的输出,对穷举攻击更具有抵抗性。 大致实现过程:将消息摘要转换成位字符串,对转换后的位字符串进行补位操作,附加长度值并且初始化缓存,然后计算消息摘要。 **2)SHA-256 算法**SHA-256 算法输入报文的最大长度不超过 264 Bits,输入按 512 Bits 分组进行处理,产生的输出是一个 256 Bits 的报文摘要。 **算法处理步骤:** 1、附加填充位 对报文进行填充使报文长度与 448 模 512 同余(长度 = 448 mod 512), 填充的比特数范围是 1 到 512,填充比特串的最高位为 1,其余位为 0。 就是先在报文后面加一个 1,再加很多个 0,直到长度满足 mod 512=448。为什么是 448?因为 448+64=512。第二步会加上一个 64 位的原始报文的长度信息。 2、附加长度值 将用 64 位表示的初始报文(填充前)的位长度附加在步骤 1 的结果后(低位字节优先)。 3. 初始化缓存 使用一个 256 位的缓存来存放该散列函数的中间及最终结果。它可以表示为 8 个 32 位的寄存器(A, B, C, D, E, F, G, H) 4.处理 512 位报文分组序列 该算法使用了六种基本逻辑函数,由 64 步迭代运算组成。每步都以 256 位缓存值 ABCDEFGH 为输入,然后更新缓存内容。每步使用一个 32 位常数值 Kt 和一个 32 位 Wt。 5. 结果输出 所有的 512 位分组处理完毕后,对于 SHA-256 算法最后一个分组产生的输出便是 256 位的报文摘要。 补充:(这里的具体实现设计到一些数学知识,顾具体细节不做讨论,同学们只需要明白大致过程即可)** 3)SHA-2的其他衍生算法 包括SHA-224、SHA-256、SHA-384、SHA-512,这些版本共同构成了SHA大家庭。 SHA-224:SHA-256的“阉割版”,可以生成长度224bit的信息摘要。 SHA-512:可以生成长度512bit的信息摘要。 SHA-384:SHA-512的“阉割版”,可以生成长度384bit的信息摘要。 SHA家族的最新成员SHA-3已经于2015年问世。关于SHA-3的细节,有兴趣的小伙伴们可以查询资料进一步学习。 ## 三:在Eclipse中分析SHA代码并且演示效果 1)主类MainActivity 通过调用自定义的SHA算法把要加密的数据传进去,然后使用自定义的byteArr2HexStr方法进行遍历拼接;2)SHA类 使用getInstance方法获取不同的算法,每隔算法的大致实现都是一样的,唯一不同的就是使用getInstance获取到的算法不一样;代码都一样,唯一的区别是使用getInstnce获取到的算法不一样; 小结: 1、介绍SHA系列相关的算法以及实现原理。 2、分析SHA算法代码以及演示运行效果。
数字签名算法 一:数字签名简介 什么是数字签名?带有密钥(公钥,私钥)的消息摘要算法,用于验证数据完整性,认证数据来源,以及抗否认。通俗来讲就是证明某个消息或者文件是本人发出/认同的,这个的话用于的面就比较多了。比如电子合同,银行签约,电子授权等等。所以他的安全性是我们必须要考虑的。数字签名中常用的签名算法有RSA、DSA、ECDSA等。 二:数字签名的基本过程 基本过程如下: (1)发送方生成非对称加密算法的公钥和私钥对,并公布其公钥和签名算法(例如sha256WithRSAEncryption); (2)发送方对发送的消息先计算其数字摘要,然后使用私钥对摘要进行加密,生成数字签名; (3)接收方在接收到声称来自XXX的消息时,先去查询XXX的公布的公钥和签名算法; (4)接收方使用公钥对数字签名解密并与计算出的数字摘要进行比对,如果比对一致,那么消息来自于XXX并且未被篡改。 上述过程的安全前提基于以下两点: ①发送方的签名算法无法被破解,且私钥未发生泄露 ②接收方查询的公钥以及签名算法属实 三:在eclipse中分析DSA签名算法 (1)在主类Mainactivity中分析 分析这几个自定义方法: getPublicKey(keyMap);//获取公钥 getPrivateKey(keyMap);//获取私钥 be.encode(publicKey));//公钥加密 be.encode(privateKey));//私钥加密 DSA.sign(data.getBytes(), privateKey);//讲私钥进行签名 DSA.verify(data.getBytes(), publicKey, sign)+"");//进行验证(2)在自定义类DSA中分析 几个重要的方法 generateKeyPair:生成密钥对 getPublic获取公钥 getPrivate:获取私钥 X509EncodedKeySpec:根据给定的编码密钥创建一个新的 X509EncodedKeySpec小结 1、介绍数字签名系列相关的知识以及实现原理。 2、在eclipse中分析了DSA签名算法的代码。
X86架构和ARM架构,各自有什么优点和缺点? 嵌入式X86和ARM优缺点对比  X86架构是使用复杂指令集CISC,X86 CISC是一种为了便于编程和提高记忆体访问效率的芯片设计体系,包括两大主要特点:一是使用微代码,指令集可以直接在微代码记忆体里执行;二是拥有庞大的指令集,拥有包括双运算元格式、寄存器到寄存器、寄存器到记忆体以及记忆体到寄存器的多种指令类型。X86架构的优势是能够有效缩短新指令的微代码设计时间,允许实现CISC体系机器的向上兼容,新的系统可以使用一个包含早期系统的指令集合。另外微程式指令的格式与高阶语言相匹配,因而编译器并不一定要重新编写。ARM架构相较复杂指令集CISC而言,以RISC为架构体系的ARM指令集的指令格式统一、种类少、寻址方式少,简单的指令意味着相应硬件线路可以尽量做到最佳化,从而提高执行速率。ARM架构的优势是体积小、低功耗、低成本、高性能,支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件,大量使用寄存器,并且大多数数据操作都在寄存器中完成,指令执行速度更快,寻址方式灵活简单,执行效率高,指令长度固定,可以通过多流水线方式提高处理效率  X86架构缺点:X86指令集只有8个通用寄存器,这就意味着CPU大部分时间在访问存储器内的数据,将影响整个系统的执行速度;解码分为硬件解码和微解码,对于简单的x86指令只要硬件解码即可,速度较快,而遇到复杂的x86指令则需要进行微解码,并把它分成若干条简单指令,速度较慢且很复杂;X86指令集的寻址范围小,大大约束了用户的需求;X86 CISC相对来说结构复杂,很难将CISC全部硬件集成在一颗芯片上。  ARM缺点是:在性能上接近X86,频率就要比X86处理器高,这就会造成高能耗。 文章来源于csdn:femrice
常见加密算法之Base64编码算法 一:Base64编码的原理 (1)Base64是什么 Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。三个字节有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。一些如uuencode的其他编码方法,和之后binhex的版本使用不同的64字符集来代表6个二进制数字,但是它们不叫Base64。 (2)Base64的使用场所 Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数 据。包括MIME的email、在XML中存储复杂数据。 (3)Base64的原理 Base64可以将ASCII字符串或者是二进制编码成只包含A—Z,a—z,0—9,+,/ 这64个字符( 26个大写字母,26个小写字母,10个数字,1个+,一个 / 刚好64个字符)。这64个字符用6个bit位就可以全部表示出来,一个字节有8个bit 位,那么还剩下两个bit位,这两个bit位用0来补充。其实,一个Base64字符仍然是8个bit位,但是有效部分只有右边的6个 bit,左边两个永远是0。 Base64的编码规则是将3个8位字节(3×8=24位)编码成4个6位的字节(4×6=24位),之后在每个6位字节前面,补充两个0,形成4个8位字节的形式,那么取值范围就变成了0~63。又因为2的6次方等于64,所以每6个位组成一个单元。 二:Eclipse中Base64算法实现 首先新建一个工程,添加主程序使用jdk中给我们提供的包,直接输入Base64,会给我们导包:使用里面的方法encode,然后对1101字符进行编码,并且输出:继续使用decode方法对编码的结果进行解码输出:注意,这里decode的返回值是byte[]字节数组,所以需要new String进行类型转换。 总结 1、介绍base64的编码原理。 2、演示base64编码和解码的例子。
脱壳方法总结 一、单步跟踪法   脱壳的方法有很多,先来讲脱壳方法中最基础的单步跟踪法。单步跟踪法就是利用OD的单条指令执行功能,从壳的入口一直执行到OEP,最终通过这个OEP将原程序dump出来。然当,在单步跟踪的时候需要跳过一些不能执行到的指令。   使用单步跟踪法追踪OEP的常见步骤:   1、用OD载入待脱壳文件,如果出现压缩提示,选择“不分析代码”;   2、向下单步跟踪,实现向下的跳转;   3、遇到程序往上跳转的时候(包括循环),在回跳的下一句代码上单击并按键盘上的“F4”键跳过回跳指令;   4、OD中的绿色线条表示跳转没有实理,不必理会,红色线条表示跳转已经实现;   5、如果刚载入程序的时候,在附近有一个CALL指令,那么就要按键盘上的“F7”键跟进这个CALL内,不然程序很容易运行起来;   6、在跟踪的时候,如果执行某个CALL指令后就运行,一定要按键盘上的“F7”键进入这个CALL之内再单步跟踪;   7、遇到在popad指令下的远转移指令时,要格处注意,因为这个远转移指令的目的地很可能就是OEP。 二、ESP定律法   ESP定律法是脱壳的利器,是国外友人发现的。有了ESP定律,可以方便我们脱掉大多数的压缩壳。可谓是本世纪破解界中最伟大的发现之一。这里只简单的看一下狭义ESP定律的原理。   使用ESP定律追踪OEP的常见步骤:   1、将待脱壳程序载入到OD中,开始就按键盘上的“F8”键单步跟踪一步,这时如果看到OD右边的寄存器窗口中的ESP寄存器的值有没有变为红色,如果发现ESP寄存器的值变为红色,执行第2步;   2、在OD的命令行窗口中执行命令hrXXXXXXXX,xxxxxxxx就是变为红色的ESP寄存器的值,在输入命令之后,一定不要忘记按键盘上的回车键;   3、按键盘上的“F9”键让程序运行起来;   4、使用单步跟踪的方法跟踪到OEP即可。   三、二次断点法   二次断点是有技巧的下两个断点,在两个断点之后就可以很轻松的找到OEP。   使用二次断点法追踪OEP的常见步骤:   1、将待脱壳程序载入到OD中,单击OD的“选项”菜单下的“调试设置”命令,在弹出的“调试选项”对话框中切换到“异常”选项卡,勾选该选项卡下的所有复选框,也就是忽略所有异常;   2、按键盘上的“ALT+M”组合键打开OD的内存窗口;   3、在OD的内存窗口中找到“.rsrc”区段,单击该区段后按键盘上的“F2”键在该区段上下一断点;   4、按“Shift+F9”让程序运行到断点心处,而后再次打开OD的内存窗口,这次在“.rsrc”区段上面的“.code”区段(有的时候就是“.text”)上下一个断点;   5、按“shift+F9”让程序运行到第二次下的断点处,然后单步跟踪既可以来到OEP。   四、末次异常法   在脱壳方法中,末次异常法又被称为最后一次异常法,这是最基础的脱壳技术之一。末次异常法脱壳很是简单,但就是这简单的脱壳方法可以挑掉曾经风靡一时的强壳。   使用末次异常法追踪OEP的常见步骤:   1、将待脱壳程序载入到OD中,单击OD的“选项”菜单,在弹出的菜单中单击“调试设置”命令,在随后弹出的“调试选项”对话框中切换到“异常”选项卡,清除该选项卡下所有复选框,也就是不忽略任何异常;   2、连续按键盘上的“Shift+F9”组合键让程序运行起来,记录按键的次数X;   3、回到OD中,按键盘上的“Ctrl+F2”组合键重新载入程序,按X-1次“Shift+F9”组合键;   4、在OD右下角窗口中找到“SE句柄”或是“SE处理程序”,记录此处的内存地址;   5、在OD的反汇编窗口中跟随到上一步记录下的内存地址,并在此内存地址处下一个断点;   6、按键盘上的“Shift+F9”组合键让程序运行到上一步下的断点处,按键盘上的“F2”键取消此处的断点;   7、使用单步跟踪法追踪到OEP。   五、模拟跟踪法   在这章中讲到的众多脱壳方法中,我们首先讲了单步跟踪法脱壳,因为单步跟踪脱壳法是脱壳技术中最基础的方法,在后面其它的一些脱壳方法中总会或多或少的配合单步跟踪法才能顺利完成脱壳工作。便是始终是一次次的按“F8”键来单步跟踪程序,偶尔遇到回跳就跳过执行,这样机械性的操作很是烦人,那么能不能让机器来代替人力,让工具帮我们单步跟踪呢?答案是肯定的,这也就是这节讲的内容——模拟跟踪法。模拟脱壳法就是模拟单步跟踪来进行查找OEP。   模拟跟踪法的常见步骤:   1、将待脱壳程序载入OD中,先简单的跟踪一下程序,看看有没有SEH暗桩;   2、按键盘上的“ALT+F9”打开OD的内存窗口,找到“SFX,输入表,资源”的行,并记录此行的内存地址;   3、在OD的命令行窗口执行命令“tc eip<上一步中记录下的地址”,命令执行后就会跟踪到OEP。   六、SFX自动脱壳法   在上一节,我们使用模拟跟踪法代替手动单步跟踪法进行脱壳。在OD中,不但可以利用模拟跟踪来代替单步跟踪进行脱壳,从而节省劳动力,还有一种SFX自动脱壳的方法也可以节省劳动力,并能快速有效的将程序的壳脱掉。   使用SFX自动脱壳法脱壳的常见步骤:   1、将OD设置为忽略所有异常;   2、在OD的“调试选项”对话框的“SFX”选项卡中选择“字节模式跟踪实际入口”选项并确定;   3、将待脱壳程序载入OD,待程序载入完成后,会直接停在OEP处。   七、出口标志法   前面几个脱壳方法中有一个共同点,就是在单步跟踪到popad指令后面不远处的jmp指令的时候,就可以大胆的判断这个jmp指令的目的地址就是OEP。原因很简单,popad指令用于将壳运行之前保存的环境恢复,使原程序能正常运行。有些壳的popad指令很少,我们就可以查看被这种壳加壳的程序的所有popad指令,找到后面存在jmp指令的popad指令,然后来到其后的jmp指令的目的地址,这很可能就是OEP,然后就可以进行dump脱壳了。   使用出口标志法脱壳的常见步骤:   1、将待脱壳程序载入OD中,在OD的反汇编客人口中单击鼠标右键,在弹出的右键菜单中单击“查找”→“所有命令”,在弹出的输入框中输入“popad”并按“查找”按钮;   2、逐一尝试跟踪查找到的所有“popad”指令,最终达到程序的OEP
APP加固原理 对App进行加固,可以有效防止移动应用被破解、盗版、二次打包、注入、反编译等,保障程序的安全性、稳定性。对于金融类App,尤其重要。 对App dex进行加固的基本步骤如下: 1. 从App原始apk文件里获取到原始dex文件 2. 对原始dex文件进行加密,并将加密后的dex文件和相关的存放到assert目录里 3. 用脱壳dex文件替换原始apk文件里的dex文件;脱壳dex文件的作用主要有两个,一个是解密加密后的dex文件;二是基于dexclassloader动态加载解密后的dex文件 4. 因为原始apk文件已经被修改,所以需要删除原始apk的签名信息,即删除META-INF目录下的.RSA、.SF 和MANIFEST.MF文件 5. 生成加固后的apk文件 6. 对加固后的apk文件进行签名,apk加固完成。 原理分析: 1.为什么要对原始dex进行加密,同时用脱壳dex文件替换原始dex文件?大部分的apk反编译工具(dex2jar、apktools、jui等)都是对dex文件进行反编译,将dex文件反编译成smail,然后再转化成class文件进行阅读和修改。用脱壳dex替换原始dex文件之后,用上面的反编译工具反编译apk文件,只能看到脱壳程序的class文件,看不到apk本身的class文件。对dex文件进行加密,这样即使第三方拿到了dex文件,以为无法解密,也就无法对其进行解析和分析。 2.怎么确保apk功能正常运行?加固后的apk启动之后,脱壳dex文件会对加密后的dex文件进行解密,然后机遇dexclassload动态加载解密后的dex文件。从用户的角度,加固前后App的功能和体验基本是一样的。 3.dex加固主要是防止被静态反编译,进而获取源码并修改 延伸: 道高一尺,魔高一丈。为了更好的对app进行防护,有了跟多更深的加固功能,防dump、防调试、特定代码加固和so加固等。
(分享)饿了麽APP逆向及爬虫实现详参 一、前言 今天主要以饿了麽为例,讲解一下APP逆向的大致流程,以及遇到问题的处理办法。二、概述 APP逆向的目的是为了了解APP本身的运行逻辑,进行修改或进行还原。涉及到的技术和工具,见下图。对于抓包我就不详细讲了,不清楚的看一下我之前的文章。 HTTPS抓包与手机抓包,看这一篇就够了mp.weixin.qq.comHTTPS就不能抓包了?开什么玩笑!mp.weixin.qq.com好了,下面我们干正事,讲饿了麽。 三、需求 通过还原APP接口,获取附近商家。 但因为饿了么查看商家必须登录,故需要先逆向登录接口。 四、抓饿了麽的包 打开PacketCapture,选择饿了麽,打开饿了麽APP。这是为什么?断网了?这种情况主要是因为抓包引起的,APP本身做了HTTPS证书校验,简单的可以通过插件解决,办法参见以前的文章。 Xposed+JustTrustMe关闭SSL证书验证mp.weixin.qq.com好了解决了抓包问题,那就能找到登陆的接口了。 通过抓包,得到登录步骤为: 请求发送短信 需要图形验证码,请求图形验证码 带验证码请求发送短信 带短信验证码登录(登陆完成拿到cookie) 获取附近商家 每一步的接口如下: URL:http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Frestapi.ele.me%2Feus%2Flogin%2Fmobile_send_code&urlrefer=75cd71bd8714c7813c664c5bc2ecebc1 URL: http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Frestapi.ele.me%2Feus%2Fv4%2Fcaptchas%3Fcaptcha_str%3D&urlrefer=7af2726aa499154e9f8d6ff42842822a{手机号码} URL:http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Frestapi.ele.me%2Feus%2Flogin%2Fmobile_send_code&urlrefer=75cd71bd8714c7813c664c5bc2ecebc1 URL:http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Frestapi.ele.me%2Feus%2Flogin%2Flogin_by_mobile&urlrefer=a67a337a82c3cccbecef865c63acf676 URL:http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Frestapi.ele.me%2Fshopping%2Fv3%2Frestaurants%3Fextras&urlrefer=5cdef5f01cfcb09cb7e967fa96667800[]=identification&extras[]=coupon&latitude=32.29290046542883&longitude=110.04603732377291&city_id=3&rank_id=b1969c73a19b4dc68b31628ea85d8eaf&network_operator=&network=WIFI&order_by=5&extra_filters=home&os=Android%2F6.0.1&deivce=Nexus%206P&weather_code=PARTLY_CLOUDY_DAY&offset=0&limit=20 直接看参考答案的感觉怎么样?五、参数分析 对于抓包的相关参数(自己看报文就能知道,我没有写header参数和url参数),中间很多是我们一眼就能看出来的比如时间戳、机型、坐标、固定值等,需要逆向的主要有以下几个。 x-eleme-requestid、x-deviceinfo、deadpool相关三个参数六、逆向分析 参数x-eleme-requestid 在jadx中打开饿了麽APP,搜索关键字x-eleme-requestid看到四个,不多。 按道理来说,应该先看第四个,但是后来并没有找到a的生成位置。好我们看一下二、三。(OS:“你为啥不看一”)看到a是个static变量,那就得看一下谁调用他了,右键find usage。会心一笑。手到擒来。解释一下。点进去看一下。我个憨憨!!!好了,不要在意这些细节。我们点进去这个a()看看。清清楚楚,国际通用的算法UUID去掉短杠后加上竖杠再加时间戳。 参数x-deviceinfo打眼一看,这是啥,base64啊!对x-deviceinfo进行base64解密,可得到:均是设备基本信息,按照格式生成即可,注意要和外部其他设备基本信息保持一致。 deadpool相关三个参数 一共三个参数,分别为:搜索deadpoolcontent。又是hashmap.put,为什么我们要对他敏感,因为它和我们的目标关键字呆在一起的时候,很可能就是给header里构造参数的啊。我们点开第二个看一眼。继续找这个sneer函数。(我总觉得他这个函数叫这个名字是故意鄙视我的。)好了,在libuiseris.so里面,这就麻烦了,要还原这个算法有三种办法。 硬刚。逆向so。我后来看了下,so有反调试,so里面又调了java层的函数,还原比较麻烦一些。 利用。hook这个sneer函数,找到他的方法地址,在你的代码需要的时候,发请求到手机里,手机进行调用执行,计算完以后返回给外部。 虚拟。虚拟环境执行so中的sneer方法,可参见github上的Unicorn这个项目。 我用的是第二个办法,在手机里面起了HTTP服务,接受请求计算后返回给外部。 但是! FPX和G2的比赛要开了,今天不继续写了,下次再写个续,讲一下hook调用这个事儿吧。 FPX加油。内容来源于:http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fzhuanlan.zhihu.com%2Fp%2F91150834&urlrefer=858988ad8b01cc8c446500527b8fdcf6 侵权删
Java项目源码为什么要做代码混淆 代码混淆,是将计算机程序的代码转换成一种功能上等价,但是难于阅读和理解的形式的行为。代码混淆可以用于程序源代码,也可以用于程序编译而成的中间代码。执行代码混淆的程序被称作代码混淆器。目前已经存在许多种功能各异的代码混淆器。 代码混淆的主要目的是为了保护源代码,阻止反向工程。反向工程会带来许多问题,诸如知识产权泄露,程序弱点暴露易受攻击等。使用即时编译技术的语言,如Java、C#所编写的程序更容易受到反向工程的威胁。 代码混淆的主要的方法有: 将代码中的各种元素,如变量,函数,类的名字改写成无意义的名字。比如改写成单个字母,或是简短的无意义字母组合,甚至改写成“__”这样的符号,使得阅读的人无法根据名字猜测其用途。 重写代码中的部分逻辑,将其变成功能上等价但是更难理解的形式。比如将for循环改写成while循环,将循环改写成递归,精简中间变量,等等。 打乱代码的格式。比如删除空格,将多行代码挤到一行中,或者将一行代码断成多行等等。 代码混淆器也会带来一些问题。主要的问题包括: 被混淆的代码难于理解,因此调试除错也变得困难起来。开发人员通常需要保留原始的未混淆的代码用于调试。 对于支持反射的语言,代码混淆有可能与反射发生冲突。 代码混淆并不能真正阻止反向工程,只能增大其难度。因此,对于对安全性要求很高的场合,仅仅使用代码混淆并不能保证源代码的安全。
ARM处理器寻址方式 寻址的概述 寻址是指寻找寄存器里存放的数据或者是地址里存放的数据并加以使用。 寻址有以下八种方式: 1.立即寻址; 2.寄存器寻址; 3.寄存器移位寻址; 4.寄存器间接寻址; 5.基质寻址; 6.多寄存器寻址; 7.堆栈寻址; 8.相对寻址。 一:立即寻址 立即寻址指令中的操作码,字段后面的地址码部分,即是操作数本身,也就是说,数据包含在指令当中,取出指令也就取出了可以立即使用的操作数(这样的数称为立即数)。立即寻址,具体操作流程如下图所示。二:寄存器寻址 操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作,如下图所示。三:寄存器移位寻址 寄存器移位寻址是ARM指令集中特有的寻址方式,如下图所示。 当第2个操作数是寄存器移位寻址方式时,第2个寄存器操作数在与第1个操作数运算之前,先进行移位操作,如下图所示。四: 寄存器间接寻址 寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针,如下图所示。五:基址寻址 基址寻址就是将基址寄存器中的内容与指令给出的偏移量相加,形成操作数的有效地址,如下图所示 。基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等,如下图所示。六:多寄存器寻址 多寄存器寻址一次可传送若干个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。 在多寄存器寻址中会进行两个操作,一个是操作数据,另外一个是修改地址。 LDMIA中的A表示先进行①操作,再进行②操作。如果是LDMIB则表示先②后①,如下图所示。 LDMIA中的I表示存储器地址由低到高操作,如果是D则表示由高到低,如下图所示。七:堆栈寻址 堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出”,堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种,如图4.11所示。 向上生长:向高地址方向生长,称为递增堆栈。 向下生长:向低地址方向生长,称为递减堆栈。堆栈指针指向最后压入的堆栈的有效数据项称为满堆栈,堆栈指针指向下一个待压入数据的空位置称为空堆栈。如下图所示。这里可以组合出四种类型的堆栈寻址方式。 1.满递增:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA等。 2.空递增:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等。 3.满递减:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD、STMFD等。 4.空递减:堆栈向下增长,堆栈指针指向堆栈下的第一个空位置。指令如LDMED、STMED等。 八: 相对寻址 相对寻址是基址寻址的一种变通。由程序计数器PC提供基准地址,地址码字段作为偏移量,两者相加得到的地址即为操作数有效地址,如下图所示。小结: 通过本节课的学习,我们了解了什么是寻址,以及寻址的八种方式:立即寻址、寄存器寻址、寄存器移位寻址、寄存器间接寻址、基地寻址、多寄存器寻址、堆栈寻址和相对寻址。
软件逆向需要学习的基础知识 知识块 逆向是一门杂学而非专科,涉及的知识很多,所以我这里先谈谈分块,以及每个分块的作用 汇编 汇编这块没什么特别需要说的 搞逆向不掌握一些汇编,基本就是盲人摸象,能出成果就只能靠运气。 汇编分为arm和x86两大架构 然后每个架构又分为32位和64位 随着64位机器的普及 32位程序会越来越少 这块的学习难点在于64位CPU和32位CPU差异明显,甚至可以说是巨大 所以可以认为是两个汇编语言 要精通这块非常难 但是大家可以先从简单的上手 C/C++ 为什么要说C/C++ 可能有的人说我不会这个也能逆向呀 话虽然如此,但是这里面有一个很重要的问题 很多linux或者android的系统库,都是使用C和C++写的 一些游戏的引擎、加密解密、网络通信、签名校验等等模块 也是用C/C++写的模块 除此之外,大量的开源模块(音视频、图形图像处理等)也是采用的这些开发语言 所以不会也能做,但是会可以让你有更多的手段和方法去做 除了这个原因 另外一个原因是很多逆向工具的底层也需要该语言 Java 现在是手机的时代,也是移动互联网的时代 android作为移动开发的主力平台之一 其上应用开发的主要语言Java也就自然水涨船高 熟悉Java,进而熟悉android的Java库 对于逆向分析、拦截破解有至关重要的帮助 文件格式 文件格式这块比较杂 简单的包括wav、bmp、apk文件格式 有了一定了解以后,可以尝试去解析pe、elf文件格式 然后可以尝试png、jpeg、jar、dex文件格式 最后就可以尝试一下一些没有详细文档的文件格式 比如luac、ocx 加密/编码算法 这块首先要了解的是一些基础的 比如异或、比如url编码等等 然后了解base64(出镜率极高)crc校验算法 md5 接着可以学习tea 最后可以搞搞aes des 注意这些算法可以先学习正向的 不同的算法处理过的数据会有一些特征 见多了,很多时候可以在你逆向的时候给予你很大的帮助 工具 工具这块就更多了 od、ida、wireshark、x64dbg、frida、visual studio、make、gcc 这些论坛上面有,我就不赘述了 其中有一些是开发工具,比如visual studio 虽然这些工具是开发工具,但是其中包含很多工具 比如spy++,比如depends等等 框架 逆向框架比较多 比如Cydia、xposed、substrate、ghidra等等 每个框架其所适用的平台、条件也略有差异 Cydia主要是在苹果下做逆向 xposed则主要是android下逆向 substrate是一种拦截的方案 ghidra则是一个集成环境 其他 逆向这块所需要的知识其实没有一个尽头 除了上面的一些内容,下面这些内容,对你的逆向也会有极大的帮助 网络协议(http、https、ftp、ssh) CPU架构(arm架构、x86架构、64位架构、机器码) 操作系统(Windows、Linux、android、iOS) 驱动开发 中断原理 动态库的加载和卸载 先写这么多吧,后续有问题我再修改补充 欢迎大家提问和讨论
为什么java比python复杂,还是有很多人选择学习java? 这是一个非常好的问题,也是很多初学编程的人比较关心的问题之:一,作为一 名IT从业者,同时也 是一名教育工作者,我来回答- -下。 首先,当前Java和Python都是流行程度比较高的编程语言,而且二者都同为全场景编程语言,在 Web开发、大数据开发等领域都有广泛的应用,从应用前景来看,未来很长一段时间内, Java和 Python都依然会占据着重要的位置。 Java与Python相比,在优势方面可以归纳为三点,其-是Java在生产场景 下有更健全的技术生态, 虽然当前Python语言的生态也比较完善,但是在生产场景下,Java的优势还是比较明显的,这也是 为什么很多互联网技术团队更愿意采用Java的重要原因。 其是Java在性能上的表现要更好一些, Java程序员在转向Python时会有更加明显的体验。通常来 说,在探讨语言性能时一定不能脱离应用场景,不同语言在不同的场景下往往有不同的性能表现, 就比如拿C语言与Java语言相比较,C语言的执行效率要更高,但是二者之间的应用场景并不相同, 所以这种比较意义并不大,该用C语言的程序员还是会用C语言,该用Java语言的程序员也依然会继 续用Java。 由于Java和Python语言在很多场景下是重叠的,所以探讨=者的性能就有一定必要性了 ,这也是为 什么当前对于性能要求更高的场景会使用Java的原因之一。 其三是在安全性的表现上, Java语言要更完善一些,注意是更完善,而不是更好。看一门语言在安 全领域的表现,可以重点看一下专注于安全领域的企业都在采用何种技术选型, 目前大型安全企业 的产品,尤其是工业互联网安全领域,不少产品已经从Python转向到了Java,这足以说明一定的问 题 最后,对于要进入IT互联网行业发展的人来说,当前学习Java语言是不错的选择,而对于要进入传 统行业发展的人来说,可以重点学习-下Python。
首页 1 2 下一页