您的位置:首页网络冲浪防范措施 → ollydbg1.08b教学篇

ollydbg1.08b教学篇

时间:2004/10/8 16:36:00来源:本站整理作者:蓝点我要评论(0)

    ollydbg是个功能强大的软件,以前我也不用他(不习惯),而且很多经典教程都是用trw和softice作为示例工具写的. 
初学者(注:和我一样的人)往往一开始就接触这些工具,做练习也就用这些工具!可以说已经上手了! 
对ollydbg的动态调试功能也就陌生了! 

现在一个很现实的问题让我改变了习惯,我的键盘鼠标是usb的,显示器也给我作对!trw和softice都用不成! 
无奈只好学用ollydbg.发现这个东西实在太好了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
*动态调试的时候还能听歌聊天泡MM(TRW,SOFTICE只能对黑屏) 
*调试方便,又有函数参考,可以随意加注释,轻松复制,清楚看到堆栈的变化^^^^^^^ 
*界面优美,可以随意设置背景颜色! 
*有强大的右键功能,使用起来特别方便!(特别适合老人小孩使用~~~~) 
*说不出来了~~~其他的优点你自己去发掘吧!!! 
我是一只大菜鸟,接触破没多长时间,脑子也不怎么灵光,水平低得可怜,说的不对的地方请高手指正!!! 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~OLLYDBG简介~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
现在就让我这只菜鸟给菜鸟们介绍一下: 
1*工作界面:(我们从上往下看) 

看到标题栏,菜单栏和工具栏(不用让我做名词解释了吧!) 
  记住:工具栏的所有功能都能在菜单栏里找到,工具栏是菜单栏的快捷按钮(废话!) 
    各项详细功能我们在下面说! 
  再往下看有四个窗口他们是代码窗(左上),寄存器窗口(右上),内存窗口(左下)和堆栈窗口(右下) 

2*菜单栏各项命令功能 
*文件(F)----这些命令用说吗? 
        |____注意**该菜单的下部有你上次打开的纪录,该纪录保存有你上次未清除的断点**注意** 


