OD调试

1、获取文本框输入:GetDlgItemText和GetWindowText

如果调试时一不小心F7进入了函数内部,可以一直F8直到退出,也可以CTRL+F9

1.F2下断点,Alt+b打开断点编辑器,可编辑所有下过的断点,空格键可快速切换断点状态。
2.当位于某个CALL中,这时想返回到调用这个CALL的地方时,可以按“Ctrl+F9”快捷键执行返回功能。这样OD就会停在遇到的第一个返回命令(如RET、RETF或IRET)。
3.如果跟进系统DLL提供的API函数中,此时想返回到应用程序领空里,可以按快捷键“Alt+F9”执行返回到用户代码命令。
4.所谓领空,实际上就是指在某一时刻,CPU执行的指令所在的某段代码的所有者。
5.如004013F7这类地址一般是可执行文件领空,7C8114AB这类大地址一般是系统DLL所在的地址空间。
6.程序通常读取文本框内容的字符串用的是以下两个函数:
GetDlgItemTextA(GetDlgItemTextW)
GetWindowTextA(GetWindowTextW)
7.一般我们要结合经验通过猜测的方式多尝试几遍设陷阱,找出相关的函数。
8.按“Ctrl+G”键打开跟随表达式的窗口。
9.也可以通过“Ctrl+N”键打开应用程序的导入表(输入表),然后查看应用程序总共导入了哪些函数来以此推断需要在哪里挖坑下陷阱!
10.关于返回值,汇编代码的返回值约定是存放在eax这个寄存器里边的,如果32位的eax不够存放返回值,系统会将返回值放在内存某个位置并把该位置的地址放在eax返回。

cmp影响三个标志寄存器
ZF 0标志位
0F 溢出标志位
CF 进位标志位

test指令
就是按位与运算,不影响操作数,只影响标志位

去除NAG窗口
nag本意是烦人的意思,nag窗口是软件设计者用来时不时提醒用户购买正版的警告窗口。
软件设计者可能认为当用户忍受不了试用版中的这些烦人的窗口时,就会考虑购买正式版本。
但在我国特殊国情嘛,我们是不允许有这样欺负用户的软件设计的…所以小甲鱼教大家“替天行道”?错了,我们只是在探讨技术细节。
一般nag在程序启动或退出的时候弹出来,或者在程序运行的某个时刻突然蹦出来吓你一跳。

今天的课程小甲鱼将教大家不同的几种方法来去除烦人的NAG窗口。
一般情况下,一个注册后的软件,他是不会弹出NAG窗口的。
所以,一般在程序启动的时候,他会有一段代码检查改程序是否已经被注册,我们可以先把这个程序的注册破解掉,NAG窗口即会自动消失。
不过这节课小甲鱼要教给大家的是新的技巧:去除NAG窗口的几种方法。

GetModuleHandleA这个API函数用于获取程序的ImageBase(基址)
这个程序的MessageBox的OwnerHandle(父窗口句柄)为0(NULL),我们可以将这个值改为一个不存在的值,例如1,这样它就找不到老豆,就不会被显示出来。
名词注释:
VA(VirtualAddress,虚拟地址)
RVA(RelativeVirtualAddress,相对虚拟地址)
EP(EntryPoint,程序入口点)

修改程序:按M,从内存中查找特定字符串,然后找到上一个JMP
也可以从内存中查找字符串,右键点击查看参考,即可快速定位程序对该字符串的引用。

破解的思路
仔细观察一个程序,我们会发现,无论在怎么加密,无论加密哪里,这个程序加密的目的就是需要你掏腰包来获得更多的功能或者解除限制。
那么我们就可以逆向的来思考,如果该程序成功的注册后,那么程序的行为必将发生变化,如NAG去除了,如功能限制没有了等等。
也就是说,程序的代码的走法也会跟未注册的时候截然不同。因为程序的行为改变了,那么决定它所有行为的代码走法也会发生变化。

小甲鱼在这里再举个例子:
未注册 -> 不跳过NAG窗口
已注册 -> 改编代码或条件,跳过NAG窗口
说啥呢?也就是说我们只需要找到这个判断是否需要“跳”的条件即可。
另外补充说一点,一般我们说条件跳,鱼油们一定会想到:cmp XX,XX 然后jz或jnz或jl等。
其实还有另外一种形式,叫做可变跳转。
小甲鱼描述能力仅限于美女,还是举个例子吧:

例如jmp eax,无疑是一个直接的跳转。但是我们知道eax是一个寄存器,对于高级语言的说法它就是一个变量,里边的值随时可以改变。
那么完全可以这样:
未注册 -> eax == 004013A0
已注册 -> eax == 00401354
所以这个例子告诉我们,世界很大,也很邪恶,坏叔叔很多,他们鬼点子更多,要实现技术的突破,就要打破传统的思维模式。

OllyDBG从原理上来区分,有两种不同的断点:软件断点和硬件断点。
也许会有朋友说那不是还有内存断点吗?
内存断点严格来说是属于一种特殊的软件断点。
内存断点:
内存断点每次只能设置一个,假如你设置了另一个内存断点,则上一个会被自动删除。
设置一个内存断点,会改变整块(4KB)内存的属性,哪怕你只设置一个字节的内存断点。

