请选择 进入手机版 | 继续访问电脑版

应天论坛

 找回密码
 参与我们

QQ登录

只需一步,快速开始

搜索
查看: 3748|回复: 3

OD破解常用 分享下

[复制链接]

276

主题

303

帖子

3187

积分

管理员

湘南小侠客

Rank: 9Rank: 9Rank: 9

积分
3187

优质服务勋章论坛元老

QQ
发表于 2018-5-27 20:33:58 | 显示全部楼层 |阅读模式
一、概论
  
  壳出于程序作者想对程序资源压缩、注册保护的目的,把壳分为压缩壳和加密壳两种
  
  顾名思义,压缩壳只是为了减小程序体积对资源进行压缩,加密壳是程序输入表等等进行加密保护。当然加密壳的保护能力要强得多!
  
  二、常见脱壳方法
   
   预备知识
  
  1.PUSHAD (压栈) 代表程序的入口点,
  2.POPAD (出栈) 代表程序的出口点,与PUSHAD想对应,一般找到这个OEP就在附近
  3.OEP:程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP/FOEP),只要我们找到程序真正的OEP,就可以立刻脱壳。
  
  方法一:单步跟踪法
  1.用OD载入,点“不分析代码!”
  2.单步向下跟踪F8,实现向下的跳。也就是说向上的跳不让其实现!(通过F4)
  3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点——>运行到所选)
  4.绿色线条表示跳转没实现,不用理会,红色线条表示跳转已经实现!
  5.如果刚载入程序,在附近就有一个CALL的,我们就F7跟进去,不然程序很容易跑飞,这样很快就能到程序的OEP
  6.在跟踪的时候,如果运行到某个CALL程序就运行的,就在这个CALL中F7进入
  7.一般有很大的跳转(大跨段),比如 jmp XXXXXX 或者 JE XXXXXX 或者有RETN的一般很快就会到程序的OEP。
  
  Btw:在有些壳无法向下跟踪的时候,我们可以在附近找到没有实现的大跳转,右键-->“跟随”,然后F2下断,Shift+F9运行停在“跟随”的位置,再取消断点,继续F8单步跟踪。一般情况下可以轻松到达OEP!
   
  方法二:ESP定律法
  ESP定理脱壳(ESP在OD的寄存器中,我们只要在命令行下ESP的硬件访问断点,就会一下来到程序的OEP了!)
  1.开始就点F8,注意观察OD右上角的寄存器中ESP有没突现(变成红色)。(这只是一般情况下,更确切的说我们选择的ESP值是关键句之后的第一个ESP值)
  2.在命令行下:dd XXXXXXXX(指在当前代码中的ESP地址,或者是hr XXXXXXXX),按回车!
  3.选中下断的地址,断点--->硬件访--->WORD断点。
  4.按一下F9运行程序,直接来到了跳转处,按下F8,到达程序OEP。
  
  方法三:内存镜像法
  1:用OD打开软件!
  2:点击选项——调试选项——异常,把里面的忽略全部√上!CTRL+F2重载下程序!
  3:按ALT+M,打开内存镜象,找到程序的第一个.rsrc.按F2下断点,然后按SHIFT+F9运行到断点,接着再按ALT+M,打开内存镜象,找到程序的第一个.rsrc.上面的.CODE(也就是00401000处),按F2下断点!然后按SHIFT+F9(或者是在没异常情况下按F9),直接到达程序OEP!
  
  
  方法四:一步到达OEP
  1.开始按Ctrl+F,输入:popad(只适合少数壳,包括UPX,ASPACK壳),然后按下F2,F9运行到此处
  2.来到大跳转处,点下F8,到达OEP!
  
  方法五:最后一次异常法
  1:用OD打开软件
  2:点击选项——调试选项——异常,把里面的√全部去掉!CTRL+F2重载下程序
  3:一开始程序就是一个跳转,在这里我们按SHIFT+F9,直到程序运行,记下从开始按SHIFT+F9到程序运行的次数m!
  4:CTRL+F2重载程序,按SHIFT+F9(这次按的次数为程序运行的次数m-1次)
  5:在OD的右下角我们看见有一个"SE 句柄",这时我们按CTRL+G,输入SE 句柄前的地址!
  6:按F2下断点!然后按SHIFT+F9来到断点处!
  7:去掉断点,按F8慢慢向下走!
  8:到达程序的OEP!
  
  比如说第一次是按10下SHIFT+F9..然后程序就跑起来了..
  
  接着呢..我们从载入程序然后按9下SHIFT+F9
  
  大家都知道按10下程序就跑起来了..所以说9下程序是不可能跑的..
  
  
  
  
  方法六:模拟跟踪法
  1:先试运行,跟踪一下程序,看有没有SEH暗桩之类
  2:ALT+M打开内存镜像,找到(包含=SFX,imports,relocations)
  
  内存镜像,项目 30
  地址=0054B000
  大小=00002000 (8192.)
  Owner=check    00400000
  区段=.aspack
  包含=SFX,imports,relocations
  类型=Imag 01001002
  访问=R
  初始访问=RWE
   
  3:地址为0054B000,如是我们在命令行输入tc eip<0054B000,回车,正在跟踪ing。。
  
  Btw:大家在使用这个方法的时候,要理解他是要在怎么样的情况下才可以使用
  
  方法七:“SFX”法
  1:设置OD,忽略所有异常,也就是说异常选项卡里面都打上勾
  2:切换到SFX选项卡,选择“字节模式跟踪实际入口(速度非常慢)”,确定。
  3:重载程序(如果跳出是否“压缩代码?”选择“否”,OD直接到达OEP)
  
  
  cmp a,b 比较a与b
  mov a,b 把b的值送给a
  ret 返回主程序
  nop 无作用,英文“no operation”的简写,意思是“do nothing”(机器码90)***机器码的含义参看上面
  (解释:ultraedit打开编辑exe文件时你看到90,等同于汇编语句nop)
  call 调用子程序
  je 或jz 若相等则跳(机器码74 或0F84)
  jne或jnz 若不相等则跳(机器码75或0F85)
  jmp 无条件跳(机器码EB)
  jb 若小于则跳
  ja 若大于则跳
  jg 若大于则跳
  jge 若大于等于则跳
  jl 若小于则跳
  jle 若小于等于则跳
  pop 出栈
  push 压栈
  
  74=>75 74=>90 74=>EB
  75=>74 75=>90 75=>EB
  jnz->nop
  75->90(相应的机器码修改)
  jnz -> jmp
  75 -> EB(相应的机器码修改)
  jnz -> jz
  75->74 (正常) 0F 85 -> 0F 84(特殊情况下,有时,相应的机器码修改)
  
  一条(跳)就死,九筒(90)就胡   (对应上面的2.修改为nop)
  一条(跳)就胡,一饼(EB)伺候   (对应上面的1.修改为jmp)
  妻死(74)便妻无(75)
  爸死(84)便爸无(85)


