Aurore💦
我不是Huai人的
关注数: 21
粉丝数: 164
发帖数: 5,240
关注贴吧数: 21
你觉得学python还是java好找工作? 二选一的话,计算机专业学生,应该选Java。 其他专业的学生,选Python。 为什么这么建议? Java技术成熟度高,业界应用广泛,岗位多,求职机会多,但相应地,会的人也多,内卷比较厉 害。计算机专业学生要学四年,只要别懒,还是有足够的时间把Java这把剑打磨得锋利的。 其他专业跨过来的,对于大多数普通学生,想在这种"内卷”的Java就业市场上取胜,想“干翻” 竞争对手,在软件工程与编程技能这块就必须要达到-定的水准。编程是一种技能,是需要时间去 磨出来的。如果以前没有基础,"临时"转的, 在时间上恐怕就来不及了。 相反,Python入f 门简易,对软件开发技能这块并不要求太高,重点和难点反而是特定的应用领域本 身,这时,诸如数学、行业背景知识等因素的重要性反而突显出来,在这些方面,计算机专业的学 生未必占有优势,甚至可能是居于劣势。 扬长避短,是取胜的重要原则。 以上观点针对大多数普通学生,排除个例与特例。 下面再说说自己的观点,我更赞同Java,因为广泛就业也广泛
零基础如何学习挖漏洞? 挖洞起步很简单,但是后期难度会逐渐递增
为什么最近网络安全培训突然火起来了,黑客真的可以速成吗? 看到网上很多黑客攻防技术的培训 都是线上还不用现场,动不动0基础起点,究竟值得可信吗?
为什么最近网络安全培训突然火起来了? 是因为现在的网络安全很吃香吗? 还是说现在国家的一片利好政策,对网络安全越来越重视了,所以大量培训班开始输送这一方面的人才
xposed的一些经验分享 加壳的应用上如何用xposed 如下代码是某个通过棒棒加固的APP,首先获取到加固替换掉的Application然后再获取到ClassLoader,其实跟Xposed的loadPackageParam.classLoader一个原理,只是加固应用多了一步。函数中传的接口类(interface) 这个很多网站上有案例,通过java.lang.reflect.Proxy能解决。很多人到了hook异步请求或者rxjava就头疼,因为很多参数或者返回值都是类似A<T>或者interface,配合下面实例可以轻松解决。其他问题 如果需要用APP内的Context的话直接搜索public static Context关键词能搜索到很多函数随便调用。 需要某个实例化类先找找APP内的instance函数或者获取实例的static函数,如果没有的话用xposed去instance callMetchod传enum类型的参数处理异步请求结果时配合Map和sleep上述的一些问题可能不常见或者网上资料少分散的,xposed开发时遇到的问题其实很多,有些跟国产ROM相关,有些跟安卓版本相关,这些只能看命了。
安卓逆向学习路线以及书籍推荐
逆向工程学习书籍及学习路线 逆向学习书单逆向学习路线
对反游戏外挂技术的思考及实现 现如今,有很多游戏外挂软件,它们可以修改游戏显示的数据和内部代码,来达到谋取利益的目的。在实现反外挂技术前,我先介绍一下常见的三种外挂: 1.模拟类外挂:该外挂可以说是最早的外挂了,它是往游戏发送伪造的按键消息来模拟人的手工操作。实现的思路为:2. 内部Call调用外挂:使用逆向技术分析出游戏内部的汇编代码,把里面对游戏玩家有利的函数作为外挂的实现功能。实现的思路为:3. 脱机外挂:分析出游戏客户端和服务端之间的通信逻辑,使用自己发送和接受数据来跟服务端进行交互。实现的思路如下:保护call函数和基址数据 1.最近玩植物大战僵尸和连连看等游戏的时候发现,这些游戏需要通过启动程序才能正常运行,那么我突发奇想,如果在程序运行前,修改游戏中的部分代码段数据,等需要运行游戏时再通过另一个程序恢复代码段数据,那么就可以起到保护游戏的作用。2. 对于游戏外挂制作者,他们经常习惯性的使用OD工具和CE工具、ida工具等,找出游戏的基址数据(也为全局变量)和内部call,然后修改基址数据或者修改执行流程,调用内部call。那么在游戏运行前就对基址数据地址和某些call后接地址进行修改,等需要运行游戏时,再修改回基址地址和call调用的地址,就可以起到反外挂的作用。3. 接下来,介绍一下这样做的作用:4. 简单介绍一下实现的流程:1.读取PE文件信息到内存中,遍历PE文件中的代码段,找到函数头部地址和使用的全局变量地址;2.在代码段中,找出调用函数的call指令,把call后接地址进行修改,对于数据,找到使用全局变量的mov指令,修改地址操作数;3.运行时,使用CreateProcess函数创建线程并挂起,然后恢复代码段中的数据并运行进程5. 我开发了一款反游戏外挂工具(该工具及其源码可在文章末尾下载)来模拟这个过程,在文件选择框选择要保护的PE文件,把需要保护的函数及数据添加到左边栏中,执行保护时,在PE文件目录下会生成已保护的PE文件,点击运行时,就能正常运行。检测代码段 1.在游戏没有运行之前,修改、添加或删除PE文件的二进制信息可以起到修改程序流程的作用,从而起到外挂的作用。实现的技术有:在代码段的空白区域添加"洞穴代码",修改OEP的值,让程序跳转到洞穴代码;使用Inline HOOK执行外挂功能函数;修改代码段中的跳转指令和call后接地址,执行游戏内部汇编指令或者调动内部call等2. 在游戏运行时,通过外挂工具动态修改、添加或删除进程代码段数据或者动态注入shellcode同样也能起到修改程序流程的作用,那么需要校验PE文件和游戏内存数据就可以检测出游戏外挂。3. 在实际运用中,可以计算出PE文件的校验值,存放在游戏第三方程序的数据段中或者存放在游戏的服务器端,那么在游戏运行前校验PE文件值和运行时动态检验进程内存,接下来使用工具来模拟这个过程:1.选择PE文件计算PE文件校验值和记录代码段数据;2.选择需要校验的文件,同样也计算出校验值并比较是否变化;3.选择正在运行的进程,比较代码段数据是否变化。4. 实现的思路为:1.使用MD5算法计算出前后PE文件的校验值,并进行比较;2.先使用数组存放PE文件代码段数据,后读取进程内存中的代码段数据,然后比较数组数据是否相同5. 在游戏运行时,把游戏运行过程中使用过的函数及其相关的寄存器信息存放在服务端,在服务端检测函数的调用流程,就可以判断游戏内部call有没有非法调用。不过我这里模拟这个过程的方式是把函数运行时的信息写到日志文件中,查看日志信息来判断游戏内部call是否被非法调用。6. 实现的思路为:1.调式进程,循环接受调式事件;2.在刚开始调式时,把函数头部修改为CC;3.当发现中断时,判断发生中断的地址是否为函数头部地址,是的话,把线程上下文信息记录在日志文件中HOOK检测 1.现在,有各种各样的HOOK技术,包括 InLine HOOK、IAT HOOK、API HOOK等,其中大部分需要注入dll来实现HOOK功能,那么游戏运行时,服务端或者游戏第三方程序可以检测有无dll注入,有的话,及时清除掉。实现的思路为:1.先记录游戏运行过程中用的dll文件名;2.游戏运行时遍历进程使用的dll文件名,若遇到不名dll文件名,则进行释放;2.使用工具模拟这个过程:选择进程,选中dll文件所在目录,点击检测dll,就可检测出进程中是否有dll注入。3. 那么,除了检测dll文件外,还可以检测 IAT表和函数内部代码的跳转指令来判断游戏中是否有IAT HOOK或者InLine HOOK(跟API HOOK差不多,范围比API HOOK小,我这里就不介绍了),实现的过程为:1.选中游戏PE文件后,定位到导入表目录,遍历INT表中的_IMAGE_THUNK_DATA,通过里面的联合体u1,来获取游戏运行后IAT表中的函数地址;2.选中进程,读取进程内存中IAT表信息并比较函数地址,不同则说明有 IAT HOOK;3.对于InLine HOOK,读取进程代码段中函数区域的跳转指令操作数,若发现跳转到别的函数区域,则说明有InLine HOOK;4.使用工具模拟这个过程:选中进程和PE文件,再点击 IAT HOOK按钮或者InLine HOOK按钮就可进行检测。多开检测和动态调式工具检测 1.现在的打金工作室可以同时开多个号来刷金币,那么需要限制游戏多开,当动态调式进程时,在任务管理器中可以看到调式工具的主线程成了调式进程,那么调式器内存里面必然会有调式进程的内存信息,那么找到调式工具后再查找里面是否含有游戏进程的内存信息,若有则可以判断,游戏处于调式状态。2.对于防多开,经常会用到下面的代码,那么外挂制作者修改跳转指令或者NOP掉汇编代码就可以实现多开。为了防止这种情况,我这里把CreateMutex函数头部修改为CC,使用调式器的方式不断监控异常事件,当CreateMutex函数头部触发中断异常时,获取互斥体变量名(地址为:ESP+8),并判断该变量名是否出现过,若出现过,则检测出进程出现多开。实现的关键代码如下:检测多开的关键代码:3.对于多开检测,我还想出了三种检测方法:1.获取进程代码段信息,使用代码段信息匹配的方式来判断是否有相同的进程运行;2.获取进程所有的窗口句柄,匹配查找有无跟窗口标题相同的窗口,有则说明多开;3.对进程名进行匹配;4.对于调式工具检测,还是使用代码段识别法:获取OD工具中代码段信息匹配寻找相同进程,若有,则再识别内部有无游戏进程的内存信息并且再判断调式进程是否为调式工具的子进程,两者有一成立,则说明游戏进程处于调式状态,实现的关键代码如下:5.接下来,使用工具进行检测:多开检测只需选中进程点击“多开检测”按钮即可;调式工具检测要选中进程和调式工具,操作情况如下所示:添加反调式法 1.在游戏的PE文件中添加反调试,不为是一种较好的反外挂方法。在PE文件中修改TLS表信息,扩大最后一个节表并在空白区域添加PIMAGE_TLS_DIRECTORY结构信息、TLS回调函数,并在TLS回调函数中添加反调试功能即可实现反调试。2.实现反调试的思路为:1.把PE文件加载到内存中,使用偏移的方式定位到TLS数据目录,修改其中的 RVA字段值和Size字段值,让 RVA指向PIMAGE_TLS_DIRECTORY起始地址;2.定位到最后的节表结构并增加SizeOfRawData的值和修改Characteristics的值,使最后的节表具有可执行特性。3.最后把生成的PIMAGE_TLS_DIRECTORY结构数据和回调函数ShellCode复制到最后的节表中。3.除了往PE文件添加TLS反调式外,还可以添加SEH反调试,实现的思路为:1.先在代码段,寻找足够大的空闲区域,若没有找到,则新增最后节表大小;2.确定空闲区域开始地址,修改OEP的值,在空闲区域添加触发SEH异常的Shellcode,在该Shellcode中有异常处理函数,该异常处理函数会判断游戏是否处于调式中,如果没有处于调式状态则跳回OEP中,否则中止;4.接下来使用工具添加反调试,选中文件,点击按钮即可。以上使用的工具和源码均可下载,希望该工具及源码对大家有所帮助,工具存在bug的话,欢迎提出,大家共同探讨,共同提升!
ARM处理器寻址方式 寻址的概述 寻址是指寻找寄存器里存放的数据或者是地址里存放的数据并加以使用。 寻址有以下八种方式: 1.立即寻址; 2.寄存器寻址; 3.寄存器移位寻址; 4.寄存器间接寻址; 5.基质寻址; 6.多寄存器寻址; 7.堆栈寻址; 8.相对寻址。 一:立即寻址 立即寻址指令中的操作码,字段后面的地址码部分,即是操作数本身,也就是说,数据包含在指令当中,取出指令也就取出了可以立即使用的操作数(这样的数称为立即数)。立即寻址,具体操作流程如下图所示。二:寄存器寻址 操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作,如下图所示。 三: 寄存器移位寻址 寄存器移位寻址是ARM指令集中特有的寻址方式,如下图所示。当第2个操作数是寄存器移位寻址方式时,第2个寄存器操作数在与第1个操作数运算之前,先进行移位操作,如下图所示。四:寄存器间接寻址 寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针,如下图所示。五:基址寻址 基址寻址就是将基址寄存器中的内容与指令给出的偏移量相加,形成操作数的有效地址,如图4.7所示。基址寻址用于访问基址附近的存储单元,常用于查表、数组操作、功能部件寄存器访问等,如下图所示。 六: 多寄存器寻址 多寄存器寻址一次可传送若干个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。 在多寄存器寻址中会进行两个操作,一个是操作数据,另外一个是修改地址。 LDMIA中的A表示先进行①操作,再进行②操作。如果是LDMIB则表示先②后①,如下图所示。 LDMIA中的I表示存储器地址由低到高操作,如果是D则表示由高到低,如下图所示。七:堆栈寻址 堆栈是一个按特定顺序进行存取的存储区,操作顺序为“后进先出”,堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元即是堆栈的栈顶。存储器堆栈可分为两种,如下图所示。堆栈指针指向最后压入的堆栈的有效数据项称为满堆栈,堆栈指针指向下一个待压入数据的空位置称为空堆栈。如下图所示。这里可以组合出四种类型的堆栈寻址方式。 1.满递增:堆栈向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA、STMFA等。 2.空递增:堆栈向上增长,堆栈指针指向堆栈上的第一个空位置。指令如LDMEA、STMEA等。 3.满递减:堆栈向下增长,堆栈指针指向内含有效数据项的最低地址。指令如LDMFD、STMFD等。 4.空递减:堆栈向下增长,堆栈指针指向堆栈下的第一个空位置。指令如LDMED、STMED等。 八: 相对寻址 相对寻址是基址寻址的一种变通。由程序计数器PC提供基准地址,地址码字段作为偏移量,两者相加得到的地址即为操作数有效地址,如下图所示。## 小结: 通过今天的分享,我们了解了什么是寻址,以及寻址的八种方式:立即寻址、寄存器寻址、寄存器移位寻址、寄存器间接寻址、基地寻址、多寄存器寻址、堆栈寻址和相对寻址。 如果你也对安卓逆向感兴趣可以在评论区讨论
初学编程,你应该知道的五件事 你应该从哪门编程语言开始学习? 任何一门都可以! 直接开始使用任何一种流行的语言写代码就可以,不论是Python,Java,Javascript,Golang,Perl,C,Ruby,Julia,Haskell,还是PHP。你很快就会发现它的优雅之处,也会跌跌撞撞地遇到它的怪脾气,并开始与这个语言建立起一种亲密的相爱相杀的关系。你也会发现它背后超级棒的社区,而且也许你会爱上那里的朋友们! 流行的那几种语言几乎都是多用途的,任何一门语言都可以用来做任何事情(Javascrip现在都能用到卫星上了!),所以选哪一种都没错。 随着代码量的增多,你会发现编程语言其实就像人的语言一样,你需要根据自己想定居的地点来决定学习哪一种。 如果你要在俄罗斯定居,在那里说英语的话也许也有人能听懂,但你如果说俄语的话就能保证所有人都能听懂了。相似的,如果你想在游戏领域扎根,建议你学C++,而对于客户端的Web,比如说浏览器来说——JS是唯一的选择,数据科学领域则由Python 和 R语言统治。 说到底,是你在给机器下指令做一些事情,而这些指令可以用多种语言来表达。要开始试着把语言当成一个抽象层,它位于在你和机器之间,是一种交流的媒介。很快你就会发现,对编程艺术的研究远比语言本身重要得多。 我强烈推荐你听一听下面这个redhat播客,它能带你了解编程语言的进化原因和过程。(http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fwww.redhat.com%2Fen%2Fcommand-line-heroes%2Fseason-2%2Fhello-world%3Fref%3Dhackernoon.com&urlrefer=161fb925014128d53e6e0b9ddd92a102) 太长不看系列——甚至你选Basic(我在11岁的时候就自学过它)我也不在乎,反正就先动手写一个挺酷的玩意儿出来就对啦!
程序员编程一定要理科思维强吗? 程序员编程一定要理科思维强吗?我个人是不赞同这个观点的
ARM汇编语言程序结构 一: ARM汇编的规范 在ARM汇编中,所有标号都必须在一行顶格书写,且后面不需要添加高级语言所用的冒号,而所有的指令都不能顶格书写。ARM汇编器对标识符的大小写敏感,书写标号和指令时,字母大小写必须一致。在ARM汇编程序中,一条ARM指令、伪指令或寄存器名,可以全部为大写字母,也可以全部为小写字母,但不能大小写混合编写使用。注释使用“;”(分号),注释内容由“;”(分号)开始到此行结束,注释可以在一行的顶格书写。 标准的ARM指令格式为:[标号] <指令|条件|S> <操作数>[;注释] 源程序中允许有空行,适当的插入空行可以提高源代码的可读性。如果单行太长,可以使用字符“\”将其分行,“\”后不能有任何字符,包括空格和制表符等等。对于变量的设置,常量的定义,其标识符必须在一行的顶格书写。 汇编指令正确的例子和错误的例子如下: 正确的例子:错误的例子:二:符号 ARM 汇编中,符号可以代表地址、变量、数字常量,当符号代表地址时又称为标号,符号就是变量的变量名、数字常量的名称、标号,符号的命名规则如下: 1.符号由大小写字母、数字以及下划线组成; 2.除局部标号以数字开头外,其它的符号不能以数字开头; 3.符号区分大小写,且所有字符都是有意义的; 4.符号在其作用域范围内是唯一的; 5.符号不能与系统内部或系统预定义的符号同名; 6.符号不与指令助记符、伪指令同名。 三:常量 常量有数字常量、字符常量、布尔常量三种。 1.数字常量有三种表示方式: 十进制数,如:12,5,876,0; 十六进制数,如:0x4387,0xFF0, 0x1; n 进制数,用n-XXX 表示,其中n 为2~9,XXX 为具体的数。如2-010111,8-4363156等。 2.字符常量 字符常量由一对单引号及中间字符串表示,标准C 语言中的转义符也可使用。如果需要包含双引号或$,必须使用""""和$$代替。 例如:Hello SETS "Hello World!" Errorl SETS "The parameter ""VFH""error$$2" 3.布尔常量 布尔常量的逻辑真为{TRUE},逻辑假为{FALSE}。 例如:testno SETS {FALSE} 四:指令的基本格式及说明 ARM是指令的基本格式为: <opcode> {<cond>} {s} <Rd>, <Rn> {,<operand2>} 其中<>号内的项是必须的,{}号内的项是可选的。 各项说明如下: opcode: 指令助记符 cond: 执行条件 s: 是否影响CPSR寄存器的值 Rd: 目标寄存器 Rn: 第一个操作数的寄存器 operand2: 第二个操作数 条件码“cond”的使用可以实现高效的逻辑操作(节省跳转和条件语句),提高代码效率。所有的ARM指令都可以条件执行,而THUMB指令只有B(跳转)指令具有条件执行功能。如果指令不标明条件代码,将默认为无条件(AL)执行。 五: ARM指令条件域 ARM指令一般分为5个域: 第一个域是跟条件执行相关的cond,即条件码域; 第二个域是指令代码域,即opceode; 第三个域是地址基址Rn,即第一个操作数,为寄存器 第四个域是目标或源寄存器Rd; 第五个域是地址偏移或操作寄存器,操作数区,即Op2; 上述指令的5个域为:0000 0010 1001 0001 0000 0000 0000 1000 条件的指令执行中,cond有4位,共16种组合,跟CPSR配合决定指令是否执行,如下表所示。 例如:指令ADDEQ R4,R3,#1,带EQ标志位,只有CPSR当中的Z位置才执行该指令。 其中,条件后缀和S后缀的关系如下: 1.如果既有条件后缀又有S后缀,则书写时S排在后面,如ADDEQS R1,R0,R2该指令在Z=1时执行,将R0+R2的值放入R1,同时刷新条件标志位。 2.条件后缀是要测试条件标志位,而S后缀是要刷新条件标志位。 3.条件后缀要测试的是执行前的标志位,而S后缀是依据指令的结果改变条件标志。总结 我们了解了在ARM汇编的规范、指令条件域以及ARM指令的格式:<opcode> {<cond>} {s} <Rd>, <Rn> {,<operand2>},其中<>号内的项是必须的,{}号内的项是可选的。
对反游戏外挂技术的思考及实现 现如今,有很多游戏外挂软件,它们可以修改游戏显示的数据和内部代码,来达到谋取利益的目的。在实现反外挂技术前,我先介绍一下常见的三种外挂: 1.模拟类外挂:该外挂可以说是最早的外挂了,它是往游戏发送伪造的按键消息来模拟人的手工操作。实现的思路为:2. 内部Call调用外挂:使用逆向技术分析出游戏内部的汇编代码,把里面对游戏玩家有利的函数作为外挂的实现功能。实现的思路为:3. 脱机外挂:分析出游戏客户端和服务端之间的通信逻辑,使用自己发送和接受数据来跟服务端进行交互。实现的思路如下:保护call函数和基址数据 1.最近玩植物大战僵尸和连连看等游戏的时候发现,这些游戏需要通过启动程序才能正常运行,那么我突发奇想,如果在程序运行前,修改游戏中的部分代码段数据,等需要运行游戏时再通过另一个程序恢复代码段数据,那么就可以起到保护游戏的作用。2. 对于游戏外挂制作者,他们经常习惯性的使用OD工具和CE工具、ida工具等,找出游戏的基址数据(也为全局变量)和内部call,然后修改基址数据或者修改执行流程,调用内部call。那么在游戏运行前就对基址数据地址和某些call后接地址进行修改,等需要运行游戏时,再修改回基址地址和call调用的地址,就可以起到反外挂的作用。3. 接下来,介绍一下这样做的作用:4. 简单介绍一下实现的流程:1.读取PE文件信息到内存中,遍历PE文件中的代码段,找到函数头部地址和使用的全局变量地址;2.在代码段中,找出调用函数的call指令,把call后接地址进行修改,对于数据,找到使用全局变量的mov指令,修改地址操作数;3.运行时,使用CreateProcess函数创建线程并挂起,然后恢复代码段中的数据并运行进程5. 我开发了一款反游戏外挂工具(该工具及其源码可在文章末尾下载)来模拟这个过程,在文件选择框选择要保护的PE文件,把需要保护的函数及数据添加到左边栏中,执行保护时,在PE文件目录下会生成已保护的PE文件,点击运行时,就能正常运行。检测代码段 1.在游戏没有运行之前,修改、添加或删除PE文件的二进制信息可以起到修改程序流程的作用,从而起到外挂的作用。实现的技术有:在代码段的空白区域添加"洞穴代码",修改OEP的值,让程序跳转到洞穴代码;使用Inline HOOK执行外挂功能函数;修改代码段中的跳转指令和call后接地址,执行游戏内部汇编指令或者调动内部call等2. 在游戏运行时,通过外挂工具动态修改、添加或删除进程代码段数据或者动态注入shellcode同样也能起到修改程序流程的作用,那么需要校验PE文件和游戏内存数据就可以检测出游戏外挂。3. 在实际运用中,可以计算出PE文件的校验值,存放在游戏第三方程序的数据段中或者存放在游戏的服务器端,那么在游戏运行前校验PE文件值和运行时动态检验进程内存,接下来使用工具来模拟这个过程:1.选择PE文件计算PE文件校验值和记录代码段数据;2.选择需要校验的文件,同样也计算出校验值并比较是否变化;3.选择正在运行的进程,比较代码段数据是否变化。4. 实现的思路为:1.使用MD5算法计算出前后PE文件的校验值,并进行比较;2.先使用数组存放PE文件代码段数据,后读取进程内存中的代码段数据,然后比较数组数据是否相同5. 在游戏运行时,把游戏运行过程中使用过的函数及其相关的寄存器信息存放在服务端,在服务端检测函数的调用流程,就可以判断游戏内部call有没有非法调用。不过我这里模拟这个过程的方式是把函数运行时的信息写到日志文件中,查看日志信息来判断游戏内部call是否被非法调用。6. 实现的思路为:1.调式进程,循环接受调式事件;2.在刚开始调式时,把函数头部修改为CC;3.当发现中断时,判断发生中断的地址是否为函数头部地址,是的话,把线程上下文信息记录在日志文件中HOOK检测 1.现在,有各种各样的HOOK技术,包括 InLine HOOK、IAT HOOK、API HOOK等,其中大部分需要注入dll来实现HOOK功能,那么游戏运行时,服务端或者游戏第三方程序可以检测有无dll注入,有的话,及时清除掉。实现的思路为:1.先记录游戏运行过程中用的dll文件名;2.游戏运行时遍历进程使用的dll文件名,若遇到不名dll文件名,则进行释放;2.使用工具模拟这个过程:选择进程,选中dll文件所在目录,点击检测dll,就可检测出进程中是否有dll注入。3. 那么,除了检测dll文件外,还可以检测 IAT表和函数内部代码的跳转指令来判断游戏中是否有IAT HOOK或者InLine HOOK(跟API HOOK差不多,范围比API HOOK小,我这里就不介绍了),实现的过程为:1.选中游戏PE文件后,定位到导入表目录,遍历INT表中的_IMAGE_THUNK_DATA,通过里面的联合体u1,来获取游戏运行后IAT表中的函数地址;2.选中进程,读取进程内存中IAT表信息并比较函数地址,不同则说明有 IAT HOOK;3.对于InLine HOOK,读取进程代码段中函数区域的跳转指令操作数,若发现跳转到别的函数区域,则说明有InLine HOOK;4.使用工具模拟这个过程:选中进程和PE文件,再点击 IAT HOOK按钮或者InLine HOOK按钮就可进行检测。多开检测和动态调式工具检测 1.现在的打金工作室可以同时开多个号来刷金币,那么需要限制游戏多开,当动态调式进程时,在任务管理器中可以看到调式工具的主线程成了调式进程,那么调式器内存里面必然会有调式进程的内存信息,那么找到调式工具后再查找里面是否含有游戏进程的内存信息,若有则可以判断,游戏处于调式状态。2.对于防多开,经常会用到下面的代码,那么外挂制作者修改跳转指令或者NOP掉汇编代码就可以实现多开。为了防止这种情况,我这里把CreateMutex函数头部修改为CC,使用调式器的方式不断监控异常事件,当CreateMutex函数头部触发中断异常时,获取互斥体变量名(地址为:ESP+8),并判断该变量名是否出现过,若出现过,则检测出进程出现多开。实现的关键代码如下:检测多开的关键代码:3.对于多开检测,我还想出了三种检测方法:1.获取进程代码段信息,使用代码段信息匹配的方式来判断是否有相同的进程运行;2.获取进程所有的窗口句柄,匹配查找有无跟窗口标题相同的窗口,有则说明多开;3.对进程名进行匹配;4.对于调式工具检测,还是使用代码段识别法:获取OD工具中代码段信息匹配寻找相同进程,若有,则再识别内部有无游戏进程的内存信息并且再判断调式进程是否为调式工具的子进程,两者有一成立,则说明游戏进程处于调式状态,实现的关键代码如下:5.接下来,使用工具进行检测:多开检测只需选中进程点击“多开检测”按钮即可;调式工具检测要选中进程和调式工具,操作情况如下所示:添加反调式法 1.在游戏的PE文件中添加反调试,不为是一种较好的反外挂方法。在PE文件中修改TLS表信息,扩大最后一个节表并在空白区域添加PIMAGE_TLS_DIRECTORY结构信息、TLS回调函数,并在TLS回调函数中添加反调试功能即可实现反调试。2.实现反调试的思路为:1.把PE文件加载到内存中,使用偏移的方式定位到TLS数据目录,修改其中的 RVA字段值和Size字段值,让 RVA指向PIMAGE_TLS_DIRECTORY起始地址;2.定位到最后的节表结构并增加SizeOfRawData的值和修改Characteristics的值,使最后的节表具有可执行特性。3.最后把生成的PIMAGE_TLS_DIRECTORY结构数据和回调函数ShellCode复制到最后的节表中。3.除了往PE文件添加TLS反调式外,还可以添加SEH反调试,实现的思路为:1.先在代码段,寻找足够大的空闲区域,若没有找到,则新增最后节表大小;2.确定空闲区域开始地址,修改OEP的值,在空闲区域添加触发SEH异常的Shellcode,在该Shellcode中有异常处理函数,该异常处理函数会判断游戏是否处于调式中,如果没有处于调式状态则跳回OEP中,否则中止;4.接下来使用工具添加反调试,选中文件,点击按钮即可。以上使用的工具和源码均可下载,希望该工具及源码对大家有所帮助,工具存在bug的话,欢迎提出,大家共同探讨,共同提升!
对反游戏外挂技术的思考及实现 现如今,有很多游戏外挂软件,它们可以修改游戏显示的数据和内部代码,来达到谋取利益的目的。在实现反外挂技术前,我先介绍一下常见的三种外挂: 1.模拟类外挂:该外挂可以说是最早的外挂了,它是往游戏发送伪造的按键消息来模拟人的手工操作。实现的思路为:2. 内部Call调用外挂:使用逆向技术分析出游戏内部的汇编代码,把里面对游戏玩家有利的函数作为外挂的实现功能。实现的思路为:3. 脱机外挂:分析出游戏客户端和服务端之间的通信逻辑,使用自己发送和接受数据来跟服务端进行交互。实现的思路如下:保护call函数和基址数据 1.最近玩植物大战僵尸和连连看等游戏的时候发现,这些游戏需要通过启动程序才能正常运行,那么我突发奇想,如果在程序运行前,修改游戏中的部分代码段数据,等需要运行游戏时再通过另一个程序恢复代码段数据,那么就可以起到保护游戏的作用。2. 对于游戏外挂制作者,他们经常习惯性的使用OD工具和CE工具、ida工具等,找出游戏的基址数据(也为全局变量)和内部call,然后修改基址数据或者修改执行流程,调用内部call。那么在游戏运行前就对基址数据地址和某些call后接地址进行修改,等需要运行游戏时,再修改回基址地址和call调用的地址,就可以起到反外挂的作用。3. 接下来,介绍一下这样做的作用:4. 简单介绍一下实现的流程:1.读取PE文件信息到内存中,遍历PE文件中的代码段,找到函数头部地址和使用的全局变量地址;2.在代码段中,找出调用函数的call指令,把call后接地址进行修改,对于数据,找到使用全局变量的mov指令,修改地址操作数;3.运行时,使用CreateProcess函数创建线程并挂起,然后恢复代码段中的数据并运行进程5. 我开发了一款反游戏外挂工具(该工具及其源码可在文章末尾下载)来模拟这个过程,在文件选择框选择要保护的PE文件,把需要保护的函数及数据添加到左边栏中,执行保护时,在PE文件目录下会生成已保护的PE文件,点击运行时,就能正常运行。检测代码段 1.在游戏没有运行之前,修改、添加或删除PE文件的二进制信息可以起到修改程序流程的作用,从而起到外挂的作用。实现的技术有:在代码段的空白区域添加"洞穴代码",修改OEP的值,让程序跳转到洞穴代码;使用Inline HOOK执行外挂功能函数;修改代码段中的跳转指令和call后接地址,执行游戏内部汇编指令或者调动内部call等2. 在游戏运行时,通过外挂工具动态修改、添加或删除进程代码段数据或者动态注入shellcode同样也能起到修改程序流程的作用,那么需要校验PE文件和游戏内存数据就可以检测出游戏外挂。3. 在实际运用中,可以计算出PE文件的校验值,存放在游戏第三方程序的数据段中或者存放在游戏的服务器端,那么在游戏运行前校验PE文件值和运行时动态检验进程内存,接下来使用工具来模拟这个过程:1.选择PE文件计算PE文件校验值和记录代码段数据;2.选择需要校验的文件,同样也计算出校验值并比较是否变化;3.选择正在运行的进程,比较代码段数据是否变化。4. 实现的思路为:1.使用MD5算法计算出前后PE文件的校验值,并进行比较;2.先使用数组存放PE文件代码段数据,后读取进程内存中的代码段数据,然后比较数组数据是否相同5. 在游戏运行时,把游戏运行过程中使用过的函数及其相关的寄存器信息存放在服务端,在服务端检测函数的调用流程,就可以判断游戏内部call有没有非法调用。不过我这里模拟这个过程的方式是把函数运行时的信息写到日志文件中,查看日志信息来判断游戏内部call是否被非法调用。6. 实现的思路为:1.调式进程,循环接受调式事件;2.在刚开始调式时,把函数头部修改为CC;3.当发现中断时,判断发生中断的地址是否为函数头部地址,是的话,把线程上下文信息记录在日志文件中HOOK检测 1.现在,有各种各样的HOOK技术,包括 InLine HOOK、IAT HOOK、API HOOK等,其中大部分需要注入dll来实现HOOK功能,那么游戏运行时,服务端或者游戏第三方程序可以检测有无dll注入,有的话,及时清除掉。实现的思路为:1.先记录游戏运行过程中用的dll文件名;2.游戏运行时遍历进程使用的dll文件名,若遇到不名dll文件名,则进行释放;2.使用工具模拟这个过程:选择进程,选中dll文件所在目录,点击检测dll,就可检测出进程中是否有dll注入。3. 那么,除了检测dll文件外,还可以检测 IAT表和函数内部代码的跳转指令来判断游戏中是否有IAT HOOK或者InLine HOOK(跟API HOOK差不多,范围比API HOOK小,我这里就不介绍了),实现的过程为:1.选中游戏PE文件后,定位到导入表目录,遍历INT表中的_IMAGE_THUNK_DATA,通过里面的联合体u1,来获取游戏运行后IAT表中的函数地址;2.选中进程,读取进程内存中IAT表信息并比较函数地址,不同则说明有 IAT HOOK;3.对于InLine HOOK,读取进程代码段中函数区域的跳转指令操作数,若发现跳转到别的函数区域,则说明有InLine HOOK;4.使用工具模拟这个过程:选中进程和PE文件,再点击 IAT HOOK按钮或者InLine HOOK按钮就可进行检测。多开检测和动态调式工具检测 1.现在的打金工作室可以同时开多个号来刷金币,那么需要限制游戏多开,当动态调式进程时,在任务管理器中可以看到调式工具的主线程成了调式进程,那么调式器内存里面必然会有调式进程的内存信息,那么找到调式工具后再查找里面是否含有游戏进程的内存信息,若有则可以判断,游戏处于调式状态。2.对于防多开,经常会用到下面的代码,那么外挂制作者修改跳转指令或者NOP掉汇编代码就可以实现多开。为了防止这种情况,我这里把CreateMutex函数头部修改为CC,使用调式器的方式不断监控异常事件,当CreateMutex函数头部触发中断异常时,获取互斥体变量名(地址为:ESP+8),并判断该变量名是否出现过,若出现过,则检测出进程出现多开。实现的关键代码如下:检测多开的关键代码:3.对于多开检测,我还想出了三种检测方法:1.获取进程代码段信息,使用代码段信息匹配的方式来判断是否有相同的进程运行;2.获取进程所有的窗口句柄,匹配查找有无跟窗口标题相同的窗口,有则说明多开;3.对进程名进行匹配;4.对于调式工具检测,还是使用代码段识别法:获取OD工具中代码段信息匹配寻找相同进程,若有,则再识别内部有无游戏进程的内存信息并且再判断调式进程是否为调式工具的子进程,两者有一成立,则说明游戏进程处于调式状态,实现的关键代码如下:5.接下来,使用工具进行检测:多开检测只需选中进程点击“多开检测”按钮即可;调式工具检测要选中进程和调式工具,操作情况如下所示:添加反调式法 1.在游戏的PE文件中添加反调试,不为是一种较好的反外挂方法。在PE文件中修改TLS表信息,扩大最后一个节表并在空白区域添加PIMAGE_TLS_DIRECTORY结构信息、TLS回调函数,并在TLS回调函数中添加反调试功能即可实现反调试。2.实现反调试的思路为:1.把PE文件加载到内存中,使用偏移的方式定位到TLS数据目录,修改其中的 RVA字段值和Size字段值,让 RVA指向PIMAGE_TLS_DIRECTORY起始地址;2.定位到最后的节表结构并增加SizeOfRawData的值和修改Characteristics的值,使最后的节表具有可执行特性。3.最后把生成的PIMAGE_TLS_DIRECTORY结构数据和回调函数ShellCode复制到最后的节表中。3.除了往PE文件添加TLS反调式外,还可以添加SEH反调试,实现的思路为:1.先在代码段,寻找足够大的空闲区域,若没有找到,则新增最后节表大小;2.确定空闲区域开始地址,修改OEP的值,在空闲区域添加触发SEH异常的Shellcode,在该Shellcode中有异常处理函数,该异常处理函数会判断游戏是否处于调式中,如果没有处于调式状态则跳回OEP中,否则中止;4.接下来使用工具添加反调试,选中文件,点击按钮即可。以上使用的工具和源码均可下载,希望该工具及源码对大家有所帮助,工具存在bug的话,欢迎提出,大家共同探讨,共同提升!
python爬虫学习安卓逆向难不难? 想爬取移动端的数据
ARM详细介绍 计算机体系结构分类 两种典型的结构: 冯·诺依曼结构 哈佛体系结构 冯·诺依曼结构 冯·诺依曼机:将数据和指令都存储在存储器中的计算机。 计算系统由一个中央处理单元(CPU)和一个存储器组成。存储器拥有数据和指令,并且可以根据所给的地址对它进行读或写。因此程序指令和数据的宽度相同;如:Intel 8086、ARM7、MIPS处理器等 哈佛体系结构 哈佛机:为数据和程序提供了各自独立的存储器。 程序计数器只指向程序存储器而不指向数据存储器,这样做的后果是很难在哈佛机上编写出一个自修改的程序。 独立的程序存储器和数据存储器为数字信号处理提供了较高的性能。 指令和数据可以有不同的数据宽度;具有较高的效率;如摩托罗拉公司的MC68系列、Zilog公司的Z8系列、ARM10系列等 ARM 7使用冯·诺依曼体系结构。 ARM 9使用哈佛体系结构。 ARM公司简介 ARM是Advanced RISC Machines的缩写,它是一家微处理器行业的知名企业,该企业设计了大量高性能、廉价、耗能低的RISC (精简指令集)处理器。 1985年第一个ARM原型在英国剑桥诞生。 公司的特点是只设计芯片,而不生产。它提供ARM技术知识产权(IP)核,将技术授权给世界上许多著名的半导体、软件和OEM厂商,并提供服务。有ARM7/ARM9等多个版本。除了一些Unix图形工作站外,大多数ARM核心的处理器都使用在嵌入领域。 ARM,既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。 ARM处理器的应用 到目前为止,基于ARM技术的微处理器应用约占据了32位嵌入式微处理器75%以上的市场份额。 全球80%的GSM/3G手机、99%的CDMA手机以及绝大多数PDA产品均采用ARM体系的嵌入式处理器。 “掌上计算”相关的所有领域皆为其所主宰。 主要应用:消费类电子,无线、图像应用开放平台、存储、自动化、智能卡、SIM卡等。 ARM处理器的三大特点:耗电少功能强、16位/32位双指令集、众多合作伙伴。 各ARM体系结构版本 ARM体系结构从最初开发到现在有了很大的改进,并仍在完善和发展。 为了清楚地表达每个ARM应用实例所使用的指令集,ARM公司定义了6种主要的ARM指令集体系结构版本,以版本号V1~V6表示 ARM版本Ⅰ: V1版架构 该版架构只在原型机ARM1出现过,只有26位的寻址空间,没有用于商业产品。 其基本性能有: 基本的数据处理指令(无乘法); 基于字节、半字和字的Load/Store指令; 转移指令,包括子程序调用及链接指令; 供操作系统使用的软件中断指令SWI; 寻址空间:64MB(226)。 ARM版本Ⅱ: V2版架构 该版架构对V1版进行了扩展,例如ARM2和ARM3(V2a)架构。包含了对32位乘法指令和协处理器指令的支持。 版本2a是版本2的变种,ARM3芯片采用了版本2a,是第一片采用片上Cache的ARM处理器。同样为26位寻址空间,现在已经废弃不再使用。 V2版架构与版本V1相比,增加了以下功能: 乘法和乘加指令; 支持协处理器操作指令; 快速中断模式; SWP/SWPB的最基本存储器与寄存器交换指令; 寻址空间:64MB。 ARM版本Ⅲ: V3版架构 ARM作为独立的公司,在1990年设计的第一个微处理器采用的是版本3的ARM6。它作为IP核、独立的处理器、具有片上高速缓存、MMU和写缓冲的集成CPU。 变种版本有3G和3M。版本3G是不与版本2a向前兼容的版本3,版本3M引入了有符号和无符号数乘法和乘加指令,这些指令产生全部64位结果。 V3版架构(目前已废弃)对ARM体系结构作了较大的改动: 寻址空间增至32位(4GB); 当前程序状态信息从原来的R15寄存器移到当前程序状态寄存器CPSR中(Current Program Status Register); 增加了程序状态保存寄存器SPSR(Saved Program Status Register); 增加了两种异常模式,使操作系统代码可方便地使用数据访问中止异常、指令预取中止异常和未定义指令异常。; 增加了MRS/MSR指令,以访问新增的CPSR/SPSR寄存器; 增加了从异常处理返回的指令功能。 ARM版本Ⅳ: V4版架构 V4版架构在V3版上作了进一步扩充,V4版架构是目前应用最广的ARM体系结构,ARM7、ARM8、ARM9和StrongARM都采用该架构。 V4不再强制要求与26位地址空间兼容,而且还明确了哪些指令会引起未定义指令异常。 指令集中增加了以下功能: 符号化和非符号化半字及符号化字节的存/取指令; 增加了T变种,处理器可工作在Thumb状态,增加了16位Thumb指令集; 完善了软件中断SWI指令的功能; 处理器系统模式引进特权方式时使用用户寄存器操作; 把一些未使用的指令空间捕获为未定义指令 ARM版本Ⅴ: V5版架构 V5版架构是在V4版基础上增加了一些新的指令,ARM10和Xscale都采用该版架构。 这些新增命令有: 带有链接和交换的转移BLX指令; 计数前导零CLZ指令; BRK中断指令; 增加了数字信号处理指令(V5TE版);为协处理器增加更多可选择的指令; 改进了ARM/Thumb状态之间的切换效率; E---增强型DSP指令集,包括全部算法操作和16位乘法操作; J----支持新的JAVA,提供字节代码执行的硬件和优化软件加速功能。 ARM版本Ⅵ: V6版架构 V6版架构是2001年发布的,首先在2002年春季发布的ARM11处理器中使用。在降低耗电量地同时,还强化了图形处理性能。通过追加有效进行多媒体处理的SIMD(Single Instruction, Multiple Data,单指令多数据 )功能,将语音及图像的处理功能提高到了原型机的4倍。 此架构在V5版基础上增加了以下功能: THUMBTM:35%代码压缩; DSP扩充:高性能定点DSP功能; JazelleTM:Java性能优化,可提高8倍; Media扩充:音/视频性能优化,可提高4倍 ARM处理器系列 ARM公司开发了很多系列的ARM处理器核,目前最新的系列已经是ARM11。 ARM7、ARM9、ARM9E和ARM10为4个通用处理器系列。 每一个系列提供一套相对独特的性能来满足不同应用领域的需求。 ARM7系列 ARM9系列 ARM9E系列 ARM10E系列 ARM11系列 SecurCore系列 Intel的Xscale Intel的StrongARM ARM7微处理器系列 低功耗的32位RISC处理器,冯·诺依曼结构。极低的功耗,适合便携式产品。 具有嵌入式ICE-RT逻辑,调试开发方便。 3级流水线结构。能够提供0.9MIPS的三级流水线结构 代码密度高,兼容16位的Thumb指令集。 对操作系统的支持广泛,包括Windows CE、Linux、Palm OS等。 指令系统与ARM9系列、ARM9E系列和ARM10E系列兼容,便于用户的产品升级换代。 主频最高可达130MIPS。 主要应用领域:工业控制、Internet设备、网络和调制解调器设备、移动电话等多种多媒体和嵌入式应用。 ARM7TDMI微处理器 4种类型: ARM7TDMI、ARM7TDMI-S、ARM720T、ARM7EJ。 ARM7TMDI是目前使用最广泛的32位嵌入式RISC处理器,属低端ARM处理器核。 注:“ARM核”并不是芯片,ARM核与其它部件如RAM、ROM、片内外设组合在一起才能构成现实的芯片。 ARM7TDMI内部结构 组成:处理器核、用于边界扫描的TAP控制器、在线仿真器ICE。 双向数据总线D[31:0]被分割成单向输入和输出总线,以便于与外部存储器兼容。 ARM7TDMI的模块和内核框图 ARM7TDMI功能信号图 ARM9微处理器系列 ARM9系列微处理器在高性能和低功耗特性方面提供最佳的性能。 5级整数流水线, 哈佛体系结构。 支持32位ARM指令集和16位Thumb指令集。 全性能的MMU,支持Windows CE、Linux、Palm OS等多种主流嵌入式操作系统。 支持数据Cache和指令Cache,具有更高的指令和数据处理能力。 主要应用:无线设备、仪器仪表、安全系统、机顶盒、高端打印机、数码照相机和数码摄像机。 3种类型:ARM920T、ARM922T和ARM940T。 ARM9E微处理器系列 单一处理器内核提供微控制器、DSP、Java应用系统的解决方案。 支持DSP指令集。 5级整数流水线,指令执行效率更高。 支持32位ARM指令集和16位Thumb指令集。 支持VFP9浮点处理协处理器。 全性能的MMU,支持Windows CE、Linux、Palm OS等多种主流嵌入式操作系统。 MPU支持实时操作系统。 支持数据Cache和指令Cache, 主频最高可达300MIPS。 主要应用:下一代无线设备、数字消费品、成像设备、工业控制、存储设备和网络设备等领域。 3种类型:ARM926EJ-S、ARM946E-S和ARM966E-S。 ARM10E微处理器系列 与同等的ARM9比较,在同样的时钟频率下,性能提高了近50%,功耗极低。 支持DSP指令集。 6级整数流水线,指令执行效率更高。 支持32位ARM指令集和16位Thumb指令集。 支持VFP10浮点处理协处理器。 全性能的MMU,支持Windows CE、Linux、Palm OS等多种主流嵌入式操作系统。 支持数据Cache和指令Cache。 主频最高可达400MIPS。 内嵌并行读/写操作部件。 主要应用:下一代无线设备、数字消费品、成像设备、工业控制、通信和信息系统等领域。 3种类型:ARM1020E、ARM1022E和ARM1026EJ-S。 SecurCore微处理器系列 专为安全需要而设计,提供了完善的32位RISC技术的安全解决方案。 灵活的保护单元,以确保操作系统和应用数据的安全。 采用软内核技术,防止外部对其进行扫描探测。 可集成用户自己的安全特性和其他协处理器。 主要应用:对安全性要求较高的应用产品及应用系统,如电子商务、电子政务、电子银行业务、网络和认证系统等领域。 4种类型:SecurCore SC100、SecurCore SC110、SecurCoreSC200和SecurCore SC210。 Xscale处理器 基于ARMv5TE体系结构的解决方案,是一款全性能、高性价比、低功耗的处理器。 支持16位的Thumb指令和DSP指令集。 已使用在数字移动电话、个人数字助理和网络产品等场合。 Xscale处理器是Intel目前主要推广的一款ARM微处理器 ARM系列流水线比较 ARM系列性能比较 ARM处理器结构 ARM和Thumb状态 RISC技术 流水线技术 超标量技术 ARM和Thumb状态 V4版以后有: (1)32位ARM指令集 (2)16位Thumb指令集,功能是ARM指令集的功能子集。 ARM7TDMI核以后,T变种的ARM微处理器有两种工作状态: (1)ARM状态 (2)Thumb状态。 当ARM微处理器执行32位的ARM指令集时,工作在ARM状态; 当ARM微处理器执行16位的Thumb指令集时,工作在Thumb状态 Thumb技术介绍 ARM7体系结构被广泛应用的时候,嵌入式控制器的市场仍然由8位、16位处理器占领。这些产品不能满足高端应用。这些应用需要32位RISC处理器的性能和更优于16位CISC处理器的代码密度。 为了解决代码密度的问题,ARM增加了T变种。 Thumb从32位ARM指令集中抽出来的36条指令格式,可重新编成16位的操作码。 在运行时,16位的Thumb指令又由处理器解压成32位指令。 Thumb核有2套独立的指令集,它使设计者得到ARM32位指令性能的同时,又能享有Thumb指令集产生的代码方面的优势,在性能和代码大小之间取得平衡。 和ARM指令集相比,Thumb指令集具有以下的局限: 完成相同的操作,Thumb指令通常需要更多的指令,因此在对系统运行时间要求苛刻的场合,ARM指令集更为合适。 Thumb指令集没有包含进行异常处理时需要的一些指令,因此在异常中断时,还是需要使用ARM指令,这种限制决定了Thumb指令需要与ARM指令配合使用。 ARM与Thumb状态转换 在程序的执行过程中,微处理器可以随时在两种工作状态之间切换,并且该转变不影响处理器的工作模式和相应寄存器中的内容。 进入Thumb状态:当操作数寄存器的状态位(位[0])为1时,执行BX指令。 进入ARM状态:当操作数寄存器的状态位(位[0])为0时,执行BX指令。 RISC技术 嵌入式微处理器可以分为两类:CISC和RISC; CISC(Complex Instruction Set Computer):复杂指令系统计算机;随着计算机技术的发展而不断引入新的复杂的指令集,计算机的体系结构会越来越复杂。 大约有20%的指令会被反复使用,占整个程序代码的80%,而余下的80%的指令却不经常使用,在程序设计中只占20%。 RISC(Reduced Instruction Set Computer):精简指令系统计算机;-采用固定长度的指令格式 -使用单周期指令 -大量使用寄存器 -可用加载/存储指令批量传输数据 -在循环处理中使用地址的自动增减 RISC技术与CISC技术比较 RISC技术 ARM处理器采用加载/存储(Load/Store)体系结构是典型的RISC处理器,即只有Load/Store的存/取指令可以访问存储器,其余指令都不允许进行存储器操作。 RISC体系结构基本特点: (1)大多数指令只需要执行简单和基本的功能,其执行过程在一个机器周期内完成。 (2)只保留加载/存储指令。操作数由加载/存储指令从存储器取出放寄存器内操作。 (3)芯片逻辑不采用或少采用微码技术,而采用硬布线逻辑。 (4)减少指令数和寻址方式。 (5)指令格式固定,指令译码简化。 (6)优化编译。 RISC技术 ARM体系结构还采用了一些特别的技术: 所有的指令都可根据前面的执行结果决定是否被执行,提高了指令的执行效率。 可用Load/Store指令批量传输数据,以提高数据的传输效率。 可在一条数据处理指令中同时完成逻辑处理和移位处理。 RISC和CISC各有优势,界限并不那么明显。 现代的CPU往往采用CISC的外围,内部加入了RISC的特性,如超常指令集CPU就是融合了RISC和CISC的优势,成为未来的CPU发展方向之一。 流水线技术 是一种将每条指令分解为多步,并让各步操作重叠,从而实现几条指令并行处理的技术; 程序中的指令仍是一条条顺序执行,但可以预先取若干条指令,并在当前指令尚未执行完时,提前启动后续指令的另一些操作步骤,从而可加快程序的运行速度; 开发和设计嵌入式系统的过程中,CPU的性能是一个非常重要的考虑因素。 流水线技术是在本质上影响程序执行速度的因素。 由于计算机中一条指令的各个执行阶段相对独立,因此,现代CPU大多设计成流水线型的机器,在这种类型机器中几个指令可以并行执行。采用流水线的重叠技术大大提高了CPU的运行效率。 当流水线内部的信息通畅流动时,CPU流水线能够工作得最好。 但实际应用中,指令各执行阶段的操作时间长短不同,有一些指令序列可能会打断流水线内的信息流,所以有时流水线操作不十分通畅,会暂时降低CPU的执行速度。 单周期指令的执行过程 ARM的3级流水线 ARM7架构采用了一个3段的流水线: (1)取指:将指令从内存中取出来。 (2)译码:操作码和操作数被译码以决定执行什么功能。为下一周期准备数据路径需要的控制信号。这一级指令”占有“译码逻辑,而不是”占有”数据路径 (3)执行:执行已译码的指令。指令占有数据路径,寄存器堆栈被读取,操作数在桶行移位器中被移位。ALU产生运算结果并回写到目的寄存器中,ALU结果根据指令需求更改状态寄存器的条件位。 流水线模式下PC的更改过程 多周期ARM指令的3级流水线操作 数据路径涉及到所有执行周期、地址计算和数据传送。译码逻辑总是产生数据路径在下一个周期使用的控制信号,因此除译码周期以外,在STR地址计算周期也产生数据传送所需的控制信号。 取指的存储器访问和执行的数据路径占用都是不可同时共享的资源,对于多周期指令来说,如果指令复杂以至于不能在单个时钟周期内完成执行阶段,就会产生流水线阻塞。 ARM的5级流水线 ARM9和StrongARM架构都采用了5级流水线. 增加了I-Cache和D-Cache,把存储器的取指与数据存取分开; 增加了数据写回的专门通路和寄存器; 把指令的执行过程分割为5部分: 取指:将指令从指令存储器中取出,放入指令流水线中。 指令译码:对指令进行译码,从寄存器堆中读取寄存器操作数。 执行:把一个操作数移位,产生ALU结果。如果指令是Load或Store,在ALU中计算存储器的地址。 数据缓存:如果需要,访问数据存储器;否则,ALU的结果只是简单地缓冲一个时钟周期,以便使所有指令具有同样地流水线流程。 写回:将指令产生地结果写回到寄存器堆。 流水线对比 存储系统机制 存储器就是用来存储信息的部件,存储器是嵌入式系统硬件中的重要组成部分。 设计嵌入式系统的存储器时需要考虑:是否需要扩展; 整个嵌入式系统的存储器是由片内和片外两部分组成。 为了解决速度和内存容量的问题,在系统中采用虚拟地址空间和高速缓存来提高内存的平均性能。 存储管理单元(MMU)进行地址转换,它在一个小的物理内存中提供相对较大的虚拟存储空间。 存储器部件的分类 按在系统中的地位分类: (1)主存储器(Main Memory, 简称内存或主存) (2)辅助存储器(Auxiliary Memory,Secondary Memory,简称辅存或外存) 按存储介质分类: (1)磁存储器(Magnetic Memory), (2)半导体集成电路存储器(通常称为半导体存储器), (3)光存储器(Optical Memory), (4)激光光盘存储器(Laser Optical Disk) 按信息存取方式分类: (1)随机存取存储器RAM (2)只读存储器ROM 存储器的组织和结构 嵌入式存储器一般采用存储密度较大的存储器芯片,典型的嵌入式存储器系统由ROM、RAM、EPROM等组成。 常用的存储器 随机存储器(RAM) (1)静态随机存储器(SRAM) (2)动态随机存储器(DRAM) 只读存储器(ROM),它在嵌入式系统中非常有用,因为许多代码或数据不随时间改变。 (1)工厂编程的只读存储器 (2)现场可编程只读存储器 存储体系的形式 存储层次结构的组成原则: ①每位价格从上往下依次减少。 ②存储容量从上往下依次增加。 ③存取速度从上往下依次减慢。 ④ CPU的访问频度从上往下依次减少。 总线协议 总线是CPU与存储器和设备通信的机制。 总线的一个主要作用是提供到存储器的接口。 大部分总线协议的基本构件是四周期握手协议。 总线读写 总线的基本操作是读和写。 Clock 提供总线组件各部分同步。 当总线读时,R/W’为1。当总线写时,R/W’为0。 Address是一个a位信号束,为访问提供地址。 Data是一个n位信号束,它可从CPU得到数据或向CPU传送数据。 Data ready’当数据束上值合法时发信号。 总线的时序图 总线行为以时序图说明。 时序图表示总线上的信号如何随时间变化。 直接内存访问(DMA) 多数情况下,数据的传输需要CPU的介入。 但是,有时候某些数据传输类型无须CPU加入。 直接存储器访问(DMA)是允许读写不由CPU控制的总线操作 系统总线配置 一个微处理器系统可能含有多条总线。高速设备可连到高速总线上,低速设备连到别的总线上。 桥:使总线可以互连的逻辑电路。 高速总线通常要更昂贵的电路和连接器,可通过使用较慢、较便宜的总线来降低低速设备成本。 桥允许总线独立操作,在I/O操作中可提供某些并行性。 桥不仅是高速总线的受控器,而且是低速总线的主控器。 桥从高速总线上获取指令而将它们传到低速总线,它还将结果从低速总线传到高速总线上。 桥还可以作为两桥之间的协议翻译器。 ARM存储数据类型 六种数据类型: (1) 8位有符号和无符号字节。 (2)16位有符号和无符号半字。 (3)32位有符号和无符号字。 ARM指令都是32位的字,必须以字(4字节)为单位边界对齐。 Thumb指令是16位半字,必须以2字节位单位边界对齐。 在内部,所有ARM操作都是面向32位的操作数;只有数据传送指令支持较短的字节和半字的数据类型。当从存储器调入一个字节和半字时,根据指令对数据的操作类型,将其无符号0或有符号“符号位”扩展为32位,进而作为32位数据在内部进行处理。 ARM体系结构所支持的最大寻址空间为4GB(232字节) ARM体系结构将存储器看作是从零地址开始的字节的线性组合。从零字节到三字节放置第一个存储的字数据,从第四个字节到第七个字节放置第二个存储的字数据,依次排列。 ARM体系结构可以用两种方法存储字数据,称之为大端格式和小端格式 ARM存储格式 数据存储格式有两种: (1)大端模式:较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址。 (2)小端模式:较高的有效字节存放在较高的存储器地址,较低的有效字节存放在较低的存储器地址。 ARM存储周期 4种基本类型: 空闲周期。 非顺序周期。 顺序周期。 协处理器寄存器传送周期。 ARM总线接口信号分类 ARM7TDMI的总线接口信号分成4类: 时钟和时钟控制信号:MCLK、ECLK、nRESET、nWAIT。 地址类信号:A[31:0]、nRW、MAS[1:0]、nOPC、nTRANS、LOCK、TBIT。 存储器请求信号:nMREQ、SEQ。 数据时序信号:D[31:0]、DIN[31:0]、DOUT[31:0]、ABORT、BL[3:0]。 ARM总线接口可以实现的总线周期 总线周期使用nMREQ和SEQ信号编码。 4种不同类型的总线周期。 N周期:非顺序周期,最简单的总线周期;存储控制器必须启动存储器访问来满足这个请求;该方式存储系统常需要长的访问时间。 S周期:顺序周期,实现总线上的突发传送;第一个周期,地址可与前一个内部周期相同;与非顺序访问相比响应更快,访问时间更短。 I周期:内部周期,不要求存储器访问;可广播下一次访问的地址以便开始译码,但存储控制器不允许进行存储器访问。 C周期:协处理器寄存器传递周期,通过数据总线向或从协处理器传送数据;不需存储周期,存储控制器不启动事务;传送期间,存储系统不允许驱动数据总线。 高速缓存(Cache)的分类 1)统一Cache和独立的数据/程序Cache 统一Cache:一个存储系统中指令预取时使用的Cache和数据读写时使用的Cache是同一个Cache。 独立的Cache:一个存储系统中指令预取时使用的Cache和数据读写时使用的Cache是各自独立的。 用于指令预取的Cache称为指令Cache。 用于数据读写的Cache称为数据Cache。 使用独立的数据Cache和指令Cache,可以在同一个时钟周期中读取指令和数据,而不需要双端口的Cache。但此时要注意保证指令和数据的一致性。 (2)写通Cache和写回Cache 当CPU更新了Cache的内容时,要将结果写回到主存中。 写通法: write-throught,指CPU在执行写操作时,必须把数据同时写入Cache和主存。 写回法: write-back,指CPU在执行写操作时,被写的数据只写入Cache,不写入主存。仅当需要替换时,才把已经修改的Cache块写回到主存中。 (3)读操作分配Cache和写操作分配Cache 当进行数据写操作时,可能Cache未命中,这时根据Cache执行的操作不同。 读操作分配Cache:当进行数据写操作时,如果Cache未命中,只是简单地将数据写入主存中。主要在数据读取时,才进行Cache内容预取。 写操作分配Cache:当进行数据写操作时,如果Cache未命中,Cache系统将会进行Cache内容预取,从主存中将相应的块读取到Cache中相应的位置,并执行写操作,把数据写入到Cache中。 对于写通类型的Cache,数据将会同时被写入到主存中,对于写回类型的Cache数据将在合适的时候写回到主存中。 Cache的工作原理 在Cache存储系统当中,把主存储器和Cache都划分成相同大小的块。 主存地址可以由块号M和块内地址N两部分组成。 同样,Cache的地址也由块号m和块内地址n组成。 Cache地址映像和变换方式 1)直接映像 快,造价低。 但由于映射策略简单,所以有一定的局限性。 如果访问频繁的块正好被映射到同一个块,就不能充分利用高速缓存的好处。 (2)组相联映像 组相联映像由组的个数来标识,每个组被实现为一个直接映射高速缓存。 高速缓存请求同时广播到所有的组。如果某组中有这个单元,该高速缓存便报告命中。 比直接映射慢,命中率较高。 (3)全相联映像 主存中任意一个块都可以映射到Cache中的任意一个块的位置上。 不同的ARM有不同大小的高速缓存和组织结构。 Cache的替换算法 (1)轮转法 维护一个逻辑计数器,利用该计数器依次选择将要被替换出去的Cache块。 这种算法容易预测最坏情况下Cache的性能。 缺点:在程序发生很小的变化时,可能造成Cache平均性能急剧的变化。 (2)随机替换算法 通过一个伪随机数发生器产生一个伪随机数,用新块将编号为该伪随机数的Cache块替换掉。 算法简单,易于实现。 没有考虑程序的局部性特点,也没有利用以前块地址分布情况,因而效果较差。 不易预测最坏情况下Cache的性能。 存储管理单元MMU 存储管理单元在CPU和物理内存之间进行地址转换。 由于是将地址从逻辑空间映射到物理空间,因此这个转换过程一般称为内存映射。 在ARM系统中,存储管理单元MMU主要工作: (1)虚拟存储空间到物理存储空间的映射。在ARM中采用了页式虚拟存储管理。 (2)存储器访问权限的控制。 (3)设置虚拟存储空间的缓冲的特性 MMU的页表 页表是实现上述功能的一个重要手段,它实际上是位于内存中的一个对照表。 为了实现不同层次的管理,系统提供了基于段或页的存储器访问方式 1. 段(section):由1MB 的存储器块构成 2. 大页(large page):由64KB 的存储器块构成 3. 小页(small page):由4KB 的存储器块构成 4. 极小页(tiny page):由1KB 的存储器块构成 MMU的页表续 地址变换条目:页表的每一行对应与虚拟地址空间的一个页,该行同时包含了该虚拟内存页对应的物理内存页的地址、该页的访问权限以及缓冲特性等。我们将页表中的一行称为地址变换条目。 页表:存放在内存中,系统通常有一个寄存器来保存页表的基地址。ARM系统中使用的就是CP15的寄存器C2。 快表:从虚拟地址到物理地址的转换实际上就是查询页表的过程。由于程序在执行过程中具有局部性,即在一段时间内只是局限在少数几个单元,为了加快页表的查询速度,在系统中通常使用一个容量更小、速度更快的存储器件来保存当前需要访问的地址变换条目,这个容量小的页表又称作快表(TLB)。 快表的使用 更新:当CPU需要访问内存时,首先在TLB中查找需要的地址变换条目。若不存在则在内存页表中查询,并把查询的结果添加到TLB中。 清除:当内存中页表的内容改变或者使用新的页表时,TLB中的内容需要清空。CP15的寄存器8用于完成该功能。 锁定:可以将一个地址变换条目锁定在TLB中,以加快访问速度,CP15的寄存器10用于完成该功能。 MMU的存储访问过程 使能MMU时存储访问过程。 C控制位:Cachable,B控制位:Bufferable 禁止MMU时存储访问过程。 先要确定芯片是否支持cache和write buffer。 如果芯片规定当禁止MMU时禁止cache和write buffer,则存储访问将不考虑C和B控制位。 如果芯片规定当禁止MMU时可以使能cache和write buffer,则数据访问时,C=0,B=0;指令读取时,如果使用分开的TLB,那么C=1,如果使用统一的TLB,那么C=0。 存储访问不进行权限控制,MMU也不会产生存储访问中止信号。 所有的物理地址和虚拟地址相等,即使用平板存储模式。 MMU中的地址变换过程 通过两级页表实现。 一级页表:包含以段为单位的地址变换条目,以及指向二级页表的指针。 一级页表实现的地址映射粒度较大。 以段为单位的地址变换过程只需要一级页表。 二级页表:包含以大页和小页为单位的地址变换条目。 以页为单位的地址变换过程需要二级页表。 ARM支持的存储块大小有4种: (1)段(Section):大小为1MB的存储块。 (2)大页(Large Pages):大小为64KB的存储块。 (3)小页(Small Pages):大小为4KB的存储块。 (4)极小页(Tiny Pages):大小为1KB的存储块。 一级页表地址变换过程 CP15的寄存器C2中存放的是内存中页表的基地址。 形成一个32位的索引值,使用该32位索引值从页表中找出相应的地址变换条目。该条目或者包含一个一级描述符,或者包含一个指向二级页表的指针。 一级描述符 一级描述符:从页表中得到的相应地址变换条目。 它定义了与之相应的1M存储空间是如何映射的。 一级描述符类型: 4种格式的一级描述符,由位[1:0]定义。 粗粒度页表描述符 粗粒度页表描述符:一级描述符的位[1:0]为0b01(0b代表二进制),包含了粗粒度的二级页表的物理地址。 粗粒度页表描述符获取二级描述符过程 段描述符 段描述符:一级描述符的位[1:0]为0b10。 段的地址变换过程 细粒度页表描述符 细粒度页表描述符:一级描述符的位[1:0]为0b11,包含了细粒度的二级页表的物理地址。 细粒度页表描述符获取二级描述符过程 MMU中的存储访问权限控制 在MMU中,寄存器C1的R、S控制位和页表中地址转换条目中的访问权限控制位(A、P)联合作用控制存储访问的权限。 MMU存储访问权限控制的具体规则如下: MMU中的域(Domain) 域:一些段、大页或者小页的集合。 ARM支持最多16个域。 每个域的访问控制特性由CP15中的寄存器C3中的两位控制。 因此能很容易地将某个域的地址空间包含在虚拟存储空间中,或是排除在虚拟存储空间之外。 CP15中寄存器C3中的每两位控制一个域的访问控制特性,字段编码和含义如下: 快速上下文切换技术 快速上下文切换技术FCSE(Fast Context Switch Extension):通过修改系统中不同进程的虚拟地址,避免在进行进程间切换时造成的虚拟地址到物理地址的重映射。 如果两个进程占用的虚拟地址空间有重叠,则系统在这两个进程之间进行切换时,必须进行虚拟地址到物理地址的重映射,包括重建TLB、清除Cache,整个工作需要巨大的系统开销,而快速上下文切换技术的引入避免了这种开销。 FCSE位于CPU和MMU之间,其功能就是将不同进程使用的相同虚拟地址映射为不同的虚拟空间,使得在上下文切换时无须重建TLB等。 存储器映射的输入/输出 在ARM系统中,I/O操作通常被映射成存储器操作,即输入/输出是通过存储器映射的可寻址外围寄存器和中断输入的组合来实现的。 在ARM中,I/O的输出操作可通过存储器写入操作实现;I/O的输入操作可通过存储器读取操作实现。这样I/O空间就被映射成存储空间。 但是,对于存储器映射的I/O空间的操作,不能使用Cache技术。
ARM指令集 ARM指令集是指计算机ARM操作指令系统。在ARM中有两种方式可以实现程序的跳转:一种是跳转指令;另一种是直接向PC寄存器中写入目标地址值。ARM指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产生指令六大类。 介绍几种常见的指令以及它们的作用。 一:跳转指令 跳转指令有以下四种: 1. B:无条件跳转。 例如: B 0x1234,跳转到绝对地址0x1234的位置执行相应代码。 2. BL:带链接的跳转指令。 该指令将下一条指令的地址拷贝到R14寄存器也就是LR寄存器中 ,然后跳转到指定的地址。 例如:BL loc_234,跳转到目标loc_234地址去,这条指令一般用于子程序之间的调用. 3. BX:带状态切换的无条件跳转。 BX 是用来切换处理器的状态。 例如:BX R0,跳转到R0寄存器指定的地址,并且根据R0最低位来切换处理器状态。 4. BLX:带链接和状态切换的无条件跳转。 二:比较指令 指令使用寄存器Rn的值减去operand2的值,根据操作的结果更新cpsr寄存器相关的条件标志位,方便后面的指令根据相应的条件来判断是否执行。 一般常用指令如下: eq:相等/z=1 ne:不相等/标志z=0 hi:无符号数大于/c=1,z=0 cs/hs:无符号数大于或等于/c=1 cc/lo:无符号数小于/c=0 ls:无符号数小于或等于/c=0,z=1 gt:有符号数大于/z=0,n=v ge:有符号数大于或等于/n=v lt:有符号数小于/n!=v le:有符号数小于或等于/z=1,n!=v mi:负数/n=1 pl:整数或0/n=0 vs:溢出/v=1 vc:没有溢出 三:存储器与寄存器数据交互指令 数据交换指令是实现两个操作数据之间的位置互换的指令,这两个操作数可以是两个寄存器操作数,或一个寄存器操作数与一个存储器操作数,或两个存储器操作数,在多处理机中,也可以是一个寄存器操作数和一个共享存储器操作数。寄存器中存放的数据,可以是字符串,可以是数,也可以是一个地址,它可以存放各种类型的数据。 存储地址单元:地址(如0x00004000)与地址中存在的值。 LDR:从存储器中加载数据到寄存器 ← Load LDR R8,[R9,#4] R8为待加载数据的寄存器,加载值为R9+0x4所指向的存储单元。 STR:将寄存器的数据存储到存储器 → Store STR R8,[R9,#4] 将R8寄存器的数据存储到R9+0x4指向的存储单元。 LDM:将存储器的数据加载到一个寄存器列表 → LDM R0,{R1-R3}将R0指向的存储单元的数据依次加载到R1,R2,R3寄存器。 STM:将一个寄存器列表的数据存储到指定的存储器 ← PUSH:将寄存器值推入堆栈。 POP:将堆栈值推出到寄存器。 SWP:将寄存器与存储器之间的数据进行交换。 SWP R1, R1 [R0] 将R1寄存器与R0指向的存储单元的内容进行交换。 堆,队列,数据结构。栈是竖的,后进先出,且只能从栈顶依次填入数据。 四:数据指令 数据的三种指令分别为传送指令,数据算数运算指令以及数据逻辑运算指令。 1. 传送指令 MOV:将立即数或寄存器的数据传送到目标寄存器 ← MOV R0, #8 R0=8 2. 数据算术运算指令 ADD,SUB,MUL,DIV ← 有符号、无符号运算,带进位运算。 3. 数据逻辑运算指令 与:AND 或:ORR 异或:EOR 移位:实质是乘、除,类似于小数点移位,但相反,小数点左移,数变小,右移变大。但逻辑移位,左移变大,右移变小,且按2的倍数进行,因为是2进制。LSL:逻辑左移← LSR:逻辑右移← LSL R0,R1,#2 R0=R1*4 4. 其他指令 协处理器指令:SWT(切换用户模式) 伪指令:DCB 总结 知道了ARM的优点为,执行快,可嵌入式开发,数据的三种指令有:传送指令,数据逻辑运算指令和数据算术运算指令,最后还了解了Android是基于Linux内核驱动。
零基础怎么学Android逆向 其实也不安全是零基础,会一点点Java 也算是有那么一点基础吧 求一套学习方案
Android 已发行多年,移动 App 已经趋近饱和逆向的时代来了 Android 已发行多年,移动 App 已经趋近饱和,那么市场上的软件全都安全嘛,现在安卓逆向是不是很吃香啊,去破解app一攻一防
学JAVA到什么程度可以转安卓? 个人觉得把Java SE的内容学完就行了
Android未来长期方向如何呢? 安卓会不会像诺基亚一样突然死掉呢
android未来几年的发展前景?从事android应用开发的职业规划? 怎样看待android未来几年的发展前景?从事android应用开发的职业规划应该是怎样的? 在之前安卓开发很缺人才,于是培训结构开始大量培训安卓开发的人,一群人一窝蜂的佣进安卓开发市场,可是市场在缺人才,也禁不住你大力的往市场里面塞人啊,那可想而是市场总一天会满,不再需要那么多的人,一但人好找了,那你就不太值钱,因为可代替的人多了去了,市场的薪资就会下调,这个谁能接受啊,工作这么久了,工资没有上调反而下跌,那按照我这个暴脾气肯定撒手不干了啊 可是问题来了,那你不做安卓你还会什么呢? 跳槽去学习另一门技术?可是你要想好了,一但你抛下现在的知识,去学习其他的技术,那你就又要从新开始,又得一步步的慢慢来,这个过程是很漫长的,你确定你做好准备了吗? 其实我们还有一条路可以走,那就是选择一个不抛弃现在技能还能提升自己的技术,那好好想想什么技术是有安卓开发的基础,还能去学习增加的技术呢??? 无疑就是“安卓逆向”了 安卓逆向是在安卓正向开发的基础上进而去衍生的一门技术,你既会正向开发,也会逆向破解,去发现漏洞,做到一攻一防,这无疑是为你的破房子添砖加瓦,天大的喜事啊。 有的人就会在想,,安卓逆向是什么啊,能做什么啊,为什么要选择安卓逆向啊??? 下面就来好好解释一下,“安卓逆向” 软件逆向分为两种 pc软件逆向 安卓软件逆向 pc逆向发展有十几年了 安卓逆向近几年才发展起来 前途肯定是有前途的,具体的看你怎么去学习, 个人建议发展安卓逆向,为什么呢? 因为pc逆向发展十几年了,你想要短时间完全学会,完全是不太可能的,而且pc逆向比安卓逆向要难很多,安卓逆向需要学习二三十种工具,那pc逆向就要学习四五十种工具,如果你有时间慢慢去学习,有这个时间精力,那就另当别论了 安卓逆向呢,是近几年才开始发展,发展空间还是很大,现在市场占比比较小,会慢慢发展起来的,完全不用担心发展不起来, 在这个手机不离身的时代,app是绝对火爆的,安卓逆向作为移动端的安全,是会随着手机的发展越来越好的。 而且无论是国家还是公司以及个人都很注重安全,在这个互联网时代,网络安全是非常重要的。 像我们平时玩手机的时候,随便下载一个app就会进行授权,你都不知道这个app存不存危险,那很有可能你的信息就被盗取了 所以公司为了自己公司的利益,就会分析软件逆向app看看有咩有bug,那就会需要这方面的人才。
安卓逆向第一步--环境配置 一般在学习逆向的时候,上的第一堂课无疑就是环境配置了, 那么需要用到那些工具呢? 环境配置是在Java层的 主要讲的就是工具安装及环境配置,涉及到的相关工具都是Java层逆向分析常用工具。 俗话说的好,工欲善其事必先利其器。 接下来我们一起来了解“3K”工具,所谓的“3K”指的是JDK、SDK、NDK,这三个工具是学习Android逆向必备工具。eclipse集成开发工具打开速度快、使用简单,在逆向中可以用来开发一些简单的APP程序。Android Studio工具可以用来调试smali代码,分析程序的执行流程。jadx和jeb是用来查看java代码的工具,其中jeb还可以用来调试smali代码。 有需要详细版本的小伙伴们可以加入下方群,里面会有相应的资料 qq。1139349849
安卓逆向第一步--环境配置 一般在学习逆向的时候,上的第一堂课无疑就是环境配置了, 那么需要用到那些工具呢? 环境配置是在Java层的 主要讲的就是工具安装及环境配置,涉及到的相关工具都是Java层逆向分析常用工具。 俗话说的好,工欲善其事必先利其器。 接下来我们一起来了解“3K”工具,所谓的“3K”指的是JDK、SDK、NDK,这三个工具是学习Android逆向必备工具。eclipse集成开发工具打开速度快、使用简单,在逆向中可以用来开发一些简单的APP程序。Android Studio工具可以用来调试smali代码,分析程序的执行流程。jadx和jeb是用来查看java代码的工具,其中jeb还可以用来调试smali代码。 有需要详细版本的小伙伴们可以加入下方群,里面会有相应的资料 qq。1139349849
01 编译简介 在学习逆向之前,我觉得很有必要了解一下编译原理。编译是将源代码转换成目标代码的过程及动作,通常是将高级语言转变成汇编语言或机器语言。 在这里,首先简单介绍一下高级语言、汇编语言以及机器语言,然后再介绍APK的编译过程,为后续逆向打下基础。 当然,编译涉及到的知识远远不止这些,这里我只是结合APK的编译过程,选择性地介绍一些需要的知识而已。避免介绍过多的编译知识,反而导致大家无法理解的情况发生。 如果有兴趣,可以去查阅相关书籍,了解更多关于编译的知识。 02 编译详解 编译 编译通常涉及到三种语言:高级语言、汇编语言、机器语言。 首先大家要明确的是,计算机只能理解二进制,它并不理解用C、Java、Python等高级语言写的源代码。在我们眼里,这是相加,这是调用函数;但在计算机眼里,这就是屎。 就和之前《网络层 | 网际协议IP(1)》介绍的”点分十进制“一样,高级语言只是对人类友好,方便人类阅读而已,如果也想让计算机理解,就必须将高级语言解释成计算机能理解的机器语言,这就是编译的作用。 机器语言:二进制指令集,计算机能直接识别和执行,也被称为机器码。比如0101代表加,1010代表减等等。它与硬件结构相关,不同种类的计算机,其机器语言是不相通的。所以按某种计算机机器指令编写的程序不能在另一种计算机上执行。 由于机器语言是由一系列0和1的构成的指令代码,对人类来说,可读性差且容易出错,于是便产生了汇编语言。 汇编语言:机器语言的符号化,所以又称为符号语言。用助记符来表示机器代码,比如机器语言0101写成汇编语言就是add,这样就比机器语言更加便于记忆,也更形象。 汇编语言是面向机器的,是机器语言的符号化,因此和机器语言一样,不同的计算机有着不同的汇编语言,它的通用性和可移植性也很差。汇编代码需通过汇编器转译成机器代码才能执行。 由于汇编语言依赖于硬件,且助记符量大难记,于是人们又发明了更便于使用的所谓高级语言。 高级语言:像Java、C、C++等都是高级语言,高度封装。相对汇编语言来说,更接近自然语言和数学公式,有较高的可读性,且和计算机硬件结构关系不大,可移植性高。 一般我们都是使用高级语言编写代码。高级语言写的源代码会被编译器编译成目标代码,目标代码通常是汇编代码或者机器代码。如果编译产出的是汇编代码,则用汇编器进一步将汇编代码汇编成机器代码。 绝大部分情况,编译的“故事发展”路线大致可以简化成如下两条: 源代码——》机器代码 源代码——》汇编代码——》机器代码 但是APK走的是另外一种路线。 源代码——》字节码——》机器代码 字节码,是编译产生的中间代码,需要通过特定的虚拟机将字节码转译成物理主机的机器代码。对虚拟机来说,字节码就是虚拟机的机器码,但不是物理主机的机器码。 这样做有什么好处?不同机器,其机器代码都是不一样的。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标语言。而将源代码编译成字节码后,只需要安装特定的软件和软件环境,就可以将其转译成机器代码。只需要编译一次,而不需要考虑平台的问题,平台的差异全部交给软件去处理。Java就是采用这种方式,因此可以”一次编译,到处运行“。 举个例子,生产红、蓝、绿三种颜色的纸张。如果采用寻常的编译方式,则需要三个车床分别生产;而采用字节码的编译方式,我只需要一个生产白色纸张的车床,然后交给第三方去染色就行了。这个例子应该很形象吧? APK编译 目前android应用开发主流语言是Java,还有近几年被官宣的Kotlin,当然还支持其他语言,这里我们只讲Java。 首先给出APK编译打包的流程图。这里我将APK的编译过程简化成如下: 源文件——》.class文件——》.dex文件——》打包成APK——》签名 首先是Java源文件编译成.class文件,这里大家应该是没有疑问的。因为这是Java的编译方式,Android应用是用Java写的,理所当然要经过这一步。 虽然Android应用是用Java开发,但它并没有采用JVM,而是采用了Dalvik虚拟机。 什么?JVM和Dalvik虚拟机是什么? 上文提到字节码需要特定的虚拟机去转译成机器码,JVM就是Java Virtual Machine,即Java虚拟机,用来将Java编译后的.class字节码文件转译成机器码。 而Dalvik虚拟机是用于Android平台的虚拟机,但它支持的是.dex字节码文件(这种格式更适合Android平台运行),因此需要将.class文件转换成.dex文件。dex即Dalvik Executable,Dalvik可执行文件。 将源代码转译成.dex格式后,然后同其他文件(图片、配置文件等)一起打包成APK。到这一步,APK文件已经生成了。 最后,Android应用程序需要签名才能在Android设备上安装。所以还需要对生成的APK文件签名。 当然,APK编译打包不止这五个步骤,也不止这么点细节,但我觉得了解这五个步骤差不多足够了,如果小伙伴们有需要的话,我也会适当补充的。
安卓是不是占移动市场的第一? Android就是占据移动端市场份额第一 互联网时代落地载体,Android不只能开发APP,Android是一个生态系统。 其原因在于开放,我们可以看到在手机、平板、车载设备、智能家居等领域都有Android的舞台。 反过来,要学习Android逆向,有必要先了解一下安卓开发 具体内容涵盖布局控件、四大组件、五大数据存储方式等,为逆向分析做铺垫
Android与ARM处理器 ARM处理器是一个32位精简指令集处理器架构,广泛地使用在许多嵌入式系统设计中。它包含以下三个指令类型:ARM指令、Thumb指令和Thumb2指令,除了Thumb指令是16位,其他两种都是32位。 1.1 ARM处理器的优点 ARM处理器的优势不在于性能,而在于执行效率上。ARM处理器采用RISC流水线指令集,在完成综合性工作方面处于劣势,而在一些任务相对固定的应用场合,优势才能得以发挥。 除了执行效率高以外,ARM还拥有指令长度固定、低成本、低消耗、体积小的优点。 ARM结构的电脑是通过专用的数据接口使CPU与数据存储设备进行连接,所以ARM处理器的存储、内存等性能扩展难以进行(一般在产品设计时已经定好其内存及数据存储的容量),因此采用ARM结构的系统,一般不考虑扩展,基本奉行“够用就好”的原则。 1.2 原生程序与arm汇编的关系 Android嵌入式智能操作系统基于Linux内核,嵌入式系统Linux是基于ARM平台。 Android的原生程序即可执行程序,前面的章节我们学习过如何编写可执行程序,编写过程中,在两个.mk文件里进行相关配置,使得所写的程序能够在Android平台下运行起来,所依赖的也是ARM平台。 由此可见,原生程序运行基于Linux内核,并且处理器基于ARM。 总结: 了解了ARM处理器拥有执行效率高,低消耗、可嵌入式开发等优点,同时还知道了ARM处理器在任务相对固定时,才能发挥出最大优势。最后还学习了Android与ARM的关系:Android是基于Linux内核,采用的是ARM处理器。
ARM汇编和X86汇编哪个难? x86汇编对于写汇编的软件开发者和编译器开发者挺简单的,寄存器少,各个寄存器的用途很好记;指令最多只有2个操作数,常用的指令基本都支持各种寻址模式,非常好熟悉,写起来感觉不比C语言复杂多少。说个不好听的,我是学习协程开始认真学习x86&x64汇编的,1天就搞定了这个语言的核心部分。 x86对于汇编器以及反汇编器开发者就特别麻烦:1是opcode规则特别特别复杂, MOD-REG-R/M 实在反人类,官方的指令手册也因此变得晦涩难懂 2. 太多可有可无的前缀,人肉反汇编摆脱干扰不容易。 我是开始写yuanzhubi/local_hook 的时候人肉反汇编(为了保证代码足够健壮)才开始学习这个x86二进制指令的。不过话虽这样说,网上有足够多的在线x86 汇编&反汇编器,如果仅仅是为了实验一下 或者为了某个事情验证一下,并不难。此外网上真的有足够多的大神,居然可以人肉汇编,生成的二进制代码(把汇编代码转化成二进制数据)比GCC的要短,真是佩服,也说明了开发完美的x64汇编器真的不容易。 ARM则恰好相反。寄存器多的像海一样,记清楚那些汇编器已经很不容易了,还别提那啥立即数使用限制(32位指令你想处理32位立即数?还好天生提供了伪指令来封装,反正寄存器多的用不完),手写汇编想要战胜C语言的编译结果变得很困难,而且3元操作数指令的确实提供了不少灵异变化和优化空间;而汇编器把汇编代码变成二进制代码则太简单了,简直是套模版。。
安卓逆向资料免费领取 需要资料的可以私信我,游戏破解这些都是没有问题的
实习生,公司做Android逆向,可是我比较喜欢Android应用开发? 其实安卓逆向没有大家这么想的这么难 安卓逆向这个圈子是比较小,但是相较于前两年增加的岗位可以说是沿直线上升。 再者就是安卓开发和安卓逆向两者其实是相辅相成的, 你有开发的基础再去学习逆向其实是在给自己增加技能。 现在很多开发的老手都会自学逆向,因为可以测试自己的软件,一攻一防,能明白自己的软件有什么问题,如何解决。 我身边很多从事应用开发的都去学习了逆向,为自己升职加薪做准备,有技术什么都不怕,就是怕你的同伴在向前进,而你在原地踏步,
安卓逆向技术能帮助我们做些什么呢? “安卓逆向”不是一个新名词,它伴随着安卓开发而生,但是一直以来,仅限于技术圈内流行,对于非技术圈人士,往往把“APP破解”和“安卓逆向”划等号。这是写给非技术圈人士看的,在于普及安卓逆向的概念及其应用场景。 安卓逆向是什么? 目前百度知道都没有收录安卓逆向这个词条,大部分能搜索到的资料都是技术人员写的偏技术类的文章,往往充斥着代码和各类工具集合,非技术人员一看就比较懵逼。 简单地来说,安卓逆向是对已经打包好的APP进行反编译、源码分析了解APP实现逻辑的一门技术。我们可以把安卓安装时用到的APK文件看作一个加密后的压缩包,逆向就是要最大程序地还原出APK打包之前的源码。 逆向需要用到解密、反编译、解压缩等技术,想要100%还原APK的源码几乎是不可能的,所以在实际进行逆向分析的时候,一般都是根据想实现的目的,分析出APK的部分源码和实现逻辑,然后对这一部分源码进行修改后与原始的APK打包在一起,这样就获得了一个实现自己特定目的的APP。 安卓逆向到底能做什么? APP自动化执行程序脚本 比如有这么一个场景:某APP在某天某一时刻将推广一个领代金券的活动,只要登录账号,进入领取页面即可领取一张面额100元的无门槛代金券。很显然,这是一个可以撸羊毛的活动,如果我收集了100个账号,在那天利用某些手段确保每个账号抢到一张代金券,那我就能抢到100*100=10000元的代金券,再利用网络把这些券打7折卖出去,就能赚个7000块,是不是很爽?!通过安卓逆向分析,我就能把登录、领券的动作做成一个自动化执行的插件,我先把所有账号和密码保存起来备用,到了领券的开放时间,立即自动登录、领券,一个账号领券完,自动切换登录另一个账号,一气呵成就把所有账号的券都领到手。这就是安卓逆向的用途之一,可以自动化批量执行APP的一系列动作。类似地,如果想实现批量登录账号、点赞、评论,同样也是可以的。 修改APP的功能 不知道大家有没有遇到过,有些APP经常提示要更新,有些必须强制更新才能使用,可我就是不想更新,这时候也可以用逆向技术来实现修改APP的某些功能。通过逆向分析,找到触发更新的代码,然后把它屏蔽掉,这样打开APP后就再也不会提示更新了。
想入it,有哪些比较好的培训班? 这里分享一些选择培训机构的技巧 1、选小班 20人以下的小班,学习消化吸收、答疑能由授课讲师关注解决,而不是更多交给技术辅导、助教人员。 2、慎选老牌机构,品牌大不一定课程就是最好的,越老的机构也有意味着课程内容更新慢,里面的大部分讲师脱离一线企业太久,和目前企业岗位的技能需求相差也会较大。 3、看课程中实战项目授课的方法模式,以及有哪些项目,主流软件产品、互联网产品项目都需要有所覆盖,提高就业时的公司选择面。 4、一定要上门试听,一般机构都是可以免费试听7天的。试听目的是感受一下机构授课模式、讲师授课风格,同时也可以向班级里其他学员打听一下反馈。 5、最后比较价格,选择适合自己的
那些参加了IT培训班的同学,现在过的怎么样? 想去学习,但很迷茫,想听听那些培训出来的想法
教你5步搞定代码混淆 代码混淆是上线前必不可少的一部分操作,作为一个高**程序员,怎么让自己的混淆看起来更专业,更高**呢!简单来说,有条理,让人一目了然,当然这是给你同伴看滴,对于那些想要反编译的朋友来说还是越难懂越好咯。不多说,看文档; 分为5部分: =================== 定制化区域================= 1. 实体类区域 项目中的实体类,最好放在一个包下,如果没有也没关系,一个个添加下就可以了!比如我的实体类大多数放在entity包下面,所以就这样写:第三方包区域 项目中使用第三方包是很难避免的!一般所使用的第三方包官方都会有提供,如果没有,那就Google或者百度,实在找不到,就自己写吧:与js互调区域 工程中没用到,可不写。 反射相关区域 工程中没用到,可不写。 ==================基本不用动区域================ 1. 基本指令区域 2. 默认保留区 3. webView 这个区域基本通用,可以照抄。 在proguard-rules.pro中添加如下文件:添加后将minifyEnabled设置为true,打包即可。 最后来一句,学习在于积累。 文章认真写好每一篇,写着写着就发现自己的**提高了!有什么问题可以留言,看到及时回复。
ARM汇编和X86汇编哪个难? 学习安卓逆向是不是会设计到arm汇编,x86汇编是不是也会涉及到?
做逆向工程该学x86汇编还是arm汇编,还是都要学? 主要看你做什么逆向,pc端还是移动端 pc端主要是x86汇编 移动端主要是arm汇编 两者之间用途不一样也不会说谁好谁坏 如果两种都会也是一个加分项。
学习安卓逆向,是要学习一种汇编语言啊 我记得好像是arm汇编,是吗?
汇编语言有多少种? 在网上看到的汇编语言有: x86汇编 8086汇编 AT&T汇编 Intel汇编 ARM汇编 想学习汇编,但是这么多汇编语言,学习哪一种好呢,以后想从事安卓逆向行业
计算机基础知识对程序员来说有多重要? 对于程序员来说。掌握语言的语法,其实只是万里长征的第一步。 真正困难的是,如何把现实的问题转化成代码。 计算机语言,他的本质是语言。和英语,法语,德语一样的。 是一门用来指挥计算机这个东西来干活的语言。 但是,你掌握了语法,背了单词,就能写一篇文章告诉一个英国工程队伍,让他们帮你解决一个工程问题么? 显然不能,你要懂这个工程相关的只是,还要懂他们的行为模式,习惯,手里的工具,还要知道资源的分配和管理模式,等等等等,语言本身,只是一个基础。而后面的东西才是能让这门语言起作用的关键。 而计算机的基础知识就是在执行者和工具的层面上,让你知道计算机是如何运转的,你要如何去安排和调度计算机的资源来解决问题。 更进一步,在遇到现实的业务问题后,在理解了业务需求之后,就可以快速的转化成技术方案来解决问题。而这才是高级程序员和普通的程序员之间的区别。 要知道,程序员的本名,叫XXX开发工程师。和其他的工程师一样,你要是连自己要去操作的对象的运转特质都不知道。那就只能干很表面的工作。 比如说: 计算机组成原理,当程序出错时,当系统加载时,当遇到底层的问题时,就可以更快的判断和分析问题,而不是只会重启。 数据结构,理解的数据结构,就可以明白语言中为什么会有数组,链表,map,字典,栈,队列等等多种多样的结构。 操作系统,就当遇到多线程、多进程、线程池、内存分配时,就能明白为什么要这么做,为什么要那么做,做了以后的表现都是为什么,而不是浑浑噩噩的跑跑看。 网络基础,当编写各种网络传输的程序时,就能够明白,各种各样的网络协议分别都是为什么。底层的逻辑是什么,如果有一天成为架构师的时候,选择技术方案时,心里面会有底,而不是瞎选一通。 这些东西,看起来好像去网上搜一下,看一看,几天就看个七七八八,剩下的大部分似乎都没起到什么作用。但是,学习一样东西不是明白个大概就能够会用的,是需要一遍一遍,长期的理解思考,把知识渗透到行为模式中,这样每当遇到问题是,心里马上就会有个判断,不需要现场去搜索,即便去搜索,也马上会知道要搜什么。而这就是效率的关键。 当随着年龄和资历的增加,就可以且需要解决越来越复杂的工程问题,需要带团队,培养新人,帮新人解决问题时。这些知识就会越来越凸显出价值。这些知识才是让一个程序员越老越吃香的关键。因为这些知识是不变的,随着经验,越来越熟练的和现实结合起来。是年轻程序员们最难替代的部分。 或者,简要的说。计算机基础知识,是让程序员35岁没那么容易被淘汰的关键。
市场上90% app 都存在侵犯隐私 今天看见一篇文章,就是说市面上的app大部分都存在侵权,强制获取信息,等违法手段,这种问题难道没有人管制吗?
现在app是不是很大一部分都存在窃取隐私 感觉很多app都是要求你强制开启定位,获取号码,不然就用不了,这是不是存在侵权啊。
作为安卓开发人员学习逆向,会得到那些技术方面的提升呢 是不是就是正向会开发,逆向会破解
游戏逆向和安卓逆向学的技术都是一样的? 游戏是一个app,逆向软件也是app,那本质上是不是都是一样的啊
做爬虫的学习安卓逆向难不难? 作为一名爬虫工作者,想学习安卓逆向来爬取移动端的数据,学习过程难不难呢
软件逆向的渊源 一提“破解”、“逆向”等词汇,大家定然众口芬芸,莫衷一是,原因就是我们对其概念和历史并不知晓,换言之,我们大多数人现在只知其然,不知其所以然。当然大家最关心的法律问题更是知之甚少了。 希望这篇文章可以带给大家一个软件逆向领域的模型。 软件逆向工程 定义 软件逆向工程(Software Reverse Engineering)又称软件反向工程,是指从可运行的程序系统出发,运用解密、反汇编、系统分析、程序理解等多种计算机技术,对软件的结构、流程、算法、代码等进行逆向拆解和分析,推导出软件产品的源代码、设计原理、结构、算法、处理过程、运行方法及相关文档等。通常,人们把对软件进行反向分析的整个过程统称为软件逆向工程,把在这个过程中所采用的技术都统称为软件逆向工程技术。 现实中,人们并不总是完全需要逆向出目标软件的所有功能,如果那样的话将会是一个艰苦而漫长的过程。大多数情况下是意图通过对软件进行逆向,从中获取软件的算法,或破解软件及进行功能扩展等。 研究现状 软件逆向工程最早是作为软件维护的一部分出现的。早在 20 世纪 60 年代,随着第三代计算机的产生,为了挽救大量运行在即将报废的第二代计算机上的软件,同时也为加速开发第三代计算机上的软件,美国开始研制针对特定软件的专门用途的逆编译工具来进行软件移植,并成功转换了许多优秀软件。这些逆编译工具中大量使用了软件逆向工程中的技术方法。此后软件逆向工程技术逐步被各国所认识,并广泛研究和应用到多个软件技术领域中。 在国外,CMU SEI 成立了专门的再工程中心,致力于通过软件逆向工程进行程序理解技术的标识、增强和实践推广。20 世纪 80 年代,个人计算机兼容市场爆发性发展的很大一部分原因就是对 IBM PC 机的 BIOS 软件进行了逆向工程,而芯片制造商 Cyrix 和 AMD 对 Intel 的微处理器进行逆向工程后,开发出了与之相兼容的芯片。 Chikofs 等人于 1993 年发起的逆向工程会议每年举行一次,研究和讨论软件逆向工程的问题、技术及其支持工具。大量的研究成果都集中在程序理解的辅助工具上,例如,IBM 日本研究员研制的基于知识的代码理解工具 PROMPTER、美国 Yale 大学计算机系研制的对 Pascal 语言进行联机分析和理解的工具 PROUST等。 80 年代后期到 90 年代,关于解决软件逆向工程和软件版权的矛盾基本上有了结果,各国纷纷针对软件逆向工程进行立法,不是约束而是规范该领域的研究工作。根据美国联邦法律,对拥有版权的软件进行逆向工程操作如反汇编,若不是研制新产品与之竞争或获取非法利益,则所进行的逆向操作是合法的[PamelaSamuelson 1990]。日本也立法规定软件逆向工程是合法的,理由是它有利于软件应用人员之间的相互交流[[RohanMishral 997],英国政府 1992 年也修改了于1988 年颁布的软件版权法[[SingletonS 1993],该法律允许为了研究和个人学习目的而对程序逆向工程。从此,逆向工程的研究有了法律保障。 就在 80 年代国外逆编译研究相对沉寂之时,国内关于这方面的研究却如火如荼。如北京大学以杨芙清院士为首开发的“青鸟软件生产线系统”中的青鸟逆向工程工具是其中一项具有实质性的成果。它可以针对 C++语言,采用增量分析技术静态分析源程序代码,用 EER (enhancedentity-relationship)为 C++程序建立概念模型并抽取程序信息,将信息保存在数据库中,按照不同的用户需求组织程序信息,辅助用户理解 C++程序,逆向生成源程序的 OOD (Object Oriented Design)文档,为用户进一步提取构件构架提供帮助。合肥工业大学微机所展开了用手工方法对 UNIX 操作系统进行逆向工程研究。1984 年在国家自然科学基金资助下,研究 DUAL 68000 机器上的 C 语言逆编译系统,开发成功了 68000C 逆编译系统,获国家机电工业部科技进步二等奖。此外,还有北京信息学院、上海交通大学、中科院计算所、辽宁大学、武汉大学、重庆大学、北京控制工程研究所等,其中上海交通大学在 VAX 机上实现了一个 U 语言逆编译系统[HouWY 1992],北京控制工程研究所在 PC 机上实现一个 U 语言逆编译系统〔LiJ1991,但这两个系统均没有达到实用程度。 近几年来,国内许多软件公司相继开展了软件逆向工程的研究,针对网络游戏的外挂产业的日益壮大就是软件逆向工程发展的最好见证。电子工业出版社的《加密与解密》等系统丛书,易锦教育等都为我国软件逆向工程的发展作出了贡献。2007 年 1 月 17 日,最高人民法院发布的第一个涉及不正当竞争案件审理的司法解释明确指出:通过自行开发研制或者反向工程等方式获得的商业秘密,将不被认定为反不正当竞争法有关条款规定的侵犯商业秘密行为。 工作流程 在对软件进行逆向工程研究的时候,一般会依照以下几个大的步骤来完成: 1、研究保护方法,去除保护功能。大部分软件开发者为了维护自己的关键技术不被侵犯,采用了各式各样的软件保护技术,如序列号保护、加密锁、反调试技术、加壳等。要想对这类软件进行逆向,首先要判断出软件的保护方法,然后去详细分析其保护代码,在掌握其运行机制后去除软件的保护。 2、反汇编目标软件,跟踪、分析代码功能。在去除了目标软件的保护后,接下来就是运用反汇编工具对可执行程序进行反汇编,通过动态调试与静态分析相结合,跟踪、分析软件的核心代码,理解软件的设计思路等,获取关键信息。 3、生成目标软件的设计思想、架构、算法等相关文档,并在此基础上设计出对目标软件进行功能扩展等的文档。 4、向目标软件的可执行程序中注入代码,开发出更完善的应用软件 软件逆向工程可以让人们了解程序的结构以及程序的逻辑,深入洞察程序的运行过程,分析出软件使用的协议及通信方式,并能够更加清晰地揭露软件机密的商业算法等。因此逆向工程的优势是显而易见的。对它进行研究的目的和意义可以分以下几点来具体阐述: 1、由于软件生产技术水平还没有达到人们所期望的程度,所以从头开发软件已经不适应社会对软件需求的不断增长,为了避免重复劳动,提高软件生产的效率和质量,缓解软件危机,必须充分利用和改造现有软件,对现有软件进行再设计、再工程,使软件功能得到大幅提高以满足用户的需要,而再设计(Redesign) 和再工程(Reengineering)都是软件逆向工程的形式之一。再工程是指在现有系统基础上,修改系统并组装成新的形式。 2、目前运行的许多系统由于某些原因,例如其运行环境已改变,或者是根据业务的需要对其功能要进行调整,导致它们必须进行演化才能继续使用。这些系统在经历多年运行之后,包含了众多的知识,包括系统需求、设计决策和业务规则等,通过软件逆向工程将这些软件系统转化为易演化系统,是充分有效地利用这些有用资产的良好途径。软件逆向工程可以从这些系统的程序源代码出发,导出切实可用的信息。 3、在已发布的软件中,许多优秀软件生产厂家出于技术保护等原因没有向用户开放源代码或者不提供源代码,需要用户自己去恢复,此时对软件进行逆向工程研究是最好的方法。 4、现今的商业社会把软件科学纳入一种相对封闭的范畴,为了追求利润,一些软件业的霸主试图进行知识的垄断,它的直接体现就是鼓励普通用户和大多数程序员把软件看成“黑箱”,使得它们不去关心软件的运行机制,把软件的生产变成类似车间加工的一道道流程,却隔断了人们深入研究软件科学的通路。而作为开放源代码的前期工程,软件逆向工程对整个开放源代码工程有着至关重要的作用。 由此我们看出,软件逆向工程为软件技术的发展和相互学习、借鉴提供了一种很有效的技术手段,然而,由于受软件知识产权保护及相关法律法规的限制,软件逆向工程并不能像其它软件技术那样分开、透明地为大家所熟知、了解和广泛交流与应用。另外,软件逆向工程所涉及到的技术很多,它不仅要求逆向工程人员必须熟悉如操作系统、汇编语言、加解密等相关知识,同时还要具有丰富的多种高级语言的编程经验,熟悉多种编译器的编译原理,较强的程序理解和逆向分析能力等,这些都限制了软件逆向工程的发展。
跪求学习破解的群 只要是相关的逆向群,请发出来,谢谢
AndroidKiller介绍与使用 APK属于压缩文件,不可以通过直接解压的方式来获取明文内容,需要借助AndroidKiller这类的第三方的工具 一:AndroidKiller介绍、环境配置 AndroidKiller是一款经常用来反编译APK的工具。 1.“AndroidKiller”的文件夹目录结构,如下图所示,双击打开“AndroidKiller.exe”文件,此时,会弹出一个窗口,如下图所示,提示没有Java SDK环境,直接点击OK进入AndroidKiller工具界面。2.选中“主页”菜单栏下的“配置”选项,如下图所示。3.点击“配置”选项后弹出窗口,点击“Java”图标配置JDK安装路径。点击编辑框右边的“文件夹”图标,找到之前安装的JDK目录,依次选择“jdk1.8.0_111”文件夹下的“bin”文件夹,点击确定按钮,如下图所示。4.接下来我们需要了解AndroidKiller工具里面的“Android”选项卡下的三个常用功能,如下图所示。 (1)编译:点击这个编译按钮,将反编译后的文件重新打包成.apk文件。 (2)插入代码管理器:把常用代码进行封装,方便逆向时快速添加smali代码。 (3)apktool管理器:主要是用来管理和更新apktool工具。注意 如果apktool工具更新不及时,那么在反编译新的APK文件时,就会报错,造成无法反编译的情况,需手动更新apktool工具。 二:更新apktool工具 1.打开apktool工具,点击“Android”选项,如下图所示。2.找到APKTOOL管理器,点击,这时会弹出一个窗口,如下图所示。3.点击“添加”按钮后会弹出一个窗口,在弹出的“添加APKTOOL”窗口中,有名称、路径和参数三个添加项,如下图所示。首先名称项,填写你要添加的新版apktool文件名,文件名一定要有意义,格式一定是apktool+版本信息,这样做的目的是为了方便之后选择对应的插件;其次是路径项,找到要添加的新版apktool工具所在路径;第三个是参数,此处不填,如下图所示。完成后点击确定,但此时还没有完成,切记在下方选中更新后的apktool工具,如下图所示。三:更新插件 1.更新插件的意义:在逆向分析APP时,有时需要插入smali代码,打印日志信息、记录方法调用流程,或者是添加弹窗、加载so库等,这些代码都是固定的,再将其封装成一个个插件来使用。 2.更新插件流程: (1)首先,更新插件时先将原有的插件进行删除。 (2)打开AndroidKiller工具所在路径,找到“cfgs”文件夹,如果这个文件夹中存放有插件的“injectcode”文件夹,则将此文件夹进行删除。 (3)接下来进行更新,可以看到这里又出现一个新的“injectcode”文件夹,这个文件夹里面存放的就是更新后插件文件,如下图所示。小结 通过本节课的学习,我们了解了AndroidKiller的环境配置,这里需要注意的是在配置JDK路径时,一定要配置到“bin”目录。在学习更新apktool工具时,要注意在填写名称时,格式一定是apktool_+版本信息,而后在添加新工具的时候,一定要选中更新后的apktool工具。最后需要注意的是,在进行更新插件操作时,一定要将原有的插件先进行删除。
Java代码混淆 在分析一个程序的Java层逻辑,进行反编译时,偶尔会发现代码中所有的函数名、变量名、类名等都变成了一些杂乱无章的名字,它们没有任何规律可言,这就是程序的混淆。 Java代码混淆就是为了保护Java源代码,对编译好的class文件进行混淆处理。混淆就是对发布出去的程序进行重新组织和处理,通过一些工具,对函数名、变量名、类名、字段进行批量重命名。使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义。 一:混淆的例子及作用 在学习混淆之前,先来看一下没有被混淆的例子,下面是程序的反编译,如下图所示。从图中可以发现,这里的反编译逻辑非常清楚,反编译之后的源码和当时写的代码完全相同。 保护Java源代码的第一步就是混淆,对代码进行修改,让反编译出来的代码不容易被看懂,具体的操作流程如下图所示。 1.打开androidkiller工具,如下图所示。2.打开其中一个smali文件夹,如下图所示。打开后,发现里面内容已被修改,正常开发中不会存在这种命名,如下图示。3.任意打开其中一个文件,会发现代码也发生了相应的变化,如下图所示。4.此时需要借助jdax-gui工具,将代码进行还原处理,如下图所示。5.还可以借助一些工具,达到简单混淆的目的,点击面层菜单中的图标,它会将把代码重新混淆,如下图所示。6.再次打开,则会对代码重新反编译并且重命名,更加方便我们进行区分,如下图所示。注意:混淆只是增加逆向的时间,但整体的逻辑不会混淆。也就是说,代码混淆并不能一劳永逸地解决代码保护的问题,它只是把读代码的时间变得比开发代码的时间还要长。 二:ProGuard介绍以及混淆特点 ProGuard就是一个混淆代码的开源项目,能够对字节码进行混淆、缩减体积、优化等处理。ProGuard还包括以下4个功能: 压缩(Shrink):检测并移除代码中无用的类、字段、方法和特性(Attribute)。 优化(Optimize):对字节码进行优化,移除无用的指令。 混淆(Obfuscate):使用a,b,c,d这样简短而无意义的名称,对类、字段和方法进行重命名。 预检(Preveirfy):在Java平台上对处理后的代码进行预检,确保加载的class文件是可执行的。 总而言之,Proguard是一个Java类文件压缩器、优化器、混淆器、预校验器。压缩环节会检测以及移除没有用到的类、字段、方法以及属性。优化环节会分析以及优化方法的字节码。混淆环节会用无意义的短变量去重命名类、变量、方法。这些步骤让代码更精简,更高效,也更难被逆向(破解)。 ProGuard工作原理 ProGuard由shrink、optimize、obfuscate和preveirfy四个步骤组成,每个步骤都是可选的,我们可以通过配置脚本来决定执行其中的哪几个步骤。小结 混淆的概念是指通过一些工具,对函数名、变量名、类名,字段进行重命名。同时,对混淆和非混淆例子之间的区别以及混淆的特点也有了一定的了解。
Android APK加固后如何签名 Android在对应用加固之后,会破坏原有的签名,需要重新签名才能发布到应用市场,那么如何签名呢,请指教
今天分享方法栈跟踪,掌握本次的内容,有助于在关键方法里面插入栈跟踪代码,理清该方法的上层调用关系。 一:方法栈跟踪定义 之前在学习虚拟机的时候,提到过栈结构,它是一种先进后出的数据结构。 栈跟踪法属于动态调试的方法,原理是输出运行时栈调用跟踪信息,然后查看函数调用序列来理解方法的执行流程。 二:下载、安装好搜小说应用程序 以“好搜小说大全.apk”文件作为案例,下载“好搜小说大全.apk”文件,打开雷电模拟器安装该APK,安装完成后,点击运行,如下图所示。第一次打开该程序会有一个引导界面,引导界面结束后,会出现一个“应用更新”弹窗,点击“取消”按钮,不更新该程序。 打开命令窗口,输入adb shell dumpsys activity top命令,获取应用程序的包名信息。 然后打开“DDMS”工具,添加过滤器,点击+号,名称设置为“yijindaxue”,在过滤器中增加“好搜小说大全.apk”包名,查Log日志信息,如下图所示。三:查看栈跟踪信息 通过查看Log日志信息,发现该程序在运行时打印的Log日志信息非常多。“system.err”标签是栈信息的标志,由此我们可以看到,这其中大多数Log日志信息都是“栈”信息,如下图所示,还有一些是其它级别的信息,暂时不做过多的讲解。阅读打印输出的“栈”信息,上层是被调用者,下层是调用者,总的来说就是自下而上的调用关系,如下图所示。四:插入栈跟踪代码 把“好搜小说大全.apk”文件,拖入AndroidKiller工具里面进行反编译,反编译完成后会弹出一个弹窗,在这里点击“否”,在工程信息栏点击程序“入口”界面,如下图所示。然后点击三角形图标快速浏览相关方法,如下图所示。可以看到存在多种方法,比如loaddata,loadDefault等,想查看哪一种方法上层调用关系,就进行对应方法的选择,如下图所示。以“loadData”方法为例,选择查看“loadData”方法上层调用关系,点击跳转到该方法对应的smali代码位置,如下图所示。沿用上节课的逻辑,找到“.prologue”,在“.prologue”下面插入方法栈跟踪代码,具体的操作是右键=》插入代码=》StackTrace栈跟踪,如果没有“.prologue”,就在参数后面插入栈跟踪代码,然后CTRL+S保存,如下图所示。 注意: 在插入栈跟踪代码时,需要查看该方法的局部变量寄存器总个数,如果小于2需要修改,局部变量寄存器的总数为2,原因是插入的栈跟踪代码要使用两个局部变量寄存器最后点击“编译”按钮开始编译,编译完成后,安装到雷电模拟器上。安装完成后,打开“DDMS”工具,选择之前我们添加的过滤器“yijindaxue”,点击运行 “好搜小说大全”APP程序,查看程序启动的过程中出现的Log日志信息,如下图所示。通过查看栈跟踪信息,我们得出结论:“loadData”是在“onCreate”方法中被调用的,而“onCreate”方法是被系统函数调用的。分析到这里,我们就知道“loadData”方法的上层调用流程了。 在操作的过程中我们需要频繁的安装打开程序,每次都会弹出是否要更新APP程序的弹窗,那么给大家传授一个小技巧,教大家如何去除APP程序的更新弹窗,实现免更新功能。 具体的操作流程: (1)在“工程管理器”中找到“apktool.yml”文件,双击打开该文件。 这个文件是工程配置文件,里面包含工程文件信息以及版本信息。应用程序会进行判断,这个版本信息是否大于当前发布的最新版本信息,如下图所示。(2)继续浏览该文件,找到“versionCode”对应的属性的值,将该值改大,这里改为“999”,点击“编译”按钮开始编译,编译完成后安装运行,发现没有更新APP程序的弹窗了,说明成功实现免更新功能,如下图所示。小结: 今天主要学习方法栈跟踪,理解栈跟踪原理,掌握插入栈跟踪代码技巧,插入栈跟踪,分析方法的上层调用流程的关键:插入栈跟踪的位置选择,操作:右键=》插入代码=》StackTrace栈跟踪,插入栈跟踪代码时,需要查看该方法的局部变量寄存器总个数。 **如果你也对安卓逆向感兴趣。可以加下方的群,大家一起讨论问题, 安卓逆向交流学习:1139349849 vx:Yjxiaox
今天分享方法栈跟踪,掌握本次的内容,有助于在关键方法里面插入栈跟踪代码,理清该方法的上层调用关系。 一:方法栈跟踪定义 之前在学习虚拟机的时候,提到过栈结构,它是一种先进后出的数据结构。 栈跟踪法属于动态调试的方法,原理是输出运行时栈调用跟踪信息,然后查看函数调用序列来理解方法的执行流程。 二:下载、安装好搜小说应用程序 以“好搜小说大全.apk”文件作为案例,下载“好搜小说大全.apk”文件,打开雷电模拟器安装该APK,安装完成后,点击运行,如下图所示。第一次打开该程序会有一个引导界面,引导界面结束后,会出现一个“应用更新”弹窗,点击“取消”按钮,不更新该程序。 打开命令窗口,输入adb shell dumpsys activity top命令,获取应用程序的包名信息。 然后打开“DDMS”工具,添加过滤器,点击+号,名称设置为“yijindaxue”,在过滤器中增加“好搜小说大全.apk”包名,查Log日志信息,如下图所示。三:查看栈跟踪信息 通过查看Log日志信息,发现该程序在运行时打印的Log日志信息非常多。“system.err”标签是栈信息的标志,由此我们可以看到,这其中大多数Log日志信息都是“栈”信息,如下图所示,还有一些是其它级别的信息,暂时不做过多的讲解。阅读打印输出的“栈”信息,上层是被调用者,下层是调用者,总的来说就是自下而上的调用关系,如下图所示。四:插入栈跟踪代码 把“好搜小说大全.apk”文件,拖入AndroidKiller工具里面进行反编译,反编译完成后会弹出一个弹窗,在这里点击“否”,在工程信息栏点击程序“入口”界面,如下图所示。然后点击三角形图标快速浏览相关方法,如下图所示。可以看到存在多种方法,比如loaddata,loadDefault等,想查看哪一种方法上层调用关系,就进行对应方法的选择,如下图所示。以“loadData”方法为例,选择查看“loadData”方法上层调用关系,点击跳转到该方法对应的smali代码位置,如下图所示。沿用上节课的逻辑,找到“.prologue”,在“.prologue”下面插入方法栈跟踪代码,具体的操作是右键=》插入代码=》StackTrace栈跟踪,如果没有“.prologue”,就在参数后面插入栈跟踪代码,然后CTRL+S保存,如下图所示。 注意: 在插入栈跟踪代码时,需要查看该方法的局部变量寄存器总个数,如果小于2需要修改,局部变量寄存器的总数为2,原因是插入的栈跟踪代码要使用两个局部变量寄存器最后点击“编译”按钮开始编译,编译完成后,安装到雷电模拟器上。安装完成后,打开“DDMS”工具,选择之前我们添加的过滤器“yijindaxue”,点击运行 “好搜小说大全”APP程序,查看程序启动的过程中出现的Log日志信息,如下图所示。通过查看栈跟踪信息,我们得出结论:“loadData”是在“onCreate”方法中被调用的,而“onCreate”方法是被系统函数调用的。分析到这里,我们就知道“loadData”方法的上层调用流程了。 在操作的过程中我们需要频繁的安装打开程序,每次都会弹出是否要更新APP程序的弹窗,那么给大家传授一个小技巧,教大家如何去除APP程序的更新弹窗,实现免更新功能。 具体的操作流程: (1)在“工程管理器”中找到“apktool.yml”文件,双击打开该文件。 这个文件是工程配置文件,里面包含工程文件信息以及版本信息。应用程序会进行判断,这个版本信息是否大于当前发布的最新版本信息,如下图所示。(2)继续浏览该文件,找到“versionCode”对应的属性的值,将该值改大,这里改为“999”,点击“编译”按钮开始编译,编译完成后安装运行,发现没有更新APP程序的弹窗了,说明成功实现免更新功能,如下图所示。小结: 今天主要学习方法栈跟踪,理解栈跟踪原理,掌握插入栈跟踪代码技巧,插入栈跟踪,分析方法的上层调用流程的关键:插入栈跟踪的位置选择,操作:右键=》插入代码=》StackTrace栈跟踪,插入栈跟踪代码时,需要查看该方法的局部变量寄存器总个数。 **如果你也对安卓逆向感兴趣。可以加下方的群,大家一起讨论问题, 安卓逆向交流学习:1139349849 vx:Yjxiaox
安卓逆向白嫖群,无论是基础学习还是案列分享,处处都是惊喜 走过路过不要错过
做游戏开发难不难 和开发相比,游戏开发是什么程度呢
代码保护-- 几款加壳工具 Virbox Protector(商用) 分带授权的版本和独立壳。带授权的版本加壳后需要绑定许可,许可控制软件能否用,加壳保护安全。独立版的话就只是对代码做加壳,防止代码反编译。 碎片代码执行、外壳加密、混淆、数据加密。 服务商提供了较为完善的文档以及加密方式,提供了较为充分的产品管理平台,以及云端网络加密,并且对于开发者免费使用。 使用评价: 简单下载使用了一下,提供的功能很多,并且管理平台较好。比较推荐这一个软件。 DRMsoft EncryptEXE(有破解版) 加密模式: 非绑定模式 ---- 加密后的文件不绑定用户电脑,但用户需要一个开启密码才可以打开 绑定模式 ---- 一机一码授权,加密后的文件不同用户电脑需要不同的开启密码 无密码模式 ---- 加密后的文件无需要开启密码即可运行,仅对原始文件做加密保护 一码通模式 ---- 采用相同秘钥和产品编号加密的不同文件,在同台电脑上只需认证一次 特点: 可以设置加密后文件的运行次数和有效期; 可以设置加密文件运行过程中锁定用户键盘; 可以设置加密文件运行中禁用鼠标右键; 可以设置用户提示语,在用户打开之前显示给用户; 可以禁止拷贝、编辑、打印; 可以禁止虚拟机运行; 可以设置加密后的文件只能从命令行打开运行,以便只有你自己的程序可以调用他; 可以禁用打印机; 可以检测用户电脑是否开启远程桌面服务并终止运行 EXECryptor(有破解版) 有支持代码和资源的压缩;压缩功能主要用来减少带宽占用和加快下载速度。支持多种文件格式,在保护代码中插入不同的处理器指令或代码片段,并使用其它指令替换,这些指令的运算结果都是相同的。是在 CPU 指令层面上混乱代码而不是在应用层上。 网络评价兼容性不是很好,但是加密安全性表现良好。 VProject(有破解版) 原创虚拟机保护引擎、随机指令集、随机填充代码、代码乱序执行、外壳保护、反内存转储存、区段合并、资源加密、反调试、防修改。使用拟机乱序引擎,可以阻止绝大多数人逆向分析。使用SDK,进行重点加密。所以基本上不影响程序运行效率自带授权系统,正常用户管理系统,黑名单,加密SDK,授权API等实用功能,分析使用Vprotect保护后的程序,将不仅仅是一项技术活,同时也会成为高强度的体力活。 Axprotect(商用) 加密方式: 在运行时自动解密和重新加密软件的技术,为软件提供自动防护。该技术目前支持多种操作平台,诸如Windows,Linux,Mac OS,.NET 及Java应用程序等等。所有的用户收到的是相同的被保护软件版本。可以针对不同用户购买的不同功能模块或者产品类型,个性化的生成对应的许可信息。您有权决定客户以何种方式接受许可,或者将许可存放至CmDongle加密狗中发放给客户,或者通过CmAct许可文件进行发放。可以对客户分配相应的许可类型,例如本地单用户许可、网络并发许可、时间限制型许可(适用于软件测试版)。 特点: Protection 保护工具 用于实现高安全强度的保护软件,防止盗版及逆向工程 Licensing 授权工具 用于实现便捷、安全的软件授权,包括创建灵活的授权模式、整合软件的业务流程,以及采用企业现行的办公后台系统对软件所有的生命周期进行完整的管理。 Security 安全工具 监控软件最终使用者,防止来自第三方的恶意篡改及攻击。 Vmproject(商用软件、长期更新) 虚拟机保护机制,安全系数较高,破解难度大 VMProtect允许对可执行文件(EXE、SCR)、动态链接库(DLL,OCX,BPL)和驱动程序(SYS)进行保护。VMProtect允许对32位和64位应用、库和驱动进行保护。MProtec保护的文件可以在几乎任何版本Windows OS上运行,自Windows 95开始。32和64位版本都被支持,VMProtect兼容DEP和UAC。VMProtect允许生成和验证序列号。手动和自动生成都被支持。序列号可以是有限的时间或日期和硬件锁定的,而免费升级期间也可以被限制。 VMProtect确保它实际上无法运行没有一个序列号代码。 网络评价: 加密的安全级别很高,破解难度很大,但是加密数据多,可能会影响系统的性能。
代码保护-- 几款加壳工具 Virbox Protector(商用) 分带授权的版本和独立壳。带授权的版本加壳后需要绑定许可,许可控制软件能否用,加壳保护安全。独立版的话就只是对代码做加壳,防止代码反编译。 碎片代码执行、外壳加密、混淆、数据加密。 服务商提供了较为完善的文档以及加密方式,提供了较为充分的产品管理平台,以及云端网络加密,并且对于开发者免费使用。 使用评价: 简单下载使用了一下,提供的功能很多,并且管理平台较好。比较推荐这一个软件。 DRMsoft EncryptEXE(有破解版) 加密模式: 非绑定模式 ---- 加密后的文件不绑定用户电脑,但用户需要一个开启密码才可以打开 绑定模式 ---- 一机一码授权,加密后的文件不同用户电脑需要不同的开启密码 无密码模式 ---- 加密后的文件无需要开启密码即可运行,仅对原始文件做加密保护 一码通模式 ---- 采用相同秘钥和产品编号加密的不同文件,在同台电脑上只需认证一次 特点: 可以设置加密后文件的运行次数和有效期; 可以设置加密文件运行过程中锁定用户键盘; 可以设置加密文件运行中禁用鼠标右键; 可以设置用户提示语,在用户打开之前显示给用户; 可以禁止拷贝、编辑、打印; 可以禁止虚拟机运行; 可以设置加密后的文件只能从命令行打开运行,以便只有你自己的程序可以调用他; 可以禁用打印机; 可以检测用户电脑是否开启远程桌面服务并终止运行 EXECryptor(有破解版) 有支持代码和资源的压缩;压缩功能主要用来减少带宽占用和加快下载速度。支持多种文件格式,在保护代码中插入不同的处理器指令或代码片段,并使用其它指令替换,这些指令的运算结果都是相同的。是在 CPU 指令层面上混乱代码而不是在应用层上。 网络评价兼容性不是很好,但是加密安全性表现良好。 VProject(有破解版) 原创虚拟机保护引擎、随机指令集、随机填充代码、代码乱序执行、外壳保护、反内存转储存、区段合并、资源加密、反调试、防修改。使用拟机乱序引擎,可以阻止绝大多数人逆向分析。使用SDK,进行重点加密。所以基本上不影响程序运行效率自带授权系统,正常用户管理系统,黑名单,加密SDK,授权API等实用功能,分析使用Vprotect保护后的程序,将不仅仅是一项技术活,同时也会成为高强度的体力活。 Axprotect(商用) 加密方式: 在运行时自动解密和重新加密软件的技术,为软件提供自动防护。该技术目前支持多种操作平台,诸如Windows,Linux,Mac OS,.NET 及Java应用程序等等。所有的用户收到的是相同的被保护软件版本。可以针对不同用户购买的不同功能模块或者产品类型,个性化的生成对应的许可信息。您有权决定客户以何种方式接受许可,或者将许可存放至CmDongle加密狗中发放给客户,或者通过CmAct许可文件进行发放。可以对客户分配相应的许可类型,例如本地单用户许可、网络并发许可、时间限制型许可(适用于软件测试版)。 特点: Protection 保护工具 用于实现高安全强度的保护软件,防止盗版及逆向工程 Licensing 授权工具 用于实现便捷、安全的软件授权,包括创建灵活的授权模式、整合软件的业务流程,以及采用企业现行的办公后台系统对软件所有的生命周期进行完整的管理。 Security 安全工具 监控软件最终使用者,防止来自第三方的恶意篡改及攻击。 Vmproject(商用软件、长期更新) 虚拟机保护机制,安全系数较高,破解难度大 VMProtect允许对可执行文件(EXE、SCR)、动态链接库(DLL,OCX,BPL)和驱动程序(SYS)进行保护。VMProtect允许对32位和64位应用、库和驱动进行保护。MProtec保护的文件可以在几乎任何版本Windows OS上运行,自Windows 95开始。32和64位版本都被支持,VMProtect兼容DEP和UAC。VMProtect允许生成和验证序列号。手动和自动生成都被支持。序列号可以是有限的时间或日期和硬件锁定的,而免费升级期间也可以被限制。 VMProtect确保它实际上无法运行没有一个序列号代码。 网络评价: 加密的安全级别很高,破解难度很大,但是加密数据多,可能会影响系统的性能。
什么是协议 计算机网络中有一个术语:协议。什么是协议,协议的作用是什么?为了理解这一概念,我们可以通过和一些人类活动场景类比来理解。 场景一 如下图1左侧所示,该场景是我们生活中比较典型的交流场景。 人与人之间的交流,总是需要先由其中一方传递一个“我要和你交流”的信号,从而开始与另一方的交流。对应到图1的场景,信号就是第一个“你好”。然后如果对方如果有意向和你继续交流,就会返回给你一个“我愿意和你交流”的响应信息。图1的第二个“你好”就是对方返回的响应信息,表示我能够和对方继续交流。对于第一个“你好”的其它不同响应(例如“不要烦我!”,或“我不会说英语”,或其他不合适的回答)也许代表的就是一个勉强的或不能进行交流的含义。在此情况下,在图1场景中我们就无法询问对方时间。有时,问的问题根本得不到对方任何回答,此情况下,我们通常也会放弃向对方询问。在人类协议中,有我们发送的特定报文,也有我们根据接收到的应答报文或其他事件采取的动作(例如某个给定的时间内没有回答)。显然,发送和接收的报文,以及这些报文发送和接收或其他事件出现时所采取的动作,这些在人类协议中起到了核心作用。如果双方使用的协议不同(例如,一个人讲礼貌,另一个人不讲礼貌,或一个人明白时间的概念,另一个人却不明白),则双方就无法进行互动,因而也就不能完成有用的工作。同样的,网络中也遵循这一原则,即为了完成某一工作,要求两个(或多个)通信实体运行相同的协议。人类协议与计算机网络协议 场景二 第二个场景假设你正在大学课堂里上课(例如是计算机网络课程)。教师正在唠唠叨叨地讲述协议,而你却对某些地方困惑不解。此时,教师停下来问:“同学们有问题吗?”(教师发送出一个报文,该报文所有没有睡觉的学生接收到了)你举起了手(向教师发送了一个隐含的报文),这位教师微笑地示意你说:“请讲……”,接着你就问了自己不懂的地方(即向教师传输了你的报文)。教师听取了你的问题(即接收了你的问题报文)并加以回答(向你传输了回答报文)。这个过程中,我们再一次看到了报文的发送和接收,以及这些报文发送和接收时所采取的一系列约定俗成的动作,这些是这个“提问与回答”协议的核心。 协议的概念 网络协议类似于人类协议,除了交换报文和采取动作的实体是某些设备的硬件或软件组件(这些设备可以是计算机、智能手机、平板电脑、路由器或其他具有网络能力的设备)。在因特网中,凡是涉及两个或多个远程通信实体的所有活动都受协议的制约。例如,在两台物理连接的计算机中,硬件实现的协议控制了在两块网络接口卡间的“线上”的比特流;在端系统中,拥塞控制协议控制了在发送方和接收方之间传输的分组发送的速率。 以网页访问这一场景为例,如图1右侧所示。当你向一个Web服务器发出请求时(在浏览器中输入一个网页的URL并回车),你的计算机将向改Web服务器发送一条连接请求报文,并等待回答。该Web服务器最终接收到连接请求报文,并返回一条连接响应报文。得知请求改Web文档正常后,计算机则在一条GET报文中发送要从这台Web服务器上取回的网页名字。最后,Web服务器向计算机返回该Web网页(文件)。 从以上的人类场景和网络例子中可知,报文的交换以及发送和接收这些报文时所采取的动作是定义一个协议的关键元素: 一个协议定义了在两个或多个通信实体之间交换的报文格式和次序,以及报文发送(或接收报文或其他事件)所采取的行动。 计算机网络广泛地使用了协议,不同的协议用于完成不同的通信任务。
安卓逆向环境搭建--JDK安装及配置 1.1 JDK工具下载 JDK又称JAVA SE,推荐同学们使用教程中提供的JDK,因为JDK版本过高会导致逆向有些工具无法正常使用。 1.2 JDK安装流程 下载完成后即可安装,win7和win10安装流程是一样的,步骤如下: 第一步:双击刚刚下载的安装文件,弹出欢迎对话框,单击“下一步”按钮,如下图所示。第二步:在弹出的对话框中,可以选择安装的功能组件,如下图所示,这里选择默认设置。第三步:单击“更改”按钮,弹出“更改文件夹”对话框,在对话框中将JDK的安装路径更改为D:\ProgramFiles\Java\jdk1.8.0_111,单击“确定”按钮,如下图所示。 注意:路径中不能存在中文。第四步:单击“下一步”按钮,开始安装JDK。在安装过程中会弹出JRE的”目标文件夹“对话框。 这里更改JRE的安装路径为D:\Program Files\Java\jre1.8.0_111,然后 单击“下一步”按钮,安装向导会继续完成安装进程,如下图所示。第五步:安装完成后,将弹出的对话框,显示“已成功安装”,单击“关闭”按钮,如下图所示。1.3 windows10环境配置 1.在“计算机”图标上右击,在弹出的快捷菜单中选择“属性”命令,将弹出“属性”对话框,在其左侧单击“高级系统设置”,打开“系统属性”对话框。然后点击下方的环境变量,如下图所示。2.进入环境变量对话框后发现有两个框,如下图所示。 用户变量:配置的环境更换用户就无法使用。 系统变量:该计算机上的所有用户都可使用。3.点击下面的新建,把名字设置成“JAVA_HOME”,然后把变量值填写到jdk的路径,环境变量栏里多了一个“JAVA_HOME”的选项,如下图所示。4.添加完“JAVA_HOME”后,双击path进入环境配置界面,出现编辑框,将路径“%JAVA_HOME%\bin”和“%JAVA_HOME%\jre\bin;”添加进去,如下图所示。 探究:那么这里为什么要加百分号呢? 原因很简单,起到了引用的作用,引用了前面的JAVA_HOME变量值。5.添加完成后点击确定,然后进行验证。同时按住win键(也就是键盘上四个方格的键)和R键 ,记住是同时按住,这样的话就打开了命令窗口,如下图所示。首先输入cmd然后点击回车,如下图所示。再进入窗口,如下图所示。然后输入javac命令验证是否配置成功,按Enter回车键,如下图所示。最后输出JDK的编译器信息,这说明JDK环境配置成功,如下图所示。1.4 windows7环境配置 1.在“计算机”图标上右击,在弹出的快捷菜单中选择“属性”命令,弹出“属性”对话框,在其左侧单击“高级系统设置”,打开“系统属性”对话框,如下图所示。2.单击“环境变量”按钮,弹出“环境变量”对话框,单击“系统变量”栏下的“新建”按钮,创建新的系统变量,如下图所示。3.弹出“新建系统变量”对话框,分别输入变量名“JAVA_HOME”和变量值,变量名是不能变的,变量值是JDK的安装路径,如下图所示。单击“确定”按钮,关闭“新建系统变量”对话框。4.在“环境变量”对话框中双击Path变量对其进行修改,在原变量值最前端添加“%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;”变量值,不能随意更改。单击“确定”按钮完成环境变量的设置,如下图所示。再一路点击“确定”完成环境配置。5.JDK安装成功之后必须确认环境变量配置是否正确。在Windows系统中测试JDK环境需要选择“开始”=>“运行”命令,然后在“运行”对话框中输入“cmd”并单击“确定”按钮启动控制台。在控制台中输入javac命令,按Enter键,输出JDK的编译器信息。说明JDK环境配置成功,如下图所示。小结 主要分享了JDK工具安装、环境配置,配置环境时JDK安装路径中不允许中文。windows7和windows10系统环境配置时新建系统变量时变量名“JAVA_HOME”不可以更改,还有配置Java环境时需要添加“bin”和“bin\jre”两个目录。
安卓逆向之去除app游戏入口广告 有没有大佬出一个去广告的教程啊
逆向案列--书旗小说 1.将"书旗小说"apk放进Androidkiller进行重编译打包 安装发现闪退 2.打开ddms看看有什么信息 发现了一个killProcess方法3.打开jadx-gui(个人比较喜欢 分析代码方便) 搜索“KillProcess” 根据ddms信息 发现它调用了 com.shuqi.app.ShuqiApplication 包里面的方法 我们跳转到里面去4.他这个逻辑就很清晰了5.让这个handleToken方法返回true即可 我们打开Androidkiller 修改smali加这两行代码 5.apk完美运行
1024程序员节,你有享受到程序员的待遇吗? 享受到了没有鸭
首页
1
2
3
下一页