手揣网教程/杀毒教程/内容

ollydbg1.08b教学篇

杀毒教程2024-06-15 阅读
[摘要]ollydbg是个功能强大的软件,以前我也不用他(不习惯),而且很多经典教程都是用trw和softice作为示例工具写的. 初学者(注:和我一样的人)往往一开始就接触这些工具,做练习也就用这些工具!...

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    <JMP.&MFC42.#1576> 
1576是函数在MFC42.DLL中的序号。打开Debug\Select import libraries,单击弹出的对话 
框中“Add”,在弹出的打开文件对话框中选择“MFC42.LIB”并打开,重新载入MFC程序, 
你就可以看见函数名称变为: 
00410E40   .  E8 43000000  CALL    <JMP.&MFC42.#1576_?AfxWinMain@@Y> 
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+↑/↓来单个 
字节的移动。可以很有效的识别出花指令的所在。 


网络的神奇作用吸引着越来越多的用户加入其中,正因如此,网络的承受能力也面临着越来越严峻的考验―从硬件上、软件上、所用标准上......,各项技术都需要适时应势,对应发展,这正是网络迅速走向进步的催化剂。

……

相关阅读