希望大家互相学习学习,发现现在大家对于破解都不是很了解,很多人想学破解,但是去无从入手,所以在BCG小组大家的商议下,决定为大家写一个破解入门的教程,希望能大家了解破解有一些帮助,希望能有更多的人踏入破解的大门。
  1.初级,修改程序,用ultraedit等工具修改exe文件,称暴力破解,简称爆破
  中级,追出软件的注册码
  高级,写出注册机
  2.常用破解工具
  (1)侦壳工具:PEID
  (2)动静结合的OllyDbg引领破解工具的新潮流。
  一,现在我们首先来学习下破解的初步,爆破~
  1.侦壳
  要破解一个软件首先要做的就是侦壳,要侦壳就要对壳有一定的了解,众所周知,软件作者用编程语言编写好软件后,是将它编译成扩展名为EXE的可执行文件。编译为EXE的目的有两点:
  (1)有一些版权信息需要保护起来,不能让别人随意改动,如作者的姓名、软件名称等;
  (2)需要给程序“减肥”,从而方便存储、使用和网上传输。
  为了编译,会用到一些软件。它们能将可执行文件压缩和对信息加密(图1),实现上述两个功能,这些软件称为加壳软件。为软件加上的东东就称为“壳”。加壳软件不同于一般的WinZIP、WinRAR等打包类压缩软件。加壳软件是压缩可执行文件的,压缩后的文件可以直接运行。
   最常见的加壳软件有3个:ASPACK 、UPX、PEcompact。毕竟它们是主流,据统计,用它们加壳的软件约占市面所有软件的90%!其他不常用的加壳软件有ASPROTECT、PETITE 、NEOLITE、TELOCK等。软件最常见的编程语言是Delphi,Visual Basic(简称VB),Visual C++(简称VC)。了解些编程的知识,会让破解更加轻车熟路。
  下面来说侦壳,现在比较常用侦壳软件就PeiD,他具有华丽的图形界面。外壳整合(添加到鼠标右键)功能令使用更加方便,支持拖放操作。配置时,务请将“扩展到鼠标右键”打上对号。
  其使用方法是,鼠标点住XX.exe,按鼠标右键,选"使用PEid扫描"即可;“壳”的信息就显示在底部。
   2.破解工具OD。
  关于OD的介绍我把他放到附件里了,这个是看雪论坛的介绍,是比较全面的,至少我觉得比我写的要好,所以大家根据他可以很好的了解OD。
  3.爆破实例。
  爆破是破解的初步,所谓爆破,就是指通过修改可执行文件的源文件,来达到相应的目的。你不明白?呵呵,举个例子好了,比如说某共享软件,它比较用户输入的注册码,如果用户输入的,跟它通过用户名(或其它)算出来的注册码相等的话(也就是说用户输入的注册码正确了),那么它就会跳到注册成功的地方去,否则就跳到出错的地方去。
  明白过来了吧,我们只要找到这个跳转指令,把它修改为我们需要的"造型",这样,我们是不是就可以为所欲为了?
  一,破解时常用的汇编指令如下,汇编较弱者可先强行背住,以后就可慢慢理解了。
  cmp a,b //比较a与b
  mov a,b //把b的值送给a,使a=b
  ret //返回主程序
  nop //无作用,英文"no operation"的简写,意思是"do nothing"(机器码90) (解释:ultraedit打开编辑exe文件时看到90,等同于汇编语句nop)
  call //调用子程序,子程序以ret结尾
  je 或jz //若相等则跳(机器码74 或0F84)
  jne或jnz //若不相等则跳(机器码75或0F85)
  jmp //无条件跳(机器码EB)
  jb //若小于则跳
  ja //若大于则跳
  jg //若大于则跳
  jge //若大于等于则跳
  jl //若小于则跳
  jle //若小于等于则跳
  pop xx //xx出栈
  push xx //xx压栈
  更为详细的指令请查阅汇编书籍。
  4.破解常见修改,参看表1。
  汇编指令修改 相应的机器码修改(通过16进制编辑器实现)
  jnz/jne->nop 75->90
  jnz/jne -> jmp 75-> EB
  jz/je->nop 74->90
  jz/je -> jmp 74-> EB
  jnz -> jz 75->74 或 0F 85 -> 0F 84
  jz -> jnz 74->75 或 0F 84 -> 0F 85
  jnz -> jz 75->74 或 0F 85 -> 0F 84
  je-> jne 74->75 或 0F 84 -> 0F 85
  表1 破解常见修改
  (1)修改为jmp(其示意图见图6)
  je(jne,jz,jnz) =>jmp相应的机器码为EB (意思是出错信息向上找到的第一个跳转),jmp的作用是绝对跳,无条件跳,从而跳过下面的出错信息。例如:
  xxxxxxxxxxxx 出错信息,如注册码不对,sorry,未注册版不成功,“Function Not Avaible in Demo”,“Command Not Avaible”或 “Can't save in Shareware/Demo”等,我们希望把它跳过,不让它出现。
  ……
  xxxxxxxxxxxx 正确路线所在,直接跳转到这里。
   (图6)
  (2)修改为nop(其示意图见图7)
  je(jne,jz,jnz) =>nop相应的机器码90 (正确信息向上找到的第一个跳转),nop的作用是抹掉这个跳转,使这个跳转无效,失去作用,从而使程序顺利来到紧跟其后的正确信息处。例如:
  xxxxxxxxxxxx 正确信息,如注册成功,谢谢您的支持等,我们希望它不被跳过,让它出现,所以程序一定要顺利来到这里,不能跳转。在OD中,我们一般是把不需要设置NOP,只是把JE或者JNZ改为JNZ或者JE即可,也就是把相等则跳改为不相等则跳,或者不相等则跳改为相等则跳,把跳转过程相反,达到更改程序流程的目的。
  ……
  xxxxxxxxxxxx 出错信息,我们希望不要跳到这里,不让它出现!
   (图7)
  二,如何快速确定暴破物。
  1,确定目标有没有加壳。没有最好了,有的话看是不是常见壳,可不可以用现有脱壳软件快速脱掉。搞不定的话,暂时放弃它。“我吃定你了!”,不要这样,老兄。不就是一壳么,不要和他一般见识。记着,你今天的重点是爆破。不要主次不分、本末倒置,这也是初学者最易犯的错误。
  这方面,我用PEID。它可以整合到资源菜单,非常方便。
  2,确定用什么语言编写。我的经验是,DELPHI的程序结构清晰、紧凑,最好分析。其次是VC,BC,ASM,比较难的是VB,要有一定的经验才可搞定一两个。
  2,在反汇编文件中找到可疑点。
  经典语句自不用说,比如,“恭喜”,“注册成功”,“注册码错误”“无效的注册码”,“Thank You","Sorry"...找到后,一般向上不远处就可看到条件转移语句JZ、JNZ、JLE什么的。
  事实上,只有极少极少的软件只修改注册判断就OK的。所以我们要把更多的注意力转到其它的可疑点。如未注册标识,过期警告,次数标识,NAG对话框...,熟练使用各种工具的搜索功能是基本功之一。找到后再向上不远处找条件转移语句。
  三,如何暴破。
  当你找准爆破点后,你会发现有很多种爆破的方法都可以达目的。
  1,修改转移语句。
  我一般这样改:
  不需要跳,我就把JNE改为JE或者把JE改为JNZ
  需要跳,我就把JE或者JNZ改为JMP。
  这可避免万一你有正确的注册码反而会出错的事情发生。
  下面的附件我做了一个关于爆破的视频教程,希望对大家理解爆破有帮助。
  4.动态追踪破解技巧-破解经典句式
  以下是经典的比较组合,常常是注册码的出现处,所以被称为破解经典句式。
  (1)
  mov eax,[ ] //这里可以是地址,也可以是其他寄存器或mov eax [ ]。
  mov edx,[ ] //同上,通常这两个地址就储存着重要信息或者可以是pop edx。
  call XXXXXXXX //关键call。
  test eax,eax //eax为标志位。
  jz(jnz)或 jne(je) //关键跳转。
  (2)
  mov eax,[ ] //这里可以是地址,也可以是其他寄存器。
  mov edx,[ ] //或是pop edx,通常该地址就储存着重要信息。
  call XXXXXXXX //关键call。
  jne(je) //关键跳转。
  (3)
  mov eax,[ ] //这里可以是地址,也可以是其他寄存器
  mov edx,[ ] //同上,通常储存着重要信息
  cmp eax,edx //关键比较。
  jnz(jz) //关键跳转。