*查看(V)------这个菜单我只介绍一下我常用的,别的我不会!:-) 
        |____执行模块(快捷键ALT+E):查看该程序使用的动态连接库(我的理解) 
        |        
        |____断点(快捷键ALT+B):这个是查看你所有的断点,(有时自己设到哪里都忘了,可以看一下)起到一个辅助功能. 
        我就会这么多!:-( 


*调试(D)-------这个菜单是关键,不明白你就别调试软件了!也只说常用的! 
        |_______运行(F9)加载程序后,运行! 
        |  
        |_______暂停(F12) 
        | 
        |_______单步进入(F7)遇见CALL就进!进入该子程!行话:"跟进去" 
        | 
        |______单步跳过(F8)遇见CALL不进去!不去管子程的内部!第一次粗跟的时候常用! 
        | 
        |______执行到返回(ALT+F9)就是执行到该子程的返回语句! 

剩下的菜单不重要~我也不费口舌了~~~我是"天下第一懒"(乾隆皇帝赐给我的名号) 
知道这么多就能开工了~~ 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~实例分析~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
目标:FlashPT 2.1 Build 3067 
破解人:winroot 
工具:PEiD,W32DASM,ASPACKDIE,OLLYDBG 
目的:一篇ollydbg的教程,软件相对简单! 
下载地址:http://www.softreg.com.cn/shareware_view.asp?id=/4C7E305E-226A-43B9-98D2-BE0410D46806/ 


~~~~~~~~~~~~~~~~~~~~~~~~~~~~破解过程~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
破解过程: 
该软件安装后有3各组件随便注册哪一个都一样. 
我选择Flash转换解密 

1*PEiD查壳,ASPack 2.12 -> Alexey Solodovnikov 
2*使用ASPACKDIE脱壳.脱壳后文件名为unpacked.exe 
3*使用W32DASM反编译进行静态分析! 
  加载unpacked.exe-->反编译-->点菜单栏的"参考"选择字符串数据参考 
找到"注册码错误,请重新输入!"双击我们来到 
* Referenced by a (U)nconditional or (C)onditional Jump at Address: 
|:004D1174(C) 
|  ~~~~~~~~~~~~~~~~~~~~是从这里跳过来的,我们就到这里看看 
:004D120D 6A00                    push 00000000 

* Possible StringData Ref from Code Obj ->"提示" 
                                  | 
:004D120F B974124D00              mov ecx, 004D1274 

* Possible StringData Ref from Code Obj ->"注册码错误,请重新输入!" 

#######################我们来到了004D1174############################# 
:004D116B 8B55E4                  mov edx, dword ptr [ebp-1C] 
:004D116E 58                      pop eax 
:004D116F E8C42CF3FF              call 00403E38 
:004D1174 0F8593000000            jne 004D120D                看到了吧!就是从这里我们走向了死亡! 
~~~~~~~~~~~~~~~~~~~~~~            ~~~~~~~~~~~~ 
:004D117A B201                    mov dl, 01 
:004D117C A1DCCA4400              mov eax, dword ptr [0044CADC] 
:004D1181 E856BAF7FF              call 0044CBDC 
:004D1186 8BD8                    mov ebx, eax 
:004D1188 BA02000080              mov edx, 80000002 
:004D118D 8BC3                    mov eax, ebx 
:004D118F E8E8BAF7FF              call 0044CC7C 
:004D1194 B101                    mov cl, 01 

* Possible StringData Ref from Code Obj ->"software\microsoft\windows\currentversion\chan" 
                                        ->"gid" 
                                  | 
:004D1196 BA98124D00              mov edx, 004D1298 
:004D119B 8BC3                    mov eax, ebx 
:004D119D E83EBBF7FF              call 0044CCE0 
:004D11A2 84C0                    test al, al 
:004D11A4 745E                    je 004D1204 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~省略部分代码 

* Possible StringData Ref from Code Obj ->"提示" 
                                  | 
:004D11E2 B974124D00              mov ecx, 004D1274 

* Possible StringData Ref from Code Obj ->"注册成功!谢谢您使用本软件! 

程序需要重新启动" 

~~~~~~~~~~~~~~~~~~~~~~~~~~*****爆破******~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
爆破就是爆着破:-) 
看一下我们的分析: 
:004D1174 0F8593000000            jne 004D120D                看到了吧!就是从这里我们走向了死亡! 
那我们就不走这里了!他jne我们就改成je 

*开工!!!!!!!!!!! 
*首先,运行ollydbg加载脱壳后的unpacked.exe找到地址004D1174 
004D1174    0F85 93000000  JNZ UNPACKED.004D120D 

