[摘要]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+↑/↓来单个
字节的移动。可以很有效的识别出花指令的所在。
网络的神奇作用吸引着越来越多的用户加入其中,正因如此,网络的承受能力也面临着越来越严峻的考验―从硬件上、软件上、所用标准上......,各项技术都需要适时应势,对应发展,这正是网络迅速走向进步的催化剂。
……