

第1讲
1. 调试分动态分析技术和静态分析技术,动态就是让程序跑起来。静态分析技术适用于病毒,设备不兼容,单一的模块
2. OD(OllyDbg)和IDA Pro,前动态,后静态,两都都兼容动态和静态的调试方式,可在www.fishc.com
两个工具都有十分丰富的插件扩展
3. OD主要窗口,汇编对应的地址窗口,代码对应的十六进制机器码窗口,反汇编窗口
快捷键,
OllyICE是中文版,OllyDbg是英文的
F7单步步入,F8是单步步过,如有call时F7会进制call的位置
工具的LEMTWHC
4. 用OD改hello.exe的标题
udd是保留调试环境,如上次调试设的断点,注释等。可在选项里设置udd路径
C+F1重新载入
第一次调试按F8,直到程序窗口显示出来,在再里下断点
F9走到断点处
void A(a,b,c)
push c
push b
push a
call A的地址
日志:快速
5. 按分号可写注释
C+G,输入地址,将标题改了,双击修改,最后要加个00,最好不要溢出
第2讲
1. 拆解一个win程序要比一个dos程序容易得多。因dos所有代码都是自己写的,win很多都是调用
使用API函数隐藏一些东西比较困难
2. 用API函数作为切入点,用加密与解密的
输入姓名,计算序列号,比较序列号,错误对话框/正确对话框
用GetDlgItemTextA从编辑模框中取字符,
3. 选项——调试设置——事件,主模块入口点即文件的入口点,WinMain,程序的WinMain()函数入口 点
可指定入品点,
虚拟地址,同一程序同一指令在不同系统环境下此值相同
机器码,汇编指令窗口
4. 注意死循环,一种F8,或C+F8
C+F2重新打开, C+F9返回
取消外面的断点,A+B选择外面的断点或快速工具栏的B,再不到再走一遍,可以禁止或del删除断点
快速工具栏双左箭头是重新载入
上面是错误演示
5. 消息机制,上面死在消息队列的循环中,一直在等消息
6. 正确的破解方式
windows以是API实现所有的步骤
搜索GetDlgItemTextA,在这里下断点
进入call后可用F8走到外面去,也可用C+F9回到调用处
不要进入,观查下面的提示
汇编下任何函数的返回值都在eax
test eax,eax 测试返回值,改标志位
7. 去掉判断,双击那行代码,改为nop,右击——复制到可执行文件,右击——备份——保存数据到文件
暴力破解
8. 真正的破解,通过算法,逆向,写注册机
F2,A+B,空格可切换断点的状态
cal中返回到调用这个call的地方,可用C+F9,
dll的的API,可用C+F9返回程序的领空,004013F7这类地址是可执行文件的领空,大地址是dll的
用C+G打开跟随表达式的窗口
C+N打开应用程序的导入表,查看应用程序共导入了那些函数
第3讲
1. 逆向ReverseMe.exe
打开OD,按F3加载进来,OD的右下角是栈空间
2. 寄存器就象CPU身上的口袋,U可从里面随时拿东西
寄存器大小都是32位,即4个字节,0-ffffffff,除以下3个,其它都可随意使用
EBP,ESP,EIP,EIP总是指向下一条要执行的指令
3. 栈是内存的一部分,FILO,地址反向,栈底是大地址,栈顶是小地址
4. 找CALL做外挂用,
EIP是指向下次要执行的指令的地址,
5. call有多个形式
call 404000h 直接跳到函数或过程的地址
call eax 函数或过程地址存放在eax,eax可放32位的地址
call dword ptr [eax],取eax中存放的地址处的值,取dword长,
call dword ptr [eax+5] 即4个字节
call dword ptr [<&API>] 执行一个系统的API,取API的地址
6. win32.hlp文件,用OD选择这个文件
右击API——API帮助,右键,符号名帮助
7. windows程序运行在Ring3级别,Ring0权限最高,只有内核使用
通过API函数可操作内核,win只信任自己提供的函数,要通过API才能实现对内核的操作
8. mov指令将src的内容拷贝到dest
mov dest,src
movsx 符号位扩展,movzx零扩展
9. cmp指令,一般与跳转指令连用,
cmp dest,src 通过比较结构设置c/0/z标志位
cmp eax, [404000] 取dword型数据比较,因eax是32位的
10. 标志位在破解作用很重要,32个标志位
逆向中要关心的标志位只有三个,就是cmp指令能修改的三个,z/o/c
Z为0标志,O溢出标志,C进位标志,最高有效位有进位时置1
11. 逻辑运算
AND 逻辑与 1 1 得1,1与0得0
OR 1与0得0
XOR 异或,1 1得0,10得1,一样为1,不一样为1
NOT 取反
12. test指令
test dest,src 和and指令一样,仅改标志位,判断eax为0,一般用来判断eax是否为0
13. 条件跳转指令,根据不同标志位来跳转
ja ;CF=0 and ZF=0
见表
xor ebx,ebx,ebx清零
13. ReadFile读取一个文件
14. 要跳改为jmp,不跳改为nop
15. 补丁,patch,OD中用/可查看补丁, 即改过的,按C返回调试的界面
16. 文件名叫Keyfile.data,用UE打开,写16个47这个ASCII的字母G
第4讲 去除NAG窗口]
1. nag本意是烦人,用来提醒用户购买正版的警告窗口
2. 一般程序启动时会有一段代码检查程序是否已被注册。使用RegisterMe.exe
启动程序后发现启动和关闭都一个窗口
3. F3载入要操作的程序,注释,右击——符号名帮助,查看API
一种方法是直接用jmp跳过,另一种方法是把那段MessageBoxA用nop填充
3是把父句柄改为1,调用call前会有push
第四种是修改入口地址,避开最开始的nag,方法是按M查看内存分配图,双击文件头
地址,二进制代码,人类阅读代码(小头),往下拉到PE偏移指示处RVA,RVA相对基址的虚拟地址
左下修改找到的,改后,右键复制到可执行文件
4. PE结构就是用来指导系统如何执行你所设计的程序
PE文件在硬盘和内存的存储结构是一样的,
文件阔大仅是帮助win加载器定位和寻找下边的节区的内容
5. EP程序入口点
第5讲
1. 论坛上下载上讲的作业
选项——调试选项——事件
2. OD里,点M(Memory),只有0040000的才是程序的,PE头占了5000,右击最高位有数据的,修改整数
PE头一般都是1000,双击进入PE头
SizeOfCode 代码段的大小,太大——修改整数,改为400,
最高位有数字,有问题
NumberOfRvaAndSizes 数据目录表的尺寸,16进制的10,一直都是
非dll输出表应该为0
改后要在C下的去保存,先C+G跳到改的地方再保存,不能选的太多保存时
3. 程序可执行,但OD分析出错,OD有警惕心,Win加载器会智能筛选
4. 插件,Olly Advanced,解压后放在OD的plugin里,里面有帮助文档
5. 插件的Anti_debug,反反调试,只需载入倒数第3,4个
第6讲 真正程序的逆向
1. 程序有真正的功能和作用,
2. 对太监板的程序完整化,把限制的功能恢复,把阉割的功能添加
3. 用OD加载后程序异常,要SEH结构化异常处理,SEH是系统提供的功能
回调函数,异常处理的函数
按S+F9,到窗口出来,拖动窗口没有重影
4. 00000000-ffffffff,在OD设置这个段忽略异常
按暂停,
call那个程序的最后有RET返回程序的
调用一个自己的进程,再去调用messagebox
保存,所以修改
5. 查看字符串,点M,C+B在整个内存搜索字串,编辑,记住地址,返回C里,找到这个地址再保存
右击——二进制——编辑, 改的时候,勾选下面的保持大小
转到——表达式,
每改一步保存一个版本
有的是用ASCII存放的,占一个字节,Unicode是两个字节,
6. 右击——查看参数,可看到引用字串的地址,反前面的跳转修改
第7讲
1. 反编译VisualSite Designer.exe,运行后剩下5次可以使用,关闭时有广告
用杀毒软件的安全模式或沙盘运行,就不会这种状况,次数不会减少。
2. 要使程序同未注册时不同的走法
条件跳 ,cmp xx,xx,然后jz或jnz
改eax中的值,
3. 软件断点与硬件断点,内存断点是特殊的软件断点,不建议使用,只有有一个
设置一个软件断点,内存断点会降低OD性能,
4. 在断点处重写代码,插入一个int3
5. 调试寄存器,Dr0-Dr7,0-3用来存放中断地址,45保留,6,7记录0-3的属性,为什么硬件断点只有4个
6. 软件断点只能在OD的U界面下,不能在指令中间
硬件断点,不会在dll保存
7. 实践
F3加载程序,按F8先走一遍,还可C+F8但会在循环中卡住,在循环的下一个指令下断点,再走
esi查看esi的值
下面的退出程序了,这里的call要跳进去
A+B断点编译器
进入dll领空, 自己的dll也是大地址
右击——硬件断点——硬件执行,只能下4个硬件断点
按F12可暂停
在软件的领空下软件断点,可加注释
计数器减1,开正常的程序,改直接 mov eax,1
第7讲下
1. 这讲是去掉广告框
先让框出来,OD里暂停,点K,查看那些函数被调用了
从后往上看,程序的领空,断点,将这里的call改为nop掉,保存到文件
2. 破解绝对方案,注册前和后,判断代码走的方案
单步走,遇到黄的的跳转就要注意,跳注释为Y,不跳注释为N,把整个程序写下去,只改程序领空,不用管动态链接库
A+F9回到程序领空,直到遇到nag窗口
3. 走多几次到计数器变为0,最后就会打开网页让交钱
前面未实现,现在变成了实现
第8讲上
1. 程序一闪而过,得不到相同的结果,一是调试环境问题,如xp的程序在win7下打不开,二是杀毒软件导致的
三是程序本身被修改过。
2. nag窗口是破解的触发点,
复制到所有下没有所有修改,插件,勾选
3. 查找——所有参数字符串,区分大小写,整个范围,C+L查看下一个
双击去到代码的位置,上面有个跳转,找到入口55的入口点,下断点
跳转未实现的,使它实现
4. 再找字符串,再找前面的跳转下断点,再重新运行单步走,
5. 断点中止,点OD的B删除前面下的所有断点
第8讲下
1. 在指针指向指针,程序有两个判断才跳,
右键,...跟随,
查找参数——地址常量,右键,在每个指令上设置断点
2. 一条指令改成4条,对齐变化,重定位信息会改
判断那里是存放判断点的因素,只改一处,大的程序处处改麻烦
3. 用Move,使没有多余的nop
第9讲
1. 爆破是最初级的破解方案,不到万不得已,不直接修改JNZ通关
2. 用OD载入MrBills,输入注册码,看错误提示,寻找这个字符串
3. 双击找到的字符串,找找键跳,只有test al, al会改变Z标志位
多做注释,call调用的函数,函数的返回值永远保存在eax,
在call下断点,输入注册码,F7进入call,里面的call先不要进入,一层一起看
4. eax中变成地址就不用管了
到call按回车可进去看指令,F7进去会执行
al给bl,bl又给al,可能是先保存值,也有可能是运算后再给回来
5. 也可能多个同时OK就注册了,eax中为地址不用管它
多输入几次注册码,查看走向
6. 有的call会框出来,有的没有
第10讲 VB程序加密解密的思路
1. 不同编译器编译出来程序的特点,有针对性的逆向,先搞清楚程序的编译器和编写语言
PEID.exe,加了什么壳,用了什么编译器
2. VB程序用OD分析蛋疼,由BASIC语言发展而来的,VB也是由事件驱动的编程语言。更先进的delphi和C#
3. 所有VB程序都依赖一个外部动态链接库,MSVBVM60.dll,VB所有API函数都在这个DLL可实现
跟踪代码经常要跳到dll领空
4. API函数作为中介让我们的程序和指定设备进行勾通
5. 针对变量,针对字符串,关注如下变量和字符串
__vbaVarTstEq //对变量测试是否相等的函数
__vbaVarTstNe __vbaVarCompEq
//比较字符串
6. 找到上面的函数下断点,C+N打开输入输出表,找函数,右击在这个设断点
找到注册码记下
右击,删除所有断点
第11讲
1. 先用PEID查看是什么编译器写的,载入OD
2. 用关键字搜索字符串,查找文本,找到后双击来来代码处,往上查看跳转
3. 往上看,本地调用来自,004047D3,00404880,右击——转到call,下断点
把没用的断点删掉
4. 注意内存的数据库,栈区
mov al,1
5. 下断点,按F9,绕开循环
6. 加密的过程1,2,3
有的程序会屏敝OD
第12讲 逆向后的Delphi特色和陷阱
1. PEID载入程序,OD载入,右——查找——搜索字符串,勾选 整个范围,不区分大小写,
找到注册成功的字串,跳到指令处,
2. retn是VC函数的返
查找参考——选定命令
3. d的特色,前有push的retn相当于jmp,把栈里的数据弹出
D的特色,N多的call,D是面向事件,或组件的特色,
4. 找到过程的起始位置,push ebp的地方
单步,看那个call提示出来的信息,按减号退一步,但命令已执行,只是可看那个跳的
//高的程序,会检测程序有没有被下断点,有就出错
过循环的方式,循环后一句下断点,
5. 一遍遍的跟,一次次下断点
6. VB下call的是微软的,D下call的是自己写的
复制——所有修改,保存文件
7. D下要多F8,要不F7进去,因为D的call太多,注意减号键的使用
retn前有push,相当于jmp跳去push入栈的值
第13讲
1. xoftSpy软件,安装,输入注册码,记住出错信息,这里不搜索字符串
2. GetWindowsTextA
查找——所有模块间的调用,搜索ASCII的方式,GetWindowsTextA
所有下断点,——这是一种方法
3. 搜索,在每个参数上设断点,,看在输入账号和密码后有没有断点
程序淌有运行已断下,走过了,重来,
栈里有三个参数,API函数的三个参数,获取win32帮助文档
4. 有两个地方几句代码一样,重复验证,验证是否被破
过循环,循环后断点,F9,再取消断点
第14讲
1. 接上讲的继续
2. 字符串查找法,看程序在什么时候显示程序是未注册的信息
3. 单步调试,
第15讲
1. 搞一个过期的软件,内嵌补丁inline patch,加壳软件打补丁用的多,可以不用脱壳
2. DVD Menu Studio,改时间使软件过期,用OD载入,输入注册码
不点OK,C+D寻找一个函数,搜索KillTimer,在那里设置断点,会有多个,再点OK
3. 失败和成功的代码,跳还是不跳看是跳成功还是失败
表示一个字母前面要加0,
点击——转自。。。
4. 有个Switch的提示
5. 汇编指令翻译为机器码不相等,堆栈不平衡,内?补丁,不要盖掉后面的代码
在空白的地方找个位置,写上代码
6. 做一个书签,二进制复制到空白地方,再跳回去,保存所有修改
7. 三个字节的代码,不能直接改成5个字节的代码
上面的修改会进制死循环,OD里中止程序
8. 重新来,再单步调试看如何会死循环
eax=B时才能退出循环,循环中的循环
第16讲
1. 补充上讲的内容,开启下讲的新方向
2. OD载入,点K,看堆栈的调用,最后几个有可能是生成nag窗口的调用,双击最后一个到代码处下断点,
重新运行,
有时程序走不了,在循环里
3. 往上找到push ebp的地方,单步到上讲的switch处
4. 在最先跳转的时候改最好,不要跳可nop掉
第17讲
1. inline patch用法,将一段代码或程序注入到程序中,硬件断点
2. 调用堆栈窗口,CDialog::DoModal模态的对话框,双击转到指令处下断点
3. 有的不能nop掉,否则主窗口也出不来
代码载入内存分段,段有3种属性,可读,可执行,可写
4. 点M,.data段一般可写,双击.data,往下拉,找到一个都是0的位置。这些是用来填充对齐的。
在445E80处加入i,程序跑起来可以改变0处的值,要测试,右键——断点——硬件写入断点——Byte,
让程序执行一次看有没断到那个位置表那个位置不会被写,断了就重新找一志位置
5. int3是代码间的隔断,在指令处找一块空白,做一个书签,
短跳转占2个字节,长跳转占4个字节
6. NonaWrite插件,复制到OD下的plugin目录
打开插件输入:
0x437d6e: //在这个位置开始修改
inc byte ptr [445e80] //对字节的数据加1,在硬件为点那
cmp byte ptr [445e80], 2
jnz 4203BA
lea ecx,dword ptr [esp+4c]
jmp 42037f
最后点插件上的assembly
jmp 437d6e
第18讲
1. 模态对话,要先处理这个对话框,model和modeless,区别在于是否允许用户在不同窗口间进行切换
2. 模态是win为它内建一个消息循环,非模态是程序的消息循环派送的
3. 创建模态是调用DialogBoxParam函数,非是CreateDialogParam函数
4. OD载入,注册,点关闭时出现一个对话框,
用exeScope打开程序,不能和OD和它同的载入一个程序,否则提示无法写入
可改很多信息,更完后点允许更新
5. OD载入,右键——查找——所有命令,push 0x67,67exescope里找到的103
6. 找调用过程的位置,普通的方法是查看堆栈,调用前要把原来的地址保存到堆栈,以便返回
右击——在反汇编中跟随
再往前找跳转
程序一进入一般都要检查是否验证,来确定是否找对断点
右击可撤消汇编
第19讲
1. 逆向GIF Movie Gear,找到结尾的对话框模板的名字。
用reshack,不用exeScope,两个都个用,打开程序,找到对话框。要一个一个的看。实际上是第一个
记住模板名100,
2. 用OD载入程序,点程序的关闭。查找命令,push 0x64,有N多个。在每个命令上下断点。
关程序的关闭,断下的就是。
3. 重新运行程序,找到生要的call,按del把断点取消
符号名帮助RegOpenKeyEx,打开一个注册表的键值
mov al,1,字节数少,mov eax,1会覆盖后面的,所以用等价的
第20讲
1. Keygen为Key Generator,即注册机,可独立做一个可执行程序,也可作为程序的一个模块实现。
可能会结合计算机一些指纹,主板编号,网卡号等
2. 逆向算法的代码,OD载入注册机
bp GetDilagTextA,用命令下断点
3. ecx一般用来循环计数器
4. 最终要得到注册机的注册码,暴破注册机没有意义。
5. 在空白的地方,
mov dword ptr ds:[439000],esi
jmp 401353
要数据段才能写入,前面改了指令都是另存为一个
6. 算法:ecx默认存放循环次数
and edx,0ff //把edx高24位清零,,ff=1111 1111,只有1和1and才得1
sar ebx,1,右移一位,相当于除以2
imul ;ebx,edx,相乘
7. 这里都是算法。
result+='f'*'f'+('f'/2+3)*'f'-'f'
result*=2
8. 用VC写上面的算法
#include <stdio.h>
main()
{
int i, result = 0;
char a[] = "fishc";
for( i=0; i<5; i++)
{
result += a[i] *a[i] + (a[i]/2+3)*a[i]- a[i];
result *= 2;
}
printf("%d\n", result);
}
第21讲
1. 眼见非实,多态和变形
多态是第一种对杀毒软件造成严重威胁的技术。解密模块进行解密,感染时由加密模块进行加密并感染,
杀毒软件要在模块器上对该病毒加以解密进而侦知病毒。
2. 变形病毒,每次感染都将将自身改写,Simile病毒可浸染windows的PE和Linux的ELF文件
3. ReverseMe.exe,win32汇编的程序,用OD载入
查看字符串,发现是骗人的
自动对模块分析,取消这个,分析出的都是字符,不是指令
C+G跳到指定地址,正在修改自身
4. 关于xor异或指令,常用来做加密的异或指令。
A xor B = C
C xor B = A
将401000到401218代码解密
5. 跟进call,分析代码。
把所有字符串都通过异或加密,不让搜索字符串
第21讲下 最高作战方案:
1. 解密401000到401218:XOR 0x5A
内存中对自己的代码进行修改
2. 修改自身代码:401011到401025
3. 对nag窗口加密的标题和文本进行解密
4. 修改自身代码,:401011到401027
把nag窗口覆盖为主窗口
5. 对nag窗口的标题和文本进行加密
从模块删除分析
6. 使父进程为1,没有1这个父进程就生成不了。
地址和字节数有关
看在那里修改了40101E
要改跟5Axor后的值得那么多
在内存修改字节保存
7. 备案 401011:EB 57 (xor 5A) -> B1=,这种方法不行,不能在移动修改后的代码改
要在内存改 6A 必为B1。
第22讲 反调试
1. 病毒,木马,外挂,好的软件及病毒,木马都具备反调试功能。
2. 反调试技术 文档.pdf
3. 用OD打开不管注册文件是否正确都提示是错误的。
4. IsDebuggerPresent 被 调试返回1,未被调试返回0
5. 程序2
要把udd删掉,
A+F9回到程序领空,
6. 程序3
一走就中止,没在OD运行又正常,nop掉je
7. 程序4
OD一运行就出错
第23讲 探测有没有调试器的存在
1. 自己写一个过程,将一些调试器拒之门外。
2. 不能回到程序领空,
3. 创建进程快照,CreateToolHelp32Snapshot,返回值为快照的句柄
把每个进程同ollydbg.exe对比
4. lstrcmpiA字符串对比
在获取的进程名的地方断点,按F9,可看到每次获取的进程