咦!!!!!!!怎么变成jnz了?(我也不知道为什么)但他与爆破无关!我们把他改成jz就能起到一样的效果 
1)我们双击这里: JNZ UNPACKED.004D120D是改变它的汇编代码___________________注{ 
2)我们把他改成JZ 004D120D 点汇编后,他就变红了 再点取消!                    { 
3)然后右键单击JZ 004D120D选择"复制到可执行文件"                            {双击地址栏是绝对地址和相对地址的转换 
4)这时弹出一个窗口最上面就是000D1174  0F84 93000000    JE 000D120D        { 例如:我们双击004D1174 就会变成$ ==> 
我们再右键单击JE 000D120D选择"保存文件"                                    { 双击机器码栏就是设这个地址为断点 
5)输入你设想的文件名就可以了                                                {例如:双击0F85 93000000我们可以看到变红了 
6)运行,呵呵!!已注册!                                                        {说明我们已经把004D1174设置为断点再双击就恢复 
                                              

~~~~~~~~~~~~~~~~~~~~~~~~~***爆破结束***~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
经过上面的过程 
如果你觉得不过瘾就到注册表HKEY_LOCAL_MACHINE\software\microsoft\windows\currentversion\changid 
删除该键的键值(如果已注册没注册就不用了) 
我们继续这次我们要动态分析了~~ 
################################动态分析################################### 
动态分析的前提就是静态分析,我们回过头看一下静态分析的结果 
:004D116B 8B55E4                  mov edx, dword ptr [ebp-1C] 
:004D116E 58                      pop eax 
:004D116F E8C42CF3FF              call 00403E38        //这个是比较的call 
:004D1174 0F8593000000            jne 004D120D 

那么我们就在004D116B设置断点吧~~~ 
F2或者双击机器码栏设置断点---F9(运行)--输入用户名winroot,获取ID,ID号码4835812338,点击注册, 
程序被OLLYDBG拦截, 
乖乖~~ 
你猜我们看见了什么!!!!一串数字耶!!!3230027325再往右下看堆栈窗口一行ID号码4835812338,一行3230027325 
你看他那张脸,长得都像注册码~~~ 
退出来试一下~~~你快看我的脸  :-) 
呵呵~~~~成功~~~ 
内存注册机你就自己作吧~锻炼一下! 

################################################################## 
破的还不过瘾~~~~~~~~!!! 
怎么办? 
crack的宗旨就是制作出keygen 
下面我们就来试一下, 
首先还的分析~~通过上面的动态分析我们知道序列号的生成肯定在004D116B上面的某一段程序, 
~如何确定只有跟踪,看注册码最新一次是在哪个地方出现! 
所以我们再向上看的时候发现了一个循环!非常可疑,下断点跟踪! 
(ollydbg会把循环标出来!) 
004D10EA  |. C745 F0 000000>MOV DWORD PTR SS:[EBP-10],0 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~F2或者双击机器码栏设置断点- 
--F9(运行)--输入用户名winroot,获取ID,ID号码4835812338,点击注册,程序被OLLYDBG拦截. 
我们按F8(单步跳过)一下一下地执行,注意观察寄存器和堆栈的变化!! 
004D10F1  |. C745 F4 000000>MOV DWORD PTR SS:[EBP-C],0 
004D10F8  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4] 
004D10FB  |. E8 282CF3FF    CALL UNPACKED.00403D28 
004D1100  |. 8BF0          MOV ESI,EAX 
004D1102  |. 85F6          TEST ESI,ESI 
004D1104  |. 7E 2D          JLE SHORT UNPACKED.004D1133 
004D1106  |. BB 01000000    MOV EBX,1                  //计数器 
004D110B  |> 8B45 FC        /MOV EAX,DWORD PTR SS:[EBP-4]//取id字符串 
004D110E  |. 807C18 FF 00  |CMP BYTE PTR DS:[EAX+EBX-1],0 
004D1113  |. 74 1A          |JE SHORT UNPACKED.004D112F  //是零就跳! 
004D1115  |. 8B45 FC        |MOV EAX,DWORD PTR SS:[EBP-4]//EAX=STR 
004D1118  |. 8A4418 FF      |MOV AL,BYTE PTR DS:[EAX+EBX-1]//AL=STR[EBX-1] 
004D111C  |. 25 FF000000    |AND EAX,0FF 
004D1121  |. 33D2          |XOR EDX,EDX 
004D1123  |. 0345 F0        |ADD EAX,DWORD PTR SS:[EBP-10]//和第一次的值相加 
004D1126  |. 1355 F4        |ADC EDX,DWORD PTR SS:[EBP-C] 
004D1129  |. 8945 F0        |MOV DWORD PTR SS:[EBP-10],EAX//存进去 
004D112C  |. 8955 F4        |MOV DWORD PTR SS:[EBP-C],EDX 
004D112F  |> 43            |INC EBX//计数器加1 
004D1130  |. 4E            |DEC ESI 
004D1131  |.^75 D8          \JNZ SHORT UNPACKED.004D110B//循环取累加和 
004D1133  |> 6A 00          PUSH 0                    
004D1135  |. 68 F1E05D00    PUSH 5DE0F1                  //入栈 
004D113A  |. 8B45 F0        MOV EAX,DWORD PTR SS:[EBP-10]//取序列号的累加和 
004D113D  |. 8B55 F4        MOV EDX,DWORD PTR SS:[EBP-C] 
004D1140  |. E8 874FF3FF    CALL UNPACKED.004060CC        //累加和*0x5DE0F1 
004D1145  |. 8945 F0        MOV DWORD PTR SS:[EBP-10],EAX 
004D1148  |. 8955 F4        MOV DWORD PTR SS:[EBP-C],EDX 
004D114B  |. 8D55 E8        LEA EDX,DWORD PTR SS:[EBP-18] 
004D114E  |. 8B87 F8020000  MOV EAX,DWORD PTR DS:[EDI+2F8] 
004D1154  |. E8 B7D3FBFF    CALL UNPACKED.0048E510        //变成10进制--真序列号 
004D1159  |. 8B45 E8        MOV EAX,DWORD PTR SS:[EBP-18] //取假序列号的字符串 
004D115C  |. 50            PUSH EAX 
004D115D  |. FF75 F4        PUSH DWORD PTR SS:[EBP-C]                 /Arg2;返回值 
004D1160  |. FF75 F0        PUSH DWORD PTR SS:[EBP-10]               |Arg1;序列号 
004D1163  |. 8D45 E4        LEA EAX,DWORD PTR SS:[EBP-1C]             | 
004D1166  |. E8 0574F3FF    CALL UNPACKED.00408570                   \UNPACKED.00408570 
004D116B  |. 8B55 E4        MOV EDX,DWORD PTR SS:[EBP-1C] 
004D116E  |. 58            POP EAX 
004D116F  |. E8 C42CF3FF    CALL UNPACKED.00403E38//比较 
004D1174  |. 0F85 93000000  JNZ UNPACKED.004D120D//跳出错误 

