逆向_逆向工程 - CSDN
逆向 订阅
《逆向》收录于胡夏2010年发行的第一张国语专辑《胡爱夏》,位于曲目3. 展开全文
《逆向》收录于胡夏2010年发行的第一张国语专辑《胡爱夏》,位于曲目3.
信息
中文名称
逆向
谱    曲
苏亦承
演唱者
胡夏
填    词
葛大为
逆向歌曲介绍
   逆向—男人的后悔与心碎 男版「可惜不是你」最主打「逆向」是一首狠适合的K歌,副歌狠容易朗朗上口。失恋最痛苦的莫过於「放不下」,葛大为的词先是细腻描述男人在分手后装作坚强的表面平静,这些逞强的自我安慰却只会加重失落感;到副歌塑造了一种「思念来袭」的过程,听歌的人思绪被「逆向」带回,痛苦与折磨又再次侵袭,才吐露出内心真正的疯狂后悔。胡夏在这首里充分表现出男人的压抑、爱逞强装没事的性格,以及副歌里真心诚\意的后悔与忏悔,也达到配唱制作人唱出「自我态度」的要求,让听歌的人感同身受。 [1] 
收起全文
精华内容
参与话题
  • 逆向入门

    万次阅读 多人点赞 2017-04-06 17:38:41
    从本篇起,逆向工厂带大家从程序起源讲起,领略计算机程序逆向技术,了解程序的运行机制,逆向通用技术手段和软件保护技术,更加深入地去探索逆向的魅力。 一、程序如何诞生? 1951年4月开始在英国牛津郡哈维尔...

    前沿

    从本篇起,逆向工厂带大家从程序起源讲起,领略计算机程序逆向技术,了解程序的运行机制,逆向通用技术手段和软件保护技术,更加深入地去探索逆向的魅力。

    一、程序如何诞生?

    这里写图片描述

    1951年4月开始在英国牛津郡哈维尔原子能研究基地正式投入使用的英国数字计算机“哈维尔·德卡特伦”,是当时世界上仅有的十几台电脑之一。图中两人手持的“纸带”即是早期的程序,纸带通过是否穿孔记录1或0,而这些正好对应电子器件的开关状态,这便是机器码,是一种早期计算机程序的存储形式。 
    这里写图片描述

    计算机程序是用来实现某特定目标功能,所以需要将人类思维转换为计算机可识别的语言,从人类语言到电子器件开关的闭合,这中间的媒介便是“编程语言”。

    “编程语言”大致分为三类:

    1、机器语言,又称机器码、原生码,电脑CPU可直接解读,因该语言与运行平台密切相关,故通用性很差,上面提到的利用卡带记录的便属于该类语言;

    2、汇编语言,是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在不同的设备中,汇编语言对应着不同的机器语言指令集, 运行时按照设备对应的机器码指令进行转换,所以汇编语言可移植性也较差; 
    这里写图片描述

    3、高级语言,与前两种语言相比,该类语言高度抽象封装,语法结构更接近人类语言,逻辑也与人类思维逻辑相似,因此具有较高的可读性和编程效率。但是高级语言与汇编语言相比,因编译生成的辅助代码较多,使运行速度相对“较慢”。 Java,c,c++,C#,pascal,Python,lisp,prolog,FoxPro,易语言等等 均属于高级语言。

    学会编程语言各种基本语义语法后,就可以实战了,而实战场所由IDE提供。IDE(集成开发环境Integrated Development Environment)是用于提供程序开发环境的应用程序,目前IDE的种类繁多,不再敖述,只要自己用得顺手、开发效率高、你开心就好。 
    这里写图片描述

    通过IDE可快速生成程序,根据程序的生成和运行过程,程序大致可分为两类:编译型程序解释型程序

    编译型程序:程序在执行前编译成机器语言文件,运行时不需要重新翻译,直接供机器运行,该类程序执行效率高,依赖编译器,跨平台性差,如C、C++、Delphi等;

    解释型程序:程序在用编程语言编写后,不需要编译,以文本方式存储原始代码,在运行时,通过对应的解释器解释成机器码后再运行,如BasiC语言,执行时逐条读取解释每个语句,然后再执行。由此可见解释型语言每执行一句就要翻译一次,效率比较低,但是相比较编译型程序来说,优势在于跨平台性好。

    Q : Java属于编译型语言OR解释型语言?

    这里写图片描述

    Java首先将源代码通过编译器编译成.class类型文件(字节码),这是java自定义的一种类型,只能由JAVA虚拟机(JVM)识别。程序运行时JVM从.class文件中读一行解释执行一行。另外JAVA为实现跨平台,不同操作系统对应不同的JVM。从这个过程来看JAVA程序前半部分经过了编译,而后半部分又经过解析才能运行,可以说是一种混合型程序,由于该类程序运行依赖虚拟机,一些地方称其为“虚拟机语言”。下图展现各语言之间关系。

    这里写图片描述

    硬件->机器语言->汇编语言->系统语言(C和C++)->解释型语言(python)和虚拟机语言(java),语言的封装程度越来越高,也更加抽象,贴近于人类思维,即“造车前不用再考虑车轮怎么造”。同时,层次越高意味着程序在执行时经历的转化步骤越多,毕竟都要转换为机器语言才能被硬件直接运行,这也是一些高级语言无法应用在效率要求较苛刻场景的原因之一。

    Java为了对运行效率进行优化,提出“JIT (Just-In-Time Compiliation)”优化技术,中文为“即时编译”。JVM会分析Java应用程序的函数调用并且达到内部一些阀值后将这些函数编译为本地更高效的机器码,当执行中遇到这类函数,直接执行编译好的机器码,从而避免频繁翻译执行的耗时。

    重点看看C\C++语言生成程序的过程及程序是以怎样的形态存储。 
    这里写图片描述

    上图为c语言程序的生成过程,主要经过编译链接两大过程。

    编译是指编译器将源代码进行词法和语法的分析,将高级语言指令转换为汇编代码。主要包含3个步骤:

    1、预处理。正式编译前,根据已放置在文件中的预处理指令来修改源文件的内容,包含宏定义指令,条件编译指令,头文件包含指令,特殊符号替换等。

    2、编译、优化。编译程序通过词法分析和语法分析,将其翻译成等价的中间代码表示或汇编代码。

    3、目标代码生成。将上面生成的汇编代码译成目标机器指令的过程。目标文件中所存放着与源程序等效的目标的机器语言代码。

    链接是指将有关的目标文件彼此相连接生成可加载、可执行的目标文件,其核心工作是符号表解析重定位链接按照工作模式分静态动态链接两类

    静态链接:链接器将函数的代码从其所在地(目标文件或静态链接库中)拷贝到最终的可执行程序中,整个过程在程序生成时完成。静态链接库实际上是一个目标文件的集合,其中的每个文件含有库中的一个或者一组相关函数的代码,静态链接则是把相关代码拷贝到源码相关位置处参与程序的生成。

    动态链接:动态链接库在编译链接时只提供符号表和其他少量信息用于保证所有符号引用都有定义,保证编译顺利通过。程序执行时,动态链接库的全部内容将被映射到运行时相应进程的虚地址空间,根据可执行程序中记录的信息找到相应的函数地址并调用执行。

    经过编译链接后,程序生成,windows程序则都已PE文件形式存储。

    PE文件全称Portable Executable,意为可移植可执行文件,常见的EXE、DLL、OCX、SYS、COM都是PE文件。 PE文件以段的形式存储代码和相关资源数据,其中数据段和代码段是必不可少的两个段。

    Windows NT 预定义的段分别为 
    .text、.bss、.rdata、.data、.rsrc、.edata、.idata、.pdata和.debug。这些段并不是都是必须的,另外也可以根据需要定义更多的段,常见的一些加壳程序则拥有自己命名的段。

    在应用程序中最常出现的段有以下6种:

    1、执行代码段,.text命名; 
    2、数据段,.data、.rdata 命名; 
    3、资源段,.rsrc命名; 
    4、导出表,.edata命名; 
    5、导入表,.idata命名; 
    6、调试信息段,.debug命名。

    下图为一个标准的PE文件结构。

    这里写图片描述

    [NOTE] 
    到此为止,程序就诞生了,如果你对文件形态足够了解,就完全可以向网上的某些大牛一样,纯手工打造一个PE文件

    二、程序如何运行

    程序诞生后,我们就可以运行了,也就是双击程序后的事儿(本节重点描述windows平台程序)。需要说明的是,上面产生的程序文件是存储在硬盘(外存)里的二进制数据,当你双击程序后,windows系统会根据后缀名进行注册表查找相应的启动程序,这里我们编译出的是以exe后缀的可执行程序,则系统对程序进行运行。

    Q:系统如何运行可执行程序?

    系统并非在硬盘上直接运行程序,而是将其装载进内存里,包括其中的代码段、数据段等。

    Q:为什么在这会多此一举,把程序复制到内存再执行呢?

    内存直接由CPU控制,享受与CPU通信的最优带宽,然而硬盘是通过主板上的桥接芯片与CPU相连,所以速度比较慢。再加上传统机械式硬盘靠电机带动盘片转动来读写数据,磁头寻道等机械操作耗费时间,而内存条通过电路来读写数据,显然电机的转速肯定没有电的传输速度快。后来的固态硬盘则大大提升了读写速度,但是由于控制方式依旧不同于内存,读写速度任然慢于内存。

    为了程序运行速率,任何程序在运行时,都是有一个叫做“装载器”的程序先将硬盘上的数据复制到内存,然后才让CPU来处理,这个过程就是程序的装载。装载器根据程序的PE头中的各种信息,进行堆栈的申请和代码数据的映射装载,在完成所有的初始化工作后,程序从入口点地址进入,开始执行代码段的第一条指令。 


    这里写图片描述

    程序从入口点开始顺序执行,CPU直接与内存中的程序打交道,读取内存中的数据进行处理,并将结果保存到内存,除非代码段中还有保存数据到硬盘的代码,否则程序全程都不会在硬盘中存储任何数据。这就好比我们打开文档编辑器去编译文档,不管输入多少内容,在我们点击“保存”前,硬盘上的程序文件都没有变动,输入的数据都只是存储在内存上,如果此时很不幸断电了,内存上的数据会立刻丢失。为了应对这种尴尬局面,一些编辑软件会定期自动保存新数据至硬盘上,以防意外丢失数据的情况发生。

    既然程序在运行时需要加载到内存中才能运行,那么问题来了,对于目前体积越来越庞大的游戏来说,岂不是要把40~50G(可见使命召唤系列)的数据全塞进内存里。在某猫上搜索某品牌电脑,按价格排序后,某款3w RMB的移动工作站的内存也只是32G,这显然不满足一下子装载一款游戏的需求。而查看该游戏的运行配置需求,内存需求也只是几个G而已,这是怎么回事呢?

    原来,操作系统为解决此问题:当程序运行需要的空间大于内存容量时,会将内存中暂时不用的数据写回硬盘;需要时再从硬盘中读取,并将另外一部分不用的数据写入硬盘。这样,硬盘中部分空间会用于存储内存中暂时不用的数据,这一部分空间就叫做虚拟内存(Virtual Memory)。其中内存交换、内存管理等详细过程,感兴趣的同学可以查阅操作系统相关书籍。 


    这里写图片描述 

    一些同学看到这,就单纯的认为,调整虚拟内存空间即可变向提高内存空间,从而提升运行速度。硬盘的读写速度远远慢于内存,所以虚拟内存和内存频繁进行数据交换会浪费很多时间,严重影响计算机的运行速度。所以同学们还是要努力学习,早日当上高富帅白富美,换高配置电脑吧。

    这里写图片描述

    三、逆向目的和原理

    简要了解计算机程序基础知识后,我们进入【逆向工厂】的正题——逆向。

    Q:为什么要逆向?

    1、破解正版软件的授权


    这里写图片描述

    这里写图片描述

    由于一些软件采用商业化运营模式,并不开源,同时需要付费使用。为此这些软件采用各种保护技术对使用做了限制,而一些想享受免费的童鞋则对这些保护技术发起进攻,其中的主要技术便是逆向,通过逆向梳理出保护技术的运行机制,从而寻找突破口。

    2、挑战自我、学习提高

    这里写图片描述

    crackme是一些公开给别人尝试破解的小程序,制作 crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 cracker,想挑战一下其它 cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破,不管是什么目的,都是通过crackme提高了自身能力。另外, 一些互联网安全公司也会在面试中采取这种形式对应聘者进行测试。

    3、挖掘漏洞与安全性检测

    一些安全性要求较高的行业,为确保所用软件的安全,而又无法获取源码时,也需逆向还原软件的运行过程,确保软件的安全可靠。另外,挖洞高手在挖掘漏洞时,经常采用逆向手段,寻找可能存在的溢出点。病毒分析师通过逆向,分析病毒的运行机制,提取特征。

    4、还原非开源项目

    当你想模仿某优秀软件实现某功能时,发现该软件并未开源,而又很难从其他渠道获取该软件的具体技术细节,那么逆向也许会帮你敲开思想的大门。

    Q:既然逆向这么神通广大,可以解决很多问题,那么它的原理机制是什么?

    “逆向”顾名思义,就是与将源码变为可执行程序的顺序相反,将编译链接好的程序反过来恢复成“代码级别”。这里之所以用到“代码级别”一词,是因源代码编译是“不可逆”过程,无法从编译后的程序逆推出源代码。

    “逆向”通常通过工具软件对程序进行反编译,将二进制程序反编译成汇编代码,甚至可以将一些程序恢复成更为高级的伪代码状态。C\C++程序在经过编译链接后,程序为机器码,直接可供CPU使用,对于这类程序我们使用IDA、OD等逆向程序,只能将其恢复成汇编代码状态,然后通过读汇编代码来解读程序的运行过程机制,显然这对于新手来说,直接阅读汇编代码门槛较高,所以一些逆向工具提供插件可以将一些函数恢复成伪代码级别。

    这里写图片描述

    相比C\C++这一类编译运行类程序,依靠java虚拟机、.NET等运行的程序,由于所生成的字节码(供虚拟机解释运行)仍然具有高度抽象性,所以对这类程序的逆向得到的伪代码可读性更强,有时甚至接近与源代码。但是在生成字节码的过程中,变量名、函数名是丢失的,所以逆向出的伪代码中这些名称也是随机命名的,从而给代码的阅读制造的一定障碍。而对于这类易反编译的程序,为了保护软件不被逆向,通常采用代码混淆技术,打乱其中的命名,加入干扰代码来设置各种障碍。

    至此,我们把程序恢复成了可读代码,如果你仅仅依靠阅读这些代码来梳理程序运行过程,这叫做“静态调试”。与此对应的“动态调试”则是让程序运行起来,更加直观的观察程序的运行过程。经常编写程序的同学在debug时常常用到“断点”,而在动态调试中,断点起着很大的作用,否则程序将不会暂停下来让你慢慢观察各寄存器状态。

    Q:“断点”是如何工作的?


    x86系列处理器从8086开始就提供了一条专门用来支持调试的指令,即INT 3。简单地说,这条指令的目的就是使CPU中断(break)到调试器,以供调试者对执行现场进行各种分析。我们可以在想要观察的指令处设置一个断点,则程序会运行到该处后自动停下来;“单步调试”则是每条语句后面都会有INT3指令来阻断程序的运行,而这些INT3是对用户透明的,逆向工具并未将这些指令显示出来。

    这里写图片描述

    四、反汇编的多样性

    现在大多数程序是利用高级语言如C,C++,Delphi等进行编写 ,然后再经过编译链接,生成可被计算机系统直接执行的文件。不同的操作系统,不同的编程语言,反汇编出的代码大相庭径。反汇编工具如何选择?汇编代码如何分析?如何调试修改代码?这些问题都会让刚入门的新童鞋困惑。

    下面我们简单对比c++和c#程序反汇编后得到的代码: 
    图1

    图2

    图1是c++程序反汇编结果,图2为.net程序反汇编结果,两者功能都只是打印一句话。C++以push指令将字符串压入栈中,而.net以ldstr指令将字符串压入栈中,调用打印函数结束后,.net反汇编代码直接以ret指令返回结束,而c++反汇编代码先平衡完栈,再执行retn指令返回结束。

    由此可见,在反汇编过程中,我们确认好程序的编写语言和运行环境,才可选择适当的工具来反汇编程序。在分析反汇编代码时,如果熟悉高级语言的开发、运行过程及其反汇编指令,那更是事半功倍。

    五、常用的软件分析工具

    对于软件逆向分析,分为静态分析和动态分析,常用的软件如下:

    静态分析工具

    IDA Pro(Interactive Disassembler Professional )

    IDA Pro是总部位于比利时列日市(Liège)的Hex-Rayd公司的一款产品。IDA 的主要目标之一,在于呈现尽可能接近源代码的代码,而且通过派生的变量和函数名称来尽其所能地注释生成的反汇编代码,适用于三大主流操作 系统:Microsoft Windows.Mac OS X 和 Linux。IDA Pro提供了许多强大功能,例如函数的交叉引用查看、函数执行流程图及伪代码等,并且也有一定的动态调试功能。同时,IDA pro可以在windows、linux、iOS下进行二进制程序的动态调试和动态附加,支持查看程序运行内存空间,设置内存断点和硬件断点。

    IDA Pro是许多软件安全专家和黑客所青睐的“神兵利器”。

    这里写图片描述

    c32asm

    c32asm 是款非常好用的反汇编程序,具有反汇编模式和十六进制编辑模式,能跟踪exe文件的断点,也可直接修改软件内部代码 ,提供输入表、输出表、参考字符、跳转、调用、PE文件分析结果等显示 ,提供汇编语句逐字节分析功能,有助于分析花指令等干扰代码。 
    这里写图片描述

    Win32Dasm

    Win32dasm可以将应用程序静态反编译为WIN 32汇编代码,利用Win32dasm我们可以对程序进行静态分析,帮助快速找到程序的破解突破口。笔者下载的 Win32Dasm还可以附加到正在运行的进程,对进程进行动态调试,但如果原程序经过了加密变换处理或着是被EXE压缩工具压缩过,那么用Win32dasm对程序进行反汇编就没有任何意义了。 
    这里写图片描述

    VB Decompiler pro

    VB Decompiler pro是一个用来反编译VB编写的程序的工具。VB Decompiler反编译成功后,能够修改VB窗体的属性,查看函数过程等 ,VB Decompiler Pro 能反编译Visual Basic 5.0/6.0的p-code形式的EXE, DLL 或 OCX文件。对native code形式的EXE, DLL或OCX文件,VB Decompiler Pro 也能给出反编译线索。

    这里写图片描述

    还有对.net程序和delphi程序的静态反汇编分析工具,在以后的章节中会使用到,到时再详细讲解。

    动态分析工具

    Ollydbg

    Ollydbg运行在windows平台上,是 Ring 3级调试器,可以对程序进行动态调试和附加调试,支持对线程的调试同时还支持插件扩展功能, 它会分析函数过程、循环语句、选择语句、表[tables]、常量、代码中的字符串、欺骗性指令、API调用、函数中参数的数目,import表等等 ;支持调试标准动态链接库(Dlls),目前已知 OllyDbg 可以识别 2300 多个 C 和 Windows API 中的常用函数及其使用的参数,是 Ring3级功能最强大的一款动态调试工具。 
    这里写图片描述

    Windbg

    Windbg是Microsoft公司免费调试器调试集合中的GUI的调试器,支持Source和Assembly两种模式的调试。Windbg不仅可以调试应用程序,还可以 对内核进行调试。结合Microsoft的Symbol Server,可以获取系统符号文件,便于应用程序和内核的调试。Windbg支持的平台包括X86、IA64、AMD64。Windbg 安装空间小,具有图形操作界面,但其最强大的地方是有丰富的调试指令。 
    这里写图片描述

    其它对.net,delphi等程序的动态调试工具在以后的章节中介绍。

    辅助工具

    系统监视工具: 
    Wireshark (免费软件,网络监视和包分析类软件) 
    Outpost Firewall (共享软件,使用hook技术的Windows防火墙) 
    ProcExp (免费软件,强大的进程分析软件) 
    FileMon (免费软件,强大的文件读写监视软件) 
    RegMon (免费软件,强大的注册表读写监视软件)


    反保护工具:

    LordPE (Win32 PE文件修改,转存工具) 
    ImportREC (Win32 PE文件结构修复软件) 
    AIl versions ASPack unpacker (免费软件,ASPack压缩壳脱壳工具) 
    UnPECompact(免费软件,PECompact压缩壳脱壳工具) 
    UPX(自由软件,UPX压缩壳加壳和脱壳工具)


    其它:

    Hedit (共享软件,16进制编辑器) 
    PEiD (免费较件,软件信息和编写语言分析工具) 
    以上只是常用的一些程序分析工具,还有很多工具这里没有提到,有兴趣的读者可以根据自身需求查找下载。

    六、从hello world说起

    为了让大家直观地了解逆向的过程,我们就从大家最初学习编程时的hello world程序开始讲解:

    #include <stdio.h>
    
    void main() 
    
    {
    
        printf("hello world!\n");
    
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这是我们编写的打印hello world程序,是不是看起来很亲切,接下来将编译好的hello

    world程序用IDA反汇编,生成的代码如下图:

    这里写图片描述

    第一行main函数名前面的__cdecl,是C Declaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除 。还有__fastcall与__stdcall,三者都是调用约定(Calling convention),它决定以下内容:

    1、函数参数的压栈顺序 
    2、由调用者还是被调用者把参数弹出栈 
    3、产生函数修饰名的方法

    push offset Format是将参数压入栈,在这里就是讲要打印的“hello world!\n”压入栈,供printf函数使用,在反汇编程序代码中,如果调用的函数有参数,都是先将函数的参数先用push指令压入栈中,例如:add(int a,int b),调用add函数前,先将参数a和b压入栈,根据 __cdecl调用规则,先push b,再push a,最后再调用add函数。 
    call ds:printf就是调用printf函数打印“hello world“字符。 
    add esp, 4是平衡栈,平衡掉刚才压入的函数参数。 
    xor eax, eax将eax寄存器清零。 
    retn 返回,程序执行结束。

    这就是hello world程序的逆向代码分析,只是举一个简单的例子,真正要逆向分析一个较大较复杂的程序还是有一定难度,需要更多的知识与经验。

    七、Crackme

    crackme(通常简称CM)是用来测试程序设计人员的逆向工程技能的小程序。 
    KeygenMe、ReverseMe、UnpackMe,KeygenMe是要求别人做出程序对应的 keygen (序号产生器)。 
    ReverseMe 要求别人把它的算法做出逆向分析。 
    UnpackMe 是则是要求别人把它成功脱壳 。

    分析这些程序都能提高个人的程序分析能力,这些程序都有各自侧重的知识点。 
    下面就以一个验证序列号的crackme小程序作为例子进行破解,得到正确的序列号。 
    直接运行程序是这样的 
    这里写图片描述

    开始破解程序,首先用IDA打开文件 
    这里写图片描述

    在函数(Function name)窗口中看见CWinApp,CCmdTarget更类,熟悉的同学已经知道该程序使用MFC编写,结合自己的开发经验,就能猜到获取编辑框中的内容用的函数是GetDlgItemText(),定位到调用该函数的位置0×00401557。在之前有三个指令, 
    这里写图片描述

    在调用GetDlgItemText()之前有三个push指令,

    .text:00401549 push 0Ah ; int //字符串最大长度 
    .text:0040154B lea edx, [ebp+String] 
    .text:0040154E push edx ; char * //字符串缓存区 
    .text:0040154F push 3E8h ; int //指向输入框控件 
    .text:00401554 mov ecx, [ebp+var_20] ;

    注意到刚才弹框的提示内容“Incorrect try again!!”,可以在IDA字符串窗口中找到,定位到使用该字符串的位置 
    这里写图片描述

    细心的同学已经发现了,在上面loc_401585代码段处有字符串比较(lstrcmpA),比较完成后有两个分支,一个提示输入正确“Correct way to Go!!”,另一个提示输入错误 “Incorrect try again!!”,结合上面获取文本输入框内容的代码段信息可以判断,lpString2和lpString1中有一个存储正确的验证码,另一个存储输入的内容,接下来我们用两种方法让我们的验证码通过验证。

    获取正确的验证码

    在0040158D call ds:lstrcmpA处设置断点,点击Debugger->Start Process或按F9开始动态调试,在程序输入框中随便输入一串字符,实验中输入的是‘1qaz2wsx’,然后点击“Check”控件,程序停在我们设置的断点处,然后查看寄存器ecx和edx中的值,所示如下: 
    这里写图片描述

    这里写图片描述

    如图所示,ecx寄存器存放的是lpString2:‘’,edx寄存器存放的是lpString1:‘1qaz2wsx’,获得正确验证码”’”’,接下来在程序中试验一下: 
    这里写图片描述

    结果正确!

    修改二进制代码

    修改PE文件,使输入的内容显示正确。在上一小节,程序比较完lpString1和lpString2有两个分支,一个是正确输入的提示框,另一个是错误输入提示框。修改代码跳转,只要跳转到弹出“Correct way to go!!”代码段就可以了,结合代码,当两个字符串不同时会执行jnz short loc_4015AD指令,跳转到loc_4015AD代码段,将jnz指令改为jz,可在两个字符串不同时跳转到“Correct way to go!!”代码段。jnz的十六进制码为75,jz的十六进制码为74,只需将可执行程序中的75改为74就可以。

    通过IDA Pro查看十六进制文件窗口找到该跳转指令 
    这里写图片描述

    用Hedit打开程序,找到该跳转指令

    这里写图片描述

    在二进制的文件中该跳转指令在0×00001595处,而不是IDA显示的0×00401595,发生了什么?这涉及到PE文件内存映射方面的基础知识,童鞋们可查阅相关资料。

    将跳转指令75修改为74,保存修改后运行,随意输入一段字符串看运行结果: 
    这里写图片描述 
    结果正确!那么,如果输入原来程序的验证码‘’,结果会是什么?为什么会是这样?


    感谢FREEBUF网站 

    REFERENCE 
    1. 逆向工厂(一):从hello world开始 
    2. 逆向工厂(二):静态分析技术

    展开全文
  • 逆向学习篇(一)

    2018-11-21 15:18:15
    开始学习逆向了,工欲善其事,必先利其器,第一篇,先记录先od的各个功能。 这里先借用一张网上偷来的图 反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX 数据、反汇编、注释可以通过在窗口中...

    开始学习逆向了,工欲善其事,必先利其器,第一篇,先记录先od的各个功能。

    这里先借用一张网上偷来的图

    反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX 数据、反汇编、注释可以通过在窗口中右击出现的菜单 界面选项->隐藏标题 或 显示标题 来进行切换是否显示。用鼠标左键点击注释标签可以切换注释显示的方式。
    寄存器窗口:显示当前所选线程的 CPU 寄存器内容。同样点击标签 寄存器 (FPU) 可以切换显示寄存器的方式。

    信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。

    数据窗口:显示内存或文件的内容。右键菜单可用于切换显示方式。

    堆栈窗口:显示当前线程的堆栈。
    另外一个重要的选项就是调试选项,可通过菜单 选项->调试设置 来配置:

    F2:设置断点,只要在光标定位的位置(上图中灰色条)按F2键即可,再按一次F2键则会删除断点。(相当于 SoftICE 中的 F9)

    F8:单步步过。每按一次这个键执行一条反汇编窗口中的一条指令,遇到 CALL 等子程序不进入其代码。(相当于 SoftICE 中的 F10)

    F7:单步步入。功能同单步步过(F8)类似,区别是遇到 CALL 等子程序时会进入其中,进入后首先会停留在子程序的第一条指令上。(相当于 SoftICE 中的 F8)

    F4:运行到选定位置。作用就是直接运行到光标所在位置处暂停。(相当于 SoftICE 中的 F7)

    F9:运行。按下这个键如果没有设置相应断点的话,被调试的程序将直接开始运行。(相当于 SoftICE 中的 F5)

    CTR+F9:执行到返回。此命令在执行到一个 ret (返回指令)指令时暂停,常用于从系统领空返回到我们调试的程序领空。(相当于 SoftICE 中的 F12)

    ALT+F9:执行到用户代码。可用于从系统领空快速返回到我们调试的程序领空。(相当于 SoftICE 中的 F11)

    另外这里补充一下上面一排小按钮的功能:

    l 按钮-程序运行的日志、插件加载的信息查看
        e 按钮-模块信息,程序加载的所有模块、库 都可以看到路径等 双击就可以看到基地址
        m 按钮-内存信息   对于 e按钮中 的各个模块的基地址等
        t 按钮-线程信息
        w 按钮-窗口信息
        h 按钮- 一些句柄的信息
        c 按钮-反汇编窗口   或者双击 从寄存器的 EIP  shift+加号回到之前的位置
        p 按钮-记录修改信息 可以在这做还原 恢复
        k 按钮-调用堆栈
        b 按钮-断点
        r 按钮-显示参考

    另外依次说明一下这几个按钮:

    单步步入(F7),单步步过(F8),跟踪步入(ctrl+F11),跟踪步过(ctrl+F12),执行到返回(ctrl+F9),转到反汇编窗口中的地址


    上面提到的几个快捷键对于一般的调试基本上已够用了。要开始调试只需设置好断点,找到你感兴趣的代码段再按 F8 或 F7 键来一条条分析指令功能就可以了。

    展开全文
  • 任鸟飞逆向分析基础教程

    千人学习 2019-09-20 16:20:48
    本套课程为任鸟飞课程游戏逆向分析系列的入门课程,面向所有无基础的对游戏安全,对逆向分析感兴趣的学员。课程结合了C++,汇编,反外挂等元素,让你轻松走进游戏安全的大门。   逆向思路技术随笔,请关注我的...
  • 逆向教程

    千次阅读 2018-06-04 15:10:24
    再Windows上运行,都遵循PE文件格式。exe,dll,sys 1,程序从哪里开始执行 2,数据存在哪里 3,程序存在哪里 最终存储为0和1字节(BYTE):8位(两个十六进制数), WORD(字):16位, DWORD(双字):32位...
    1. 再Windows上运行,都遵循PE文件格式。
    • exe,dll,sys
          1,程序从哪里开始执行
          2,数据存在哪里

          3,程序存在哪里

              最终存储为0和1

    • 字节(BYTE):8位(两个十六进制数),     WORD(字):16位,      DWORD(双字):32位(BIT)
    • Windows操作系统存储从高位到低位 :E8 00 00 00  ——> 000000E8
    • PE查看器—>找到代码段起始地址—>找到第一个函数
    • 将16进制数转换成汇编的过程——反汇编
    • 二进制—》汇编—》C语言——逆向
    • 逻辑运算 —— 按位运算

        或( or   | )——有一则一定是一

        与( and    & )——有零则一定是一

        异或(xor  ^)——不一样的为一

        非(not   !)——1是0,0是1

        左移( << )——0010  <<  0100

    例题:CPU运行:2+3=?


    CPU只能做加法运算,存储数据的容器:CPU里---寄存器,内存条---内存(慢)

    • 32位通用寄存器:

    EAX:       累加器

    ……

    • 汇编指令:

    mov  把后面的立即数放到前面的寄存器里
    add   加数再放回
    sub   减数再放回

    • 客户端---密钥---服务器端
    • 内存:

    【编号】成为地址,

    32位计算机:寻址宽度(编号最大不能超过32位)——存储最大数据:FFFFFFFF+1  —》 4G

    (包括00000000)

    内存单位大小(内存单元)是一个字节

    内存的读写:(练习时:地址可用ESP的)


    DS(段寄存器):后面是立即数,与内存属性有关
    SS:后面是ESP/EBP
    ES:后面是EDI
    PTR:后面是地址

    LEA:取地址编号






    堆栈:ESP(栈顶),EBP(栈底)

    PUSH,POP--->(+4/-4)




    展开全文
  • Android逆向系列(一):初探Android逆向

    万次阅读 多人点赞 2019-04-16 11:00:32
    这段时间因为某些业务驱动,开始研究一些逆向相关的东西,浏览了下其所包含的大致内容,发现真是一个新大陆,跟之前耳听目染过的一些门面介绍完全不是一个层级的,真正的印证了下手难这一说法。 谨此以本文开始...

    这段时间因为某些业务驱动,开始研究一些逆向相关的东西,浏览了下其所包含的大致内容,发现真是一个新大陆,跟之前耳听目染过的一些门面介绍完全不是一个层级的,真正的印证了下手难这一说法。

        谨此以本文开始记录我的Android逆向之旅吧。
    

    总述

    习惯于应用层开发的我们都知道,在应用上架的时候都需要程序经过编译、签名 、生成一个后缀为apk的文件才能发布到应用市场,而我认识的逆向就从这个apk开始(逆向分为多种逆向,为了避免混淆概念这里的逆向暂且就特指apk的逆向)。

    工具准备

    工欲善其身,必先利其器。这句话放到逆向对工具的描述上来说再适合不过。
    这里写图片描述

    反编译代码的工具下载:

    反编译资源的工具:

    • APKTool: 本文重要工具,APK逆向工具,使用简单下载地址: http://ibotpeaches.github.io/Apktool/install/
      这里简单介绍下大概流程,首先把后缀为.apk的文件改为.zip的一个压缩文件,方便解压。dex2jar和jd-gui配套使用,用于逆向代码部分,APKTool用于逆向res文件夹下的图片布局等部分。
      .apk 修改成.zip文件解压后的目录树长这样:
      这里写图片描述
      这里也贴上源码,很简单就一个输入框和一个按钮,输入框内输入“2018”点击按钮即可跳转到另外一个界面,否则提示一个Toast “验证码错误!”,而我们要做的就是突破这个“2018”,绕过验证。
      这里写图片描述

    反编译代码部分

    需要用到的是dex2jar包里面的三个文件(当前是在windows环境下,Mac环境用对应的.sh文件):

    • d2j_invoke.bat
    • d2j-dex2jar.bat
    • lib
      将这三个文件复制到一个空的文件夹内,将刚才.apk解压后的classes.dex文件也一起复制到这里。如图:
      这里写图片描述
      Windows cmd到这个文件夹下 输入:d2j-dex2jar.bat classes.dex
      Mac 到这个文件夹下 输入:sh d2j-dex2jar.sh classes.dex
      如此之后在这个目录里会生成一个classes-dex2jar.jar文件。如图:
      这里写图片描述
      这个时候就轮到JD-GUI工具出手了,运行jd-gui.exe File–OpenFile–classes-dex2jar.jar 打开刚才生成的jar文件。就能很清晰的看到我们想要的代码了,如图。
      这里写图片描述
      对照上面发过的主要代码,已经差不离十了,对于想要代码思路的我们来说,到这里已经基本可以摸透他的逻辑了。

    反编译res资源部分

    apktool下载后会有两个文件,一个.jar(例如apktool_2.3.3.jar 需要把名字改成apktool.jar) 一个apktool.bat 。(这两个文件在这里下载,如图:)
    这里写图片描述
    同刚才一样在cmd命令下进入刚才文件夹(同样可以新建一个),连同我们刚才那个后缀为apk的安装包一起放入,输入如下命令:

    apktool d app-release.apk   此处app-release为apk名称
    

    得到一个新的app-release(对应apk名称)文件夹。流程如图:
    这里写图片描述
    这里写图片描述
    这个app-release文件夹下会得到若干文件,主要内容介绍如下:

    • AndroidManifest.xml:描述文件
    • res:资源文件
    • smail:反编译出来的所有代码,语法与java不同,类似汇编,是Android虚拟机所使用的寄存器语言

    到此我们想要的都有了。下一步就是实现我们想法的时候了。

    修改原代码逻辑

    在刚才的JD-GUI中可以看到跳转的逻辑判断如下:

     public void onClick(View paramAnonymousView)
          {
            if (MainActivity.this.code.getText().toString().trim().equals("2018"))
            {
              paramAnonymousView = new Intent(MainActivity.this, SuccessActivity.class);
              MainActivity.this.startActivity(paramAnonymousView);
              return;
            }
            Toast.makeText(MainActivity.this, "验证码错误!", 0).show();
          }
    

    我们只需要修改if后面的判断条件,设置为否即可if (!MainActivity.this.code.…),这样就成功绕过了条件约束。

    Δ 接下来还有一部很重要那就是修改smali文件,找到MainActivity$1.smali这个文件用代码查看工具打开,如图:

    这里写图片描述
    找到这个if-eqz 修改成if-nez (nez对应为非,符号“!”),到这里要修改的部分都成功了,最后一步要做的就是重新打包了。当然对smali语法感兴趣的可以到我群里索取免费的pdf资料(415974495),大家可以一起探讨学习一下。

    重新打包

    在apktool文件夹路径的cmd下输入:

    apktool b [文件夹] -o test2.apk   (test2为新apk名称,[文件夹]为对应的有修改需要打包的文件夹)
    例如:我当前就可以这样写  apktool b [F:\tools\apktool\app-release] -o test2.apk
    

    这里写图片描述
    至此,我们的目标apk文件已经生成,当然如果你想装到你自己手机上还需要重新签名一下。

    重新签名

    首先我们需要一个用于签名的.keystore文件,生成命令如下(这里我们假设生成的是demo.keystore)。

    keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore
    (cmd到apktool文件夹下跟待签名的apk放同个文件夹内便于操作)
    

    这里我们利用Java JDK提供的一个jarsigner进行签名,在刚才的cmd下继续操作,输入:

    jarsigner -verbose -keystore demo.keystore test2.apk demo.keystore
    

    这里写图片描述
    以上。我们目的apk已经可以投入使用,如果需要更快更好的体验还需要进行一次字节对齐的操作(后续分析)。

    展开全文
  • 软件逆向

    千次阅读 2018-07-15 18:50:31
    从原理到实战及工具推荐: https://blog.csdn.net/pangyemeng/article/details/69397789
  • SpringBoot+MyBatis实现逆向工程

    千次阅读 2019-05-23 19:21:48
    之前一直想要尝试一下自己动手操作一把Mybatis的逆向工程,但是因为各种原因,迟迟未实现,今天正好有空,就试了一把。在搭建的过程当中也遇到了不少的坑,现在将搭建过程和将遇到的坑记录下来,方便自己和各位共享...
  • 逆向分析学习入门教程

    万次阅读 多人点赞 2016-10-15 23:42:31
    转在于 逆向工厂(一):从hello world开始前沿从本篇起,逆向工厂带大家从程序起源讲起,领略计算机程序逆向技术,了解程序的运行机制,逆向通用技术手段和软件保护技术,更加深入地去探索逆向的魅力。一、程序如何...
  • 前言 这一篇,用到找偏移的第二个方法:界面;第四个方法:字符串;第六个方法:第三方库。目标是刷新二维码。 Duilib WX的界面模块是第三方库:Duilib。 关于Duilib的介绍和分析,已经分享了《Dump微信PC端的界面...
  • bugku的ctf逆向入门练习(入门逆向

    千次阅读 2019-08-27 10:00:16
    bugku的逆向第一题:入门逆向 下载压缩包解压后发现不能打开,先查壳: 发现无壳,载入OD后 发现一段赋值操作的代码,载入IDA,在主函数中找到这段代码: 选中每个语句按“R”转字符串,得到flag:flag{Re...
  • 关于Mybatis逆向工程的一些查询操作

    千次阅读 2018-06-02 16:50:11
    查询所有数据不带参数的可以使用:selectByExampleWithBLOBs(example)查询的数据需要按字段的排序的:example.setOrderByClause("字段名 ASC"); //升序排列,desc为降序排列。去除重复的数据:example....
  • Android逆向之博客目录导航

    千次阅读 多人点赞 2018-05-25 09:20:32
    Android逆向之 JAVA基础系列 Android逆向之Android基础系列 Android逆向之Python基础系列 Android逆向之Android进阶系列 0x01 Android逆向之Java基础 说明 java系列主要是为了复习一下java基本语法,最主要...
  • Mybatis逆向工程中生成的Example类

    万次阅读 多人点赞 2018-11-09 17:57:32
    MyBatis Generator:简称MBG,是一个专门为MyBatis框架使用者定制的代码生成器,可以快速的根据表生成对应的映射文件,接口,以及... 详细的逆向工程搭建工程见博客:https://www.cnblogs.com/HawkFalcon/p/7999...
  • 逆向学习路线(推荐书籍)

    千次阅读 2018-10-18 18:06:06
    《C++反汇编与逆向分析技术解密》;《windows编程循序渐进》《程序员密码学》 建议看的书:《0Day安全:软件漏洞分析技术》《C语言深度剖析》《windows核心编程》 必须要精通的语言:C语言,汇编语言 必须要会的语言...
  • 第一步:下载逆向助手 第二步:将apk文件拷贝到逆向助手的apktool目录,在逆向助手的apktool目录下按住shift同时点击鼠标右键,选择“在此处打开命令窗口,即CMD” 第三步:在cmd命令行中输入命令 apktool d -f ...
  • idea中逆向工程的使用

    千次阅读 2018-04-08 11:36:04
    工程已经搭建好了,就差使用逆向工程进行创建了,但是将逆向工程放到工程所在的目录中,逆向工程会直接出现在,你导入到idea中的目录中(这个目录是你的工程所在的目录,在idea中直接打开这个目录就可以将所有的...
  • PowerDesigner逆向工程导入MYSQL数据库总结 由于日常数据建模经常使用PowerDesigner,使用逆向工程能更加快速的生成模型提高效率,所以总结使用如下: 1. 安装MYSQL的ODBC驱动 Connector/ODBC 5.1.10 下载地址:...
  • 逆向工程入门

    万次阅读 多人点赞 2015-07-20 20:13:58
    本问只是为初入逆向工程大坑的新人们指出方向学习,没有实质性的技术。总的来说,基础才是最重要的。逆向工程入门应该算是所有学习方向中最难的。但是选择了这一方向的请不要放弃,一旦学成,必定会是大神级别的存在...
  • bugku的ctf逆向入门练习(逆向入门)

    千次阅读 2019-08-27 09:59:07
    bugku逆向第五题:逆向入门 下载文件后发现是一个exe的可执行文件,双击出现如下界面: 还是先查壳: 发现不是有效的pe文件,用notpad打开试试: 发现是“image/png;base64”,猜测是经过base64加密的...
  • 逆向工程中常用软件分析工具

    千次阅读 2018-10-11 15:20:35
    静态分析工: IDA Pro(Interactive Disassembler Professional) c32asm win32Dasm VB Decompiler pro 动态分析工具: Ollydbg Windbg  
1 2 3 4 5 ... 20
收藏数 155,574
精华内容 62,229
关键字:

逆向