设为首页收藏本站喵玉殿官方微博

喵玉殿论坛 · 喵玉汉化组

 找回密码
 少女注册中
搜索
查看: 23488|回复: 14

[教程图书] 新手向OD教程

  [复制链接]
发表于 2010-12-4 21:06:58 | 显示全部楼层 |阅读模式
本帖最后由 十二 于 2010-12-19 13:36 编辑

以下教程有部分转摘。
OD,又叫,OllyDebug,是一个动态追踪工具

未命名.jpg 图1
上图是OD的界面
说正文之前得先了解PE文件也就是.exe的可执行文件。
用LordPE打开一个PE文件。

未命名.jpg 图2
可以看到PE头的一些信息

点击区段:

未命名.jpg 图3

能看到很多数据段,有些像winrar的目录。
.text 代码段
.rdata 输入表
.data 数据段
.rsrc 资源段
这是标准PE的区段表,有些PE往往没有这种规范的标识
比如 .tls
在名称后面可以看到voffset vsize roffset rsize
voffset 相对虚拟偏移量用来表示PE被映射到内存中区段所在的位置
vsize 同上虚拟size
roffset 物理地址右键-16进制编辑器可以看到。
rsize 物理大小

回到图2:入口点:此处是当一个PE 被 loader 时所开始执行的RVA
镜像基址;一般PE文件的默认基址 0x400000可以改变成别的但是如果程序里面有直接寻址改变基址程序会挂掉。
*入口点+基址=PE在内存中真正起始的执行位置。此处又叫OEP
镜像大小:所有区段大小的和。
代码基址:同入口点一样。基址+代码=程序在内存中的代码段
数据基址:同上

块对齐:即PE被映射到内存后以此为分割,如果块对为200,如果被映射的部分不足200,则用0填充不足部分。
文件对齐:同上只不过是对应物理文件本身。


点击目录:
可以看到一些PE的结构

QQ截图未命名.png 图4
输出表:一般而言PE文件没有,存在于DLL中,可以导出函数供其他程序使用
*输入表:PE文件载入后需要使用的函数基本上全在这里
IAT:地址表,相当于函数的指针
剩余的都不是那么重要。
点击输入表后面的.可以看到导入的函数

QQ截图未命名.png 图5
勾选 总是查看FirstThunk
OriginalFirstThunk:RVA用来描述一个函数,可有可无
*FirstThunk:指向IAT的指针


说说OD 如图1所示

反汇编窗口:得到指定内存的反汇编的结果,在此窗口下得到的所有数据都将被解释成汇编指令。
寄存器窗口:http://baike.baidu.com/view/6159.htm
信息窗口:用来显示改变寄存器后的数据
数据窗口:得到指定内存的,ASCII或UNICODE编码文本和16进制代码,还有其他格式可以选择。
堆栈窗口:用来传递函数的参数,可以Alt+M查看栈的大小。支持ASCII或UNICODE编码查看
CMDBAR:兼容于softice指令

Alt+M-打开查看内存窗口
Alt+C-打开CPU窗口
Alt+E-查看载入模块
Alt+L-查看记录
Alt+F2-关闭调试文件
Alt+B-查看断点
F12-暂停
F9-运行程序
! F8-步过(遇CALL不进入内部)执行到CALL的下一句指令
! F7-步入(遇CALL进入内部)
! F4-执行到光标所在位置
F5-最大化当前激活的窗口
! F2-下软断点
! 空格-汇编光标所在位置
F3-打开文件
Ctrl+F2-重新调试

Ctrl+F9-执行到RETN返回,相当于执行到CALL的尾部
Alt+F9-返回到程序领空
Ctrl+T-RUN跟踪条件

Alt+D-H-硬件断点
Alt+V-W-查看窗口句柄
Alt+V-H-查看所有句柄

以上是一些快捷方式 ! 表示需要在反汇编窗口才能使用

F3打开图2 所示的程序

图6
程序停在0x400000+59A4上
Alt+E,可以看到PE调用的模块信息
2.png 图7
图7大部分模块和图5中的输入表对应,有些程序会调用loadlibrary和getprocaddress来调用输入表中没有的函数和模块。
Alt+M,可以看到所有区段被加载到了内存
1.png 图8
属主:被映射到内存的模块名称。
区段:该模块所有的区段信息。
*一个PE被加载到内存后会将所有需要的DLL loader到该PE空间。
不要被那么多区段迷惑。属主可以告诉你,该区段是哪个模块的。

双击PE文件头,可以看到详细的PE头信息
有兴趣可以参考PE文件示意图来了解PE头信息。