OD破解软件
2007-08-20 23:03

大家好,我是散人,这几天我上网大概看了一下,爱好者论坛的内容真的应有尽有,不知道应该写什么了,所以我想了一晚上终于想到了还是教你们些破解知识吧!我想对大家来说都很有用吧!我将会一直坚持下去保证课堂质量,有不会的可以提出来问我,尽量解答(呵呵!我也是鸟嘛!)废话不多说!支持我的就往下看吧!
先教大家一些基础知识,学习破解其实是要和程序打交道的,汇编是破解程序的必备知识,但有可能部分朋友都没有学习过汇编语言,所以我就在这里叫大家一些简单实用的破解语句吧!
----------------------------------------------------------------------------------------------------------------
语句:cmp??? a,b????????? //cmp是比较的意思
!在这里假如a=1,b=2 那么就是a与b比较大小.
????????mova,b????????? //mov是赋值语句,把b的值赋给a.
????????je/jz?????????????? //就是相等就到指定位置(也叫跳转).
????????jne/jnz????????? //不相等就到指定位置.
????????jmp???????????? //无条件跳转.
????????jl/jb??????????? //若小于就跳.
????????ja/jg???????? //若大于就跳.
????????jge????????? //若大于等于就跳.
----------------------------------------------------------------------------------------------------------------------
这些都是我们在以后的课程中会经常遇到的语句,应该记住它们,接下来我们在讲讲破解工具的使用:
我们破解或给软件脱壳最常用的软件就是OD全名叫ODbyDYK界面如图1
它是一个功能很强大的工具,左上角是cpu窗口,分别是地址,机器码,汇编代码,注释;注释添加方便,而且还能即时显示函数的调用结果,返回值.
右上角是寄存器窗口,但不仅仅反映寄存器的状况,还有好多东东;双击即可改变Eflag的值,对于寄存器,指令执行后发生改变的