注意:所有的注释都是你跟踪以后根据寄存器和堆栈的变化得出的!也不是在一次跟踪中得出的,是跟踪了多次后得出的结论! 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 


结论:我们可以看出序列号是这样产生的,ID的每一位的ASCII值的累加和再和0x5DE0F1相乘得出的值转化为10进制形成序列号~~ 
所以 
name:winroot 
id:4835812338 
ser=[(0x34+0x38+0x33+0x35+0x38+0x31+0x32+0x33+0x33+0x38)*0x5DE0F1]  =[C0864E3D]  =[3230027325] 
                                                                  16          16            10 
简单吧~~ 
希望我们菜鸟群能出几个高手~~能写出来最好的教程,不像我这样~~贻误他人~ 

菜鸟心得: 
crack是门操作性很大的学问,所以一定要动手, 
看到好的文章一定要试一下自己就会有更深一步的体会,不要看到别人写过了就不去破了. 
学习来不得半点虚假!

OllyDbg实用技巧六则

1、让跳转路径显示出来 
    打开Options\Debugging Option。弹出Debugging Option对话框,选择CPU页,选定 
“Show direction to jumps”、“Show jump path”和“Show grayed path if jump is 
not taken”。如此以来在Disassembler窗口就会显示跳转的路径了。 

2、让OD显示MFC42.DLL中的函数 
    如果程序是用MFC进行的动态编译,那么在OD中将只能显示MFC42.DLL中的函数为: 
00410E40  |.  E8 43000000  CALL     
1576是函数在MFC42.DLL中的序号。打开Debug\Select import libraries,单击弹出的对话 
框中“Add”,在弹出的打开文件对话框中选择“MFC42.LIB”并打开,重新载入MFC程序, 
你就可以看见函数名称变为: 
00410E40  |.  E8 43000000  CALL     
IDA中分析出了来的东西一样了!呵呵,以后不用等待IDA的“细嚼慢咽”也可以轻松搞定 
MFC程序了。其他的DLL类似,如果有序号,可以在VC的LIB目录中找到相关的.LIB文件,加 
到OD中便可。如果你没有“MFC42.DLL”,你可以的到新论坛的下载区找,我已经上传到那 
里了。 

3、让OD轻松躲过“ANTI-DEBUG” 
    很多“ANTI-DEBUG”的程序都是在程序开始时来检查是否安装调试器的。用这种特性我 
