写之前先说点废话(谁扔的香蕉皮,鸡蛋^^^^^^^^^^^):
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教学篇 (10千字)
- 作 者:winroot
- 时 间:2003-1-27 13:24:38
- 链 接:http://bbs.pediy.com