OD使用教程
目录基本使用
Q:
为什么我在Ollydbg中的第一个起始地址与其他人不同?
(window7 64bit)
我的Ollydbg起始地址是777000000,77777777等。我认为这是系统地址。
A:
当你将PE加载到ollydbg时,按ALT + F9进入主模块的入口点(返回用户代码)你看到的是ntdll.dll里面的地址,在实际的代码之前您正在检查的样本。这个DLL加载在更高的地址。
请注意,在ollydbg的窗口标题中,您可以看到当前正在调试的模块。通常(并非总是),您要加载的PE的基地址(在32位PE中)为0x0400000
调试入口
- system breakpoint
- 主模块人口点
- WinMain
选项: 选项--调试设置--事件
易错
GetDlgItemTextA
、GetWindowTextA
:获取文本框
修改保存:选择--右键--复制到可执行文件--选择--保存文件
导入api帮助:帮助--选择API帮助文档--选择
简单汇编
mov
mov dest, src
movs movvb movsw movsd edi, esi 将串、字节、字、双字为单位从esi指向位置复制到edi指向位置
movsx 符号位扩展,byte->word,word->dword (扩展后高位全用符号位填充),然后实现mov。
movzx 零扩展,byte->word,word->dword(扩展后高位全用0填充),然后实现mov
cmp
cmp dest, src 比较dest和src两个操作数,并通过比较结果设置C/O/Z标志位。
如果相等,Z标志位置1,否则0.
标志位
Z/0/C
Z标志位(0标志):运算结果为0时候,Z标志位置1,否则置0。
0标志位(溢出):如操作数超出了机器能表示的范围则称为溢出,此时OF位置1,否则置0。
C标志(进位标志):记录运算时从最高有效位产生的进位值。例如执行加法指令时,最高有效位有进位时置1,否则置0。
test
test dest, src
and指令一样,对两个操作数进行按位的‘与’运算,唯一不同之处是不将‘与’的结果保存到dest。
比较
补丁
查看所有修改 “/”
NAG窗口
- jmp 跳过
- nop 填充
- push 1 改参数 (实际情况)
PE结构
GetMoudleHandleA(): 获取程序ImageBase(基址)
AddressOfEntryPoint
-
VA (virtual address) 虚拟地址 载入到内存的地址
-
RVA (relative virtual address) 相对虚拟地址 相对于基址的偏移地址(长度)
-
EP (entry point) 程序入口点
SHE (Structured Exception Handing)
结构化异常处理
Windows程序设计中最重要的理念就是消息传递,事件驱动。当GUI应用程序触发一个消息时,系统将把该消息放入消息队列,然后去查找并调用窗体的消息处理函数(CALLBACK),传递的参数当然就是这个消息。
异常也当作是一种消息,应用程序发生异常时就触发了该消息并告知系统。系统接收后同样会找它的“回调函数”,也就是我们的异常处理例程。
当然,如果我们在程序中没有做异常处理的话,系统也不会置之不理,它将弹出我们常见的应用程序错误框,然后结束该程序。所以,当我们改变思维方式,以CALLBACK 的思想来看待 SEH,SEH 将不再神秘。
alt+F9返回到用户空间
F12暂停
可以使用暂停加返回用户空间确定当前位置
断点
软件断点
F2暂停
原理: 在此代码处插入int
指令,导致cpu运行到此处时,将控制权交给od
硬件断点(四个)
CPU调试寄存器Dr0 ~ Dr7
Dr0 ~ Dr3 存放中断地址,Dr4,Dr5不使用, Dr6 ~ Dr7 记录0-3属性
VB破解
变量 | 字符串 |
---|---|
__vbaVarTstEq | __vbaStrCmp |
__vbaVarTstNe | __vbaStrComp |
__vbaVarCompEq | __vbaStrCompVar |
__vbaVarCompLe | __vbaStrLike |
__vbaVarCompLt | __vbaStrTextComp |
vbaVarCompGe | __vbaStrTextLike |
__vbaVarCompGt | |
vbaVarCompNe |
Delphi破解
- 到处都是call
- 使用 push value+retn代替jmp
内嵌补丁(inline patch)
使用插件NanoWrite
写入汇编代码
用法: 第一行为位置
0x437d70:
inc byte ptr[0x445e80]
cmp byte ptr[0x445e80], 2
jnz 4203ba
lea ecx, dword ptr ss:[esp+4C]
jmp 42037f
修改的数据位置一般位于data段,需要有可写权限
汇编代码不能离最后的代码太远,可能由于PE头原因无法映射
对话框
- model: 不允许在窗口之间切换
DialogBoxParam
- modeless: 允许在窗口之间切换
CreateDialogParam
HWND DialogBoxParam (HINSTANCE hlnstance, LPCTSTR IpTemplateName, HWND hWndParent, DLGPROC IPDialogFunc, LPARAM dwlnitParam);
HWND CreateDialogParam (HINSTANCE hlnstancem, LPCTSTR IpTemplateName, HWND hWndParent, DLGPROCIpDialogFunc, LPARAM dwlniParam);
windows api
RegOpenKryEx()
注册机
ecx
存放循环次数
sar
右移一位
眼见非实
多态和变形
简单反调试
IsDebuggerPresent()