们可以轻松的用OD的“Attach”绕过检查部分。如“X语言”,如果你哟内TRW2K/S-ICE/OD 
直接加载它的话,程序回警告你安装了调试器并结束。但是我们在“X语言”开启后再运行 
OD,并用“Attach”系上它就就可以了,轻松通过检查。而且在OD系上它后仍然可以用 
CTRL+A进行分析。如此一来,快哉!:) 

4、轻松对付调用“MessageBoxA”以及类似的模态对话框的程序 
    很多人都认为OD不好拦截“MessageBoxA”这类API函数。其实我们有个很简单的办法将 
API拦截下来,并且快速找到比较地点/主算法地点。首先用OD加载目标程序,如果不能加载, 
用上面的方法“Attach”目标程序。然后,F9运行目标程序,并且有意让目标程序显示“ 
MessageBox”,然后切换到OD中,F12暂停,如 
0041201F  |>  53            PUSH    EBX                     /Style 
00412020  |.  57            PUSH    EDI                     |Title 
00412021  |.  FF75 08      PUSH    [ARG.1]                 |Text 
00412024  |.  FF75 F4      PUSH    [LOCAL.3]               |hOwner 
00412027  |.  FF15 A8534100 CALL    DWORD PTR DS:[4153A8]   \MessageBoxA 
0041202D  |.  85F6          TEST    ESI, ESI               停在此处 
0041202F  |.  8BF8          MOV    EDI, EAX 
00412031  |.  74 05        JE      SHORT 1551-CRA.00412038 
F8单步一下,切换到“MessageBox”中,确认,被OD中断。我们可以看见上面的代码41201F 
处有一个“〉”,说明可以从某段代码跳转到此处,我们选择41201F这一行,在 
“Information”栏看见一句“JUMP FROM 412003”,右键单击,选择“GO TO JUMP FROM 
412003”。回到412003,一般都是条件跳转,上面的内容就是比较的地方啦。:) 

5、使用OD的TRACK功能 
    OD拥有强大的TRACK功能,在分析算法时十分有用。首先我们要设定OD的TRACK缓冲区大 
小,选择Option\Debugging Option,在弹出的对话框中选择TRACK页, 
“Size of run track buffer(byte/record)”,缓冲区大小,当然约大约好。其他的设置 
在我以前的OLLYDBG.INI中都已经设置好了。然后,开启目标程序,在DEBUG中选择“Open 
or clear run track”。然后我们就可以用CTRL+F11或CTRL+F12开启“Track into”和“ 
Track over”了。当我们暂停程序的时候,可以用小键盘上的“+”,“-”,“*”来控制 
TRACK功能了。 
“Track into”和运行类似,但是记录所有指令以及寄存器变化。并且会自动进入所有的 
CALL中。 
“Track over”和“Track into”类似,但是不进入CALL 
“+”用来显示TRACK缓冲区中的下一条指令 
“-”用来显示TRACK缓冲区中的上一条指令 
“*”用来发返回当前指令 

6、不是技巧的技巧 
    当你遇到花指令的时候一定会很头痛。但是如果你用OD进行分析的时候就会轻松得多。 
OD会自动标识出无效指令,即花指令。如果OD没有正确识别,你还可以用CTRL+↑/↓来单个 
字节的移动。可以很有效的识别出花指令的所在。 

相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么

文章评论
发表评论

热门文章 没有查询到任何记录。

最新文章 防止DdoS攻击:通过路解析卡巴斯基特色之漏 网站被sql注入的修复方法Ubuntu破解Windows和防护的三种方法防黑客qq改密码技巧如何保证Foxmail泄露邮箱密码安全

人气排行 路由器被劫持怎么办?路由器DNS被黑客篡改怎防止DdoS攻击:通过路由器绕过DDoS防御攻击如何彻底清除电脑病毒?如何使用无忧隐藏无线路由防蹭网办法车模兽兽激情视频下载暗藏木马使用四款防黑客软件的体会怎么防止木马入侵