志在指尖
用双手敲打未来

反编译exe(怎样反编译一个exe文件)

反编译exe

反编译exe文件基本上是不可能的,因为反编译过程由很多因素会干扰,反编译过程:
1、检测程序时候加壳了,如果加壳就必须先去壳。
2、去壳后需要猜测程序员采用的是什么编程语言,编程语言有:java/c/c++/c#/vb/VC++等等。
3、猜测到程序员使用的语言后根据编程语言进行汇编,汇编需要考虑到语言中的语法问题,即使是同种语言,一种命令有多种说法,汇编成功率在20%左右。
4、汇编成功后基本就已经到反编译的顶端了,要从汇编程序翻译成源码可能性为1%。exe

怎样反编译一个exe文件

“反编译技能”关于黑客学习进程中,是从一个初级到高档进阶进程的必学技能,前期咱们了解根底知识,了解运用脚本或许东西仅仅初级阶段学习,从小白到入门的进程,可是假如想成为一名真正含义的黑客,必定要学习”反编译技能”!为什么这么说?
“手把手”教你怎样运用“反编译技能”破解一个程序!?
由于黑客技能便是对计算机体系和网络的缺陷和缝隙的发现,以及针对这些缺陷施行进犯的技能。这儿说的缺陷,包括软件缺陷、硬件缺陷、网络协议缺陷、办理缺陷和人为的失误。而这儿的软件缺陷剖析,或许缝隙的开掘就需求用到”反编译技能”和逆向剖析技能,而目前黑客从事网络协议缺陷,硬件缺陷的研讨相对老练。而软件则不同,品种繁多,依托的体系架构又各不相同,软件又是直接与事务使用休戚相关,所以软件的缺陷、缝隙、优化、破解等需求,都需求用到”反编译技能。所以假如你想成为一名真正含义的黑客,这个技能必定要学习!
今日就以本篇文章的内容详细给咱们阐述一下”反编译技能原理与完结”!
一、什么是”反编译”?
反编译,又称为逆向编译技能,是指将可履行文件变成高档言语源程序的进程。反编译技能依赖于编译技能,是编译进程的逆进程。
那什么是编译技能?
编译技能便是把高档言语变成可履行文件的进程。它的首要进程如下所示:
“手把手”教你怎样运用“反编译技能”破解一个程序!
编译程序把一个源程序翻译成方针程序的作业进程分为五个阶段:词法剖析;语法剖析;语义查看和中心代码生成;代码优化;方针代码生成。
词法剖析的任务是对由字符组成的单词进行处理,从左至右逐一字符地对源程序进行扫描,发生一个个的单词符号,把作为字符串的源程序改造成为单词符号串的中心程序。
语法剖析以单词符号作为输入,剖析单词符号串是否形成符合语法规则的语法单位,如表达式、赋值、循环等,最终看是否构成一个符合要求的程序。
语义剖析是查看源程序有无语义过错,为代码生成阶段搜集类型信息。中心代码是源程序的一种内部表明,或称中心言语。
中心代码的作用是可使编译程序的结构在逻辑上更为简略明确,特别是可使方针代码的优化比较简略完结。代码优化是指对程序进行多种等价改换,使得从改换后的程序动身,能生成更有用的方针代码。
方针代码生成是编译的最终一个阶段。方针代码生成器把语法剖析后或优化后的中心代码改换成方针代码。
关于反编译技能,咱们上文说到,它是编译的逆进程。那是不是把上述的六个步骤倒置,就变成了反编译的进程了呢?显然是不对的。关于反编译进程,咱们能够这么去了解:咱们的源程序现在是二进制可履行文件或许汇编指令,咱们的方针程序是某种特定的高档言语。那么现在这个进程该怎样转化呢?这其间的中心代码的生成是否和编译进程中的相同呢?
依据上述原理及其疑问,咱们很简略便采用这种思维:将特定的机器代码,即咱们的”源程序”,先翻译为初级的中心代码,然后再依据特定的高档言语将中心代码翻译为高档程序。没错,反编译的首要思维确实便是那样:反编译器也有前端和后端。前端是一个机器依赖的模块,句法剖析二进制程序、剖析其指令的语义、而且生成该程序的初级中心表明法和每一子程序的操控流向图。通用的反编译机器是一个与言语和机器无关的模块,剖析初级中心代码,将它转化成对任何高档言语都可接受的高档表明法,而且剖析操控流向图的结构、把它们转化成用高档操控结构表现的图。最终,后端是一个方针言语依赖的模块,生成方针言语代码。反编译的进程中要运用一些东西:把二进制程序装入内存,对这一程序做句法剖析或反汇编,以及反编译或许剖析该程序来生成高档言语程序。这个进程凭借编译器和库的签名来辨认特定的编译器和库子程序。只需在二进制程序中辨认出编译器签名,就不去反编译这些编译器启动代码(start-up)和库子程序:关于前者,从最终的方针程序去掉启动代码的那些例程,反编译器从主(main)程序进口点开端剖析;关于后者,那些子程序用其库函数名替代。
所以咱们能够采用下图来表明反编译的进程:
“手把手”教你怎样运用“反编译技能”破解一个程序!
上图是咱们关于反编译进程的初级构想(依照咱们的了解),而实际的更为详细的进程则如下所示:
“手把手”教你怎样运用“反编译技能”破解一个程序!
咱们再对上述各个进程做一下更为详细的介绍:
1语法剖析:语法剖析程序或语法剖析器把源程序的字节组织成源机器言语的语法短语(或句子)。这些短语用一个语法剖析树表明。语法剖析器的首要问题是确定哪些是数据和哪些是指令。
2语义剖析:语义剖析阶段查看源程序一组指令的语义含义,搜集类型信息而且向整个子程序传递这个类型。关于任何一个编译器生成的二进制程序,只需程序能运转,其机器言语的语义必定是正确的。没见过哪一个二进制程序是由于编译器生成代码的过错而不能运转。因此,除非语法剖析器对某一条指令做了不正确的剖析或许把指令当作数据剖析,不然,在源程序中是不会有语义过错的。
3中心代码生成:反编译器剖析程序需求一个中心表明法来明晰地表现源程序。它有必要简略从源程序中生成,而且还有必要适合用来表明方针言语。
4操控流图生成:源程序中每一个子程序的操控流图也是为反编译器剖析程序所必需的。这个表明法适合用来确定在程序中的高档操控结构。它也被用来清除去由于机器言语的条件跳转有偏移量限制因而被编译器发生的中心跳转。
5数据流剖析:数据流剖析阶段试图改进中心代码,以便能够得到高档言语表达式。在这个剖析期间,临时寄存器的运用和条件标志被清除去,由于在高档言语里面没有这些概念。
6操控流剖析器阶段试图将程序每一个子程序的操控流图组织成一个高档言语结构的类集(通有的)。这个类集有必要包括大多数言语都有的操控指令。
7代码生成:反编译器的最终阶段是在操控流图和每一个子程序中心代码的根底上生成方针高档言语代码。为一切的局部栈、参数和寄存器变量标识符挑选变量名称。也为在程序中呈现的各个例程指定各自的子程序名称。
二、反编译与反汇编的区别
许多人把反编译和反汇编了解为同一含义,其实仍是有所不同的!
反汇编:一般是只对编译器依据高档言语生成的本机二进制可直接在芯片上履行的机器码”解析”为人类可读的汇编形式的代码(实际上最最前期的计算机操作员具有直接阅览机器码和运用机器码编程的才能,不需求转化为汇编形式,这是计算机遍及,程序规划也爆炸性增大后,人们就有需求转化为汇编代码来读懂机器码程序),前期的反汇编目的是编译器生产商用来查看编译器生成代码的性能。当今首要在得不到源代码的情况下,研讨剖析其他人的程序。
反编译原理:通常,编写程序是运用高档言语如C,pascal等高档言语进行编程的,然后再经过编译程序生成能够被计算机体系直接履行的文件(机器言语)。反汇编即是指将这些履行文件反编译还原成汇编言语或其他高档言语。但通常反编译出来的程序与原程序会存在些许不同,虽然履行作用相同,但程序代码会发生很大的改变,要读懂反汇编需求有扎实的高档言语编写功底和汇编功底。
反汇编实际属于反编译,反编译就包括各种言语从初级或中心级言语到高档言语的解析。如:.NET平台的C#就可由中心言语MSIL反编译成C#,Java平台的就可由.class中的Java字节码反编译为Java代码后有其它的dex虚拟机的字节码,自定义的虚拟机字节码等等
总言之,反汇编属于反编译的一个分支,反编译是完结逆向编程的必经步骤这些都属于IT界的”逆向工程”范畴。
二者的区别:反汇编仅仅是运用一些反汇编软件把程序从机器码翻译成汇编句子,而反编译不只要做完反汇编的作业,还要在此根底上彻底了解这些汇编代码是什么意思,准确的说是这些代码能够完结什么功用,然后用自己了解的言语写出功用相似(不或许和原作者的代码完全相同)的代码或软件。
三、用实例了解“怎样运用反编译技能破解一个程序”
实例一、破解需求注册的软件
咱们有时在运用一些小东西软件时,会提示购买License(注册码之类的东东)后才能正常运用。在这儿咱们来尝试直接绕过License验证直接运用软件,完结简略的软件破解。
首要完结办法:
经过反编译东西,反编译出软件源码。
剖析源码,找到License验证方位。
修正反编译代码。
重现编译生成修正后软件源码。
编写License验证demo代码:
Demo程序首要逻辑:登陆界面(Lgoin.cs)验证License信息。假如验证成功显示主窗体(MainWIndow.cs)功用界面,正常运用其软件功用。
破解Demo程序
依据demo程序逻辑剖析,只需把License验证代码删去或修正即可。
办法1:ILDASM
详细运用办法参阅之前编写博客《C#ILDASM运用》。缺陷:经过ildasm.exe反编译出的代码为IL中心言语,想读懂和修正需对IL中心言语有必定根底。
办法2:Reflector
.NETReflector东西本身不带修正dll和exe功用,需下载插件:Reflexil(Reflexil.Reflector.AIO.dll)。
Reflexil插件装置办法:Tools–>Add-Ins…–>+点击”+”,挑选下载好的Reflexil插件路径。点击”Close”封闭窗体。
运用.NETReflector东西翻开需反编译代码,剖析需求修正代码方位。
只需删去”if(!this.License(kay,text))”判别代码。
敞开Reflexil插件:tools–>”Reflexil**”
Reflexil插件会将你挑选的办法(Mothed)生成IL中心言语。对剖析需求删去的代码找到对应IL中心言语所在方位,进行删去。
最终保存修正后的EXE进行从头运转。^-^…简略的破解作业已完结…^-^
从Reflexil插件菜单上能够看出,他还有许多功用,比如:注入类,注入接口,注入枚举..等。仍是很强壮的一款插件。
缺陷:Reflector东西需收费。
办法3:ILSpy
ILSyp东西只用四个字形容:简略,粗暴。比较有用。直接运用ILSyp东西翻开需反编译exe或dll,然后”SaveCode”保存为VS能直接翻开的项目。修正代码后从头编译生成exe或dll进行运转。
经过SaveCode保存的项目,运用VS可直接编译修正代码。
实例二、AndroidAPK反编译
1.反编译东西
ApkTool:将apk文件反编译成smali文件和资源文件等,生成一个文件夹,相同,也能够将这个文件夹生成apk文件。
dex2jar:把dex文件转成jar文件
jd-gui:将jar文件转化成java代码,能够更好的阅览代码
2.预备作业
咱们预备一个反编译所需求的apk文件,这儿我自己写了一个
“手把手”教你怎样运用“反编译技能”破解一个程序!
登录功用一般是使用的进口,假如咱们没有用户名和暗码就进不去。
看到这儿,咱们或许想笔者必定是想经过反编译来完结绕过登录功用。
今日要点要介绍的是怎样经过反编译在这个登录页面增加一个View并完结相应的功用。附带内容:
·反编译完结更换使用图标
·反编译完结增加资源文件
·反编译完结增加View并完结点击事情
·反编译完结修正功用
·用ApkTool东西从头打包使用
3.反编译完结替换使用图标
1)经过apkTool东西将apk反编译生成一个文件夹。
进入cmd下切换到apktool目录下,输入apktool.batdD:\apkTool\test.apk,会在apktool目录下生成一个test文件夹,如下是test文件夹的内容:(res:资源文件、smali:跟汇编相似的机器代码,假如需求增加四大组件,则需在AndroidManifest.xml下增加声明)
“手把手”教你怎样运用“反编译技能”破解一个程序!
2).在生成的这个目录里找到res文件夹,进去后你会发现跟咱们eclipse或as工程下的res文件夹结构相同,然后在对应目录下将使用图标换掉即可。(注意:图片格局必定要和原图片格局相同,不然会有莫名的过错)
4.反编译完结增加资源文件
比如咱们想在strings.xml下增加一个字符串并在代码中引证,咱们或许就说这个简略呐,在strings.xml里加上一个字符串声明,然后在smali文件中引证就好了,然后编译成smali文件时分,啪,报错了,打包成apk不成功,那么正确的做法是什么呢?
1).在res/values/strings.xml里增加一个字符串,如下:
2).在res/values目录下找到一个public.xml文件翻开,找到最终一个String类型的一条,如下图一所示,它的id为0x7f060024,这些id是体系主动生成的,那么咱们增加一个字符串就需求在这儿手动生成一个id而且这个要仅有,默许在最终一个string的id加1就行,如下图二所示:(注意:name要和strings.xml声明的name共同)
3).在smali文件夹下依据包名去找到R文件,如下图一,其间R$string.smali的美元符号表明内部类的意思。在string.smali文件里增加一条,如图二。
5.反编译完结增加View并完结点击事情
如咱们想在登录界面增加一个注册按钮,那该怎样增加呢?
1).在res/layout/activity_main.xml里增加一个按钮,如下:
2).在res/values/ids.xml里增加声明,如下:
3).在res/values/public.xml里找到最终一条id的条目,增加一条记录,而且id要仅有,如下:
4).在smali文件夹里依据包名找到R文件,在R的id.smali文件下增加声明,如下图,到此一切的预备都做完了,下面便是修正smali文件增加这个注册按钮的点击事情。
6.在smali文件夹里依据包名找到MainActivity.smali文件,翻开它,然后查找onCreate,如下图一,咱们能够看到findViewById这个字眼,咱们能够跟着写,对新加的按钮设置文字,如下图二,在这儿,必定要注意寄存器的运用,一不小心就出错了,假如不懂smali语法的,能够回头看一下smali语法整理
设置完文字后,接着就能够开端设置注册按钮的功用了,如下图,这儿点击事情是直接跳转另外一个页面,MainActivity$1是一个内部类,onclicklistener的完结类。
7.反编译完结修正功用
假如咱们想绕过登录直接进入使用,那么此时咱们必定想到去改登录逻辑,翻开MainActivity.smali文件,查找setOnclickListener,能够看到便是登录按钮设置的点击事情,可是登录的逻辑呢?在MainActivity$1.smali文件中,找到onClick办法中关键部分,笔者加上了注释,如下图:
那么我只需把跳转的逻辑搬到cond_0那里就ok了,咱们试试:
8.用ApkTool东西从头打包使用
上面都是在修正资源文件,修正smali文件,咱们改完怎样看作用呢?这个时分,就需求用强壮的ApkTool东西从头打包使用了,在cmd下进入ApkTool目录,输入:apktool.batb-fD:\apkTool\test(D:\apkTool\test这个目录是之前反编译生成的目录),假如咱们修正没问题的话,就会在test目录下生成一个文件夹dist,在该文件夹里便是反编译后生成的apk文件。
此时,总算反编译完结了!
可是这时生成的apk仍是不能用的,由于这是裸包,还没签名,体系是不会让你装的。
那么咱们开端签名吧,怎样签名呢?相同仍是用ApkTool东西,在cmd下进入ApkTool目录,输入:jarsigner-verbose-keystore签名文件路径-signedjar签名后apk的路径未签名apk的路径签名别名,如下图:
签名完结后,咱们装置已签名的apk,看看运转成果,是不是达到了自己想要的作用。
到此,smali反编译办法就完结了!

未经允许不得转载:IT技术网站 » 反编译exe(怎样反编译一个exe文件)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载