另外还需要提一下的是,内存断点会明显降低OD的性能,因为OD经常会校对内存。
软件断点:
当我们按下F2设置的断点就是软件断点。
设置该断点的原理是在断点处重写代码,插入一个int3中断指令,当CPU执行到int3指令的时候,OD就可以获得控制权。
硬件断点:
这个原理跟软件断点不同,硬件断点的可行性依赖于CPU的物理支持。

传说中,有这么一些寄存器,它们只用于调试,我们称为调试寄存器:Dr0~Dr7
其中Dr0Dr3四个寄存器用来存放中断地址,Dr4、Dr5保留不使用,Dr6、Dr7用来记录Dr0Dr3的属性(如读,写还是执行,单位是字节,字还是双字)。
因此,这就解释了为啥硬件断点只有四个,天生不足哈。
那么聪明的鱼油肯定会追问:小甲鱼老湿,那我要如何来区分何时使用何种断点呢?

这两种断点在使用上都有它们自身的限制,只要搞清楚它们各自的特性就知道何时该用哪个了。
例如软件断点就只能在OD的CPU界面下,在数据段它下不了,在一条指令的中间它也下不了。
在我们这个例子中,断点我们想下在windows的动态链接库里,我们需要用到硬件断点,因为用软件断点下在dll文件中是不会保存的,重启程序后将丢失断点。
接下来的一系列实践会让你掌握这些技巧的!


两种打补丁方式
1、爆破,找出关键的跳转,然后修改跳转,强制跳到其他分支,然后保存导出
2、找出哪个地方存放注册信息,修改它的值


Delphi特色
004A5829 . 64:8910 mov dword ptr fs:[eax], edx
004A582C . 68 41584A00 push 004A5841
004A5831 > 8B45 CC mov eax, dword ptr [ebp-34]
004A5834 . E8 5BE8F5FF call 00404094
004A5839 . C3 retn
004A583A .^ E9 E9EFF5FF jmp 00404828
004A583F .^ EB F0 jmp short 004A5831
004A5841 . C645 F3 01 mov byte ptr [ebp-D], 1

004A5841是注册成功的提示信息
push 004A5841之后retn
就相当于吧004A5841 pop给EIP
那么下一条指令就执行004A5841了

看看retn紧接着的地方是不是有push,如果有的话
就会跳转到该位置

以前都是通过敏感字符查询法
现在通过API函数调用法

内嵌补丁

把修改后的代码放到程序的无用区域比如0000000000000000000000000000000000000000
然后在需要调用的地方jmp跳过去,
执行指令之后再跳回来

按K,是调用堆栈,可以看到当前进度,调用了哪些函数(因为函数会影响堆栈),从而确定关键的函数
调用堆栈法比查找字符串法更高级


找Nag窗口
1、先通过ResHacker找到对话框的资源ID(10进制)
2、由于弹出窗口肯定
创建模态对话框是由调用DialogBoxParam 函数实现的,而创建非模态对话框是调用CreateDialogParam函数实现
它们的原型分别是:
HWND DialogBoxParam (HINSTANCE hlnstance, LPCTSTR IpTemplateName, HWND hWndParent, DLGPROC IPDialogFunc, LPARAM dwlnitParam);
HWND CreateDialogParam (HINSTANCE hlnstancem, LPCTSTR IpTemplateName, HWND hWndParent, DLGPROCIpDialogFunc, LPARAM dwlniParam);

所以调用的时候肯定要 push 0x?????(16进制)
找到这个就找到了即将要弹出Nag窗口的地方了

如果用mov ax,1会造成覆盖
可以用mov al,1替代

多态和变形
多态是第一种对杀毒软件造成严重威胁的技术。
一个多态病毒在触发时由解密模块进行解密,在感染时由加密模块进行加密并感染,但其加密模块在每一次的感染中会有所修改。
因此,一个仔细设计的多态病毒在每一次感染中没有一个部分是相同的。这使得使用病毒特征码进行侦测变得困难。杀毒软件必须在一模拟器上对该病毒加以解密进而侦知该病毒,或是利用加密病毒其统计样板上的分析。

变形病毒是为了避免被杀毒软件通过模拟环境或“蜜罐”系统而被查杀。变形病毒在每一次的感染都完全将其自身改写(简单地说就是厉害到可以变得连他妈都认不出他来)。
有些变形病毒可以感染多个操作系统,如Simile病毒可以感染windows的PE文件和Linux的ELF文件。
变形病毒要达到可变形,一个变形引擎是必需的。一个变形病毒通常非常庞大且复杂,就拿Simile来说,该病毒包含了14000行汇编语言,其中90%都是变形引擎。

加密的代码如何修改呢?
逆运算

反调试技术:
1、kernel32.IsDebuggerPresent
2、加载进程列表,逐个遍历,与OD的进程名比较

原文地址:https://www.cnblogs.com/poli/p/4972786.html