• 标 题:菜鸟的ollydbg1.08b教学篇 (10千字)
  • 作 者:winroot
  • 时 间:2003-1-27 13:24:38
  • 链 接:http://bbs.pediy.com

写之前先说点废话(谁扔的香蕉皮,鸡蛋^^^^^^^^^^^):

  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是门操作性很大的学问,所以一定要动手,
看到好的文章一定要试一下自己就会有更深一步的体会,不要看到别人写过了就不去破了.
学习来不得半点虚假!

  • 标 题:菜鸟的ollydbg1.08b教学的增补篇 (4千字)
  • 作 者:winroot
  • 时 间:2003-1-27 13:26:36
  • 链 接:http://bbs.pediy.com

菜鸟的ollydbg1.08b教学的增补篇
+++++++++++++++++++++OllyDbg 的attach功能的使用++++++++++++++++++++++++++++++++++++
我们都知道winhex可以载内存中搜索字符,如果是明码比较,输入假的注册码
在他附近就可以找到真的注册码`~~~~~~~~~~~~~~~~~~~~~~~

当我们在使用trw和softice时我们可以不管程序的其他因素直接运行程序,输入注册名,假序列号,
然后进入trw/softice设置断点.返回windows,点注册,这时如果断点设置正确.
我们将中断在断点,然后~~~~~~~~~开始分析~~~~~~~~~~~~~
----------------------------------------------------
那么我们的OllyDbg能这样吗?开始我也以为不行,经过peterchen大哥一指点,又参考了看雪精华的文章
发现确实有这些功能!
不但有,而且非常强大!!!!!
大到我不知道该如何描述!!!!!!!(可怕吧!)
通过上面的和下面的应用概括一下:ollydbg就是适合windows各种平台使用的crack工具的合集!!!!!
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
说合集有点贬低ollydbg了应该是  crack工具合集++版


首先介绍一下在文件菜单下的attach(附加)

这是OllyDbg说明书上的一段关于attach的话
  你可以使用 OllyDbg 的attach在正在运行的程序.
  选择FILE|attach并且在列表中选择正在运行的程序
  注意:不要试图attach系统的进程,那样的话会导致系统崩溃
(  说实话,一般情况下,操作系统不会让你去attach敏感的进程)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
首先我们来演示winhex的功能:
先运行Flash转换解密,然后运行ollydbg,点击文件菜单下的attach(附加)
出现一个窗口,选择Flash转换解密的进程,选attach(附加),这个时候你要等6-8秒钟,
等他完全加载后,再右键Analyse Code(分析代码),这时再点运行,回到程序
进入注册画面,随便输入名字点获得id,输入假的注册码,按“确定”,跳出错误画面。
返回ollydbg,点暂停,然后我们进入view(查看)菜单的memory(内存),出现一个窗口,
点选这个窗口右键选择,serch for-binary string(搜索2进制字符),在ascii框内输入你刚才输入的假注册码,点ok

等吧~~一会,他将在弹出个窗口找到你的假注册码,你向下找大概在00D05D64(这是我的电脑的地址)的地方
找到真的注册码,他正和ID在一块聊天呢~:-)

呵呵~~看到了吧,他比WINHEX怎么样?~~~
#####################################################################
下面演示如何找到未脱壳程序的关键

1 开始和前面一样 先运行Flash转换解密,然后运行ollydbg,点击文件菜单下的attach(附加)
出现一个窗口,选择Flash转换解密的进程,选attach(附加),这个时候你要等6-8秒钟,
等他完全加载后,再右键Analyse Code(分析代码),这时再点运行,回到程序
进入注册画面,随便输入名字点获得id,输入假的注册码,按“确定”,跳出错误画面

2.进入olldbg,按ALT+M,在memory map窗口,选中Flash转换解密的code段,右键选中dump in cpu(在cpu中转存)
4.在cpu窗口的memory(内存)窗口,search for binary string(搜索2进制字符),在ASCII处键入“注册码错误”,search后发现了


004D1314  A3 A1 D0 BB D0 BB C4 FA  !谢谢您
004D131C  CA B9 D3 C3 B1 BE C8 ED  使用本软
004D1324  BC FE A3 A1 0D 0D B3 CC  件!..程
004D132C  D0 F2 D0 E8 D2 AA D6 D8  序需要重
004D1334  D0 C2 C6 F4 B6 AF A3 AC  新启动,
004D133C  C7 EB B5 E3 BB F7 A1 B0  请点击“
004D1344  C8 B7 B6 A8 A1 B1 B0 B4  确定”按
004D134C  C5 A5 A3 A1 00 00 00 00  钮!....
004D1354  D7 A2 B2 E1 C2 EB B4 ED  注册码错
004D135C  CE F3 A3 AC C7 EB D6 D8  误,请重
004D1364  D0 C2 CA E4 C8 EB        新输入

5.在选中处右击,选find refrence(搜索参考),只有一个结果,双击后,在dissamble(汇编)窗口可以见到如下代码

004D11EC  |. A1 107A4D00    MOV EAX,DWORD PTR DS:[4D7A10]
004D11F1  |. 8B00          MOV EAX,DWORD PTR DS:[EAX]
004D11F3  |. E8 4493F7FF    CALL FLASH转?0044A53C:[
004D11F8  |. A1 107A4D00    MOV EAX,DWORD PTR DS:[4D7A10]
004D11FD  |. 8B00          MOV EAX,DWORD PTR DS:[EAX]
004D11FF  |. E8 9492F7FF    CALL FLASH转?0044A498:[
004D1204  |> 8BC3          MOV EAX,EBX
004D1206  |. E8 D51BF3FF    CALL FLASH转?00402DE0
004D120B  |. EB 34          JMP SHORT FLASH转?004D1241
004D120D  |> 6A 00          PUSH 0                      //还记得这个死亡路口吗?
004D120F  |. B9 74124D00    MOV ECX,FLASH转?004D1274
004D1214  |. BA 54134D00    MOV EDX,FLASH转?004D1354c


小结:
1,首先这个软件加壳了,我们不去管他,而直接找到它的参考,继而轻松的找到关键,
  是别的软件很难达到的!
2技巧总是在实践中产生.熟练的使用ollydbg能起到事半功倍的效果
  我(菜鸟)写这篇短文是想起到抛砖引玉的效果~

                                                                                    winroot
                                                                                    2003,1,27