图片太大下载出来看吧

下面的代码段、数据段、输入表段以此类推可以双击查看
回到图6 看一下界面,反汇编窗口就不在熬述了,可以下断点、重新汇编一个位置。
数据窗口右键可以选择查看的方式、有ASCII或UNICODE编码、浮点、反汇编、Long型、short型。 可以下内存断点、硬件断点、但是不能下int 3 软断点。
堆栈窗口:没没什么好说的,右键有很多功能,字面上都能理解。

*说说寄存器窗口:EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI。这些是通用寄存器,下面有ES、ES、CS、SS、DS、FS、GS。这些在实模式下是段寄存器用来帮助寻址但是在保护模式下它变成了选择子。在实模式下如果要访问一个栈需要SS×16+BP+位移量,也就是EBP的低16位。但是保护模式下对内存采取了分页的机制,拥有了段描述符GDT,当用段寄存器寻址时,段寄存器便会指向一个base=0,G=1,Limit=0FFFFFH的GDT描述符可以用冰刃保存GDT表然后看到此信息,这样就PE就得到了一个寻址范围是4GB的空间。这种方式使得每个进程都有一个相对独立的4GB线性可寻址范围。只要你愿意你可以SS:[eax] 只要eax指向了正确的栈址。

说调试之前请先下载此附件: 汇编速查手册.rar (10.43 KB, 下载次数: 970)


附件整合了SSE4、MMX、浮点、8088的指令集涵盖了大部分的汇编指令。

回到图6

PUSH 60 把0x0000060入栈,这时ESP-4  0012FFC4变为0012FFC0(ESP是永远指向栈顶的)至于为什么减4 因为压入的数据是32bit的。8bit为一个字节,32bit就是4个字节。
PUSH tls.0040DE48 ESP-4压入0040DE48,所以不能修改图2中镜像基址,修改后会导致这条指令报废而挂掉整个程序。
*CALL tls.00406948 CALL这句指令会改变程序的流程,这里OD有两种处理方式,一种是F7跟进去CALL内部单步执行,一种是F8用OD代理执行一遍CALL内部然后停在CALL后面的指令。CALL在执行的前会把004059B0 这个地址压入栈,用作返回。  如果CALL内部对栈进行过操作比如PUSH EAX那么在CALL即将返回的时候需要POP EAX来保持栈的平衡,否者返回RETN的时候由于ESP指向的栈顶返回值是错误导致程序报废,RETN 立即数并不能修复这种错误。RETN 立即数是在返回后才对栈进行操作的。

MOV EDI,94 EDI的赋值,去看附件中的MOV。
MOV EAX,EDI 同上

