小甲鱼.md

OD使用教程

基本使用

image-20200917104607921

Q:

为什么我在Ollydbg中的第一个起始地址与其他人不同?

(window7 64bit)

我的Ollydbg起始地址是777000000,77777777等。我认为这是系统地址。

A:

当你将PE加载到ollydbg时,按ALT + F9进入主模块的入口点(返回用户代码)你看到的是ntdll.dll里面的地址,在实际的代码之前您正在检查的样本。这个DLL加载在更高的地址。

请注意,在ollydbg的窗口标题中,您可以看到当前正在调试的模块。通常(并非总是),您要加载的PE的基地址(在32位PE中)为0x0400000

调试入口

  • system breakpoint
  • 主模块人口点
  • WinMain

选项: 选项--调试设置--事件

易错

image-20200917132534616

GetDlgItemTextAGetWindowTextA:获取文本框

修改保存:选择--右键--复制到可执行文件--选择--保存文件

导入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) 程序入口点

middle

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()

原文地址:https://www.cnblogs.com/nsfoxer/p/14348036.html