CALL tls.00405440   CALL的调用
MOV DWORD PTR SS:[EBP-18],ESP  SS:[EBP]访问整个栈并把结果指向栈顶
MOV ESI,ESP ESP送ESI
MOV DWORD PTR DS:[ESI],EDI 保存94到EBP-18所在的地址
PUSH ESI                                   ; /pVersionInformation 压入GetVersionExA的参数
CALL DWORD PTR DS:[<&KERNEL32.GetVersionEx>; \GetVersionExA 调用GetVersionExA,获取当前系统版本,这里如果F7则跳入KERNEL32.dll领空中执行,这么做是没必要的因为没必要跟踪系统DLL,除非你想知道,该函数的内部结构。
OD的标题栏很容易看到所在的领空如果发现跑到了系统领空可以Alt+F9返回到程序领空继续调试

F8步过CALL DWORD PTR DS:[<&KERNEL32.GetVersionEx>; \GetVersionExA 后函数的返回值一般会返回给EAX


断点是调试器的核心,断点就是指在你可以在你感兴趣的地方断下然后继续分析,这样做可以省去大量的F8 F7。

断点有4中、软中断、硬件中断、内存读写断点、条件断点。



软中断也叫int3 断点,此断点容易被检测但是好处就是可以设无数个。当用OD F2给一条指令下F2断点时,此句指令会被改写成INt3&#160;&#160;可以用lordpe DUMP出来看

发生中断时INT3异常被抛出OD捕获到消息后暂停程序,修改回前指令。

在CMDBAR中输入bp 函数名即可在函数内部下int3断点

硬件断点, 在寄存器窗口右键可以查看调试寄存器。断点被执行后DR01-DR07 可以看到被记录的断点。

内存断点,此断点不会准确的断下会自动分配4096字节,在此字节内都会被保护

F3-打开th123.exe。就说FXTZ的那个部分解包吧- =

http://bbs.nyasama.com/viewthread.php?tid=350&extra=page%3D1

QQ截图未命名.png OEP 008133B2 > $&#160;&#160;E8 A99B0000&#160; &#160;CALL th123.0081CF60

入口点是个CALL F7 跟进 PUSH EBP 典型的vc或delphi程序,可以看到很多子程都PUSH EBP至于为什么百度吧(用作参数的传递)往下面看能到到几个函数,GetCurrentProcessId、GetCurrentThreadId,获取进程ID和线程ID。

F8步过GetCurrentProcessId函数双击EAX寄存器,有符号十进制就是该进程的PID号

还有几个函数可以自己去百度找该函数的原型,手头有MSDN更好。

后面不看了- =直接Ctrl+F9执行到RETN,F8步过结束这个CALL子程。回到OEP入口的下一条指令,停在JMP处。

这里不必一步一步跟在CMDBAR处直接下你感兴趣的断点即可比如&#160;&#160;bp CreateFileA文件操作管道、bp ReadFile读取文件、bp SetFilePointer移动文件指针。F9执行即可断下,这些函数百度都有原型

但是有些情况这么下断会很糟糕一个程序可能CreateFile上百个文件。这时候需要bp CreateFileA,[[esp+4]]=="th123a.dat" 这样当打开th123a.dat的时候OD会帮你断下来。

至于为什么ESP+4因为所有参数入栈后,最后一个参数往往在栈顶,CreateFile的最后一个参数是FileName指向要打开的文件名,然后CALL子程,CALL子程会占用4个字节把返回地址压入栈同时ESP-4 --- PUSH(压入栈的)任何东西都要占用4字节如果多个PUSH则是ESP-4的倍数。因为esp永远指

向栈顶

所以ESP+4正好,能得到FileName从而OD判断是否断下。 标准写法是[string [ESP+4]=="th123a.dat" 因为是ASCII函数 如果是UNICODE函数则[UNICODE [ESP+4]=="th123a.dat"

很多函数分A、和W两个版本 比如CreateFile 这个函数就有两个版本CreateFileA和CreateFileW。 A代表ASCII,W代表UNICODE。

断下后需要Alt+F9返回 因为断电是下在函数内部的,即断下的位置处于系统领空中。

看到这里后你应该能读懂篇帖子了http://bbs.nyasama.com/viewthread.php?tid=350&extra=page%3D1这个解包并不完全因为不知道XOR的密匙和索引表的加密

题外话-说说库也就是封装。有很多DLL可以导出函数类似于扩展,但是大多的封装库都是封装的现成的API当然不排除有达人直接写比windows更高效的函数。





评分

参与人数 3积分 +12 收起 理由
真PKS同志 + 5 我刚知道有OD这么个东西……这下子可以不用 ...
lzz3012 + 4 如果能有实例做介绍可能会易懂点……(头晕 ...
bao_zi + 3 好触233

查看全部评分

发表于 2010-12-4 21:38:47 | 显示全部楼层
支持教程。

程序跟踪我用过CheatEngine,改游戏蛮方便的。
分析PE结构我用过stud_PE。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-12-4 21:42:42 | 显示全部楼层
只是个初步教程,因为答应写个OD教程。    会接着写完(没准会坑掉)会有什么疏漏别笑我就好
回复 支持 反对

使用道具 举报

发表于 2010-12-4 22:37:10 | 显示全部楼层
那些值依舊看不懂(倒不如說不知道存在意義……嘛無關緊要了。

其實我挺奇怪為啥要權限的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-12-4 22:50:12 | 显示全部楼层
权限10   最低权限吧  似乎只要有ID就能看
回复 支持 反对

使用道具 举报

发表于 2010-12-5 02:50:25 | 显示全部楼层
先记号 明天看
回复 支持 反对

使用道具 举报

发表于 2010-12-5 03:02:10 | 显示全部楼层
OD也?!居然是OD也!
其实以前学破解的时候已经学过一遍了,楼主讲的不错呢
回复 支持 反对

使用道具 举报

发表于 2010-12-5 12:19:50 | 显示全部楼层
只用过最基本的i686-pc-mingw32-objdump和winedbg...其实关键还是要做好笔记啊...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-12-5 13:17:49 | 显示全部楼层
回复 8# r6144


&#160; &#160;太多时候需要运气了,在一堆CALL面前完全不知所措。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-12-5 15:58:20 | 显示全部楼层
本帖最后由 十二 于 2010-12-6 16:49 编辑

终于写完了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 少女注册中

本版积分规则

合作与事务联系|小黑屋|手机版|无图版|喵玉殿

GMT+8, 2024-5-15 02:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表