1625-5 王子昂 总结《2017年4月10日》 【连续第191天总结】
A. 汇编语言 第十章 70%
OlleyDbg 基本操作
B. ret指令用栈中的数据修改IP的内容,从而实现近转移。相当于pop IP
retf指令用栈中的数据修改CS和IP的内容,从而实现远转移。相当于pop IP pop CS
call指令将当前的IP或CS和IP压入栈中,然后转移
call不能实现短转移,除此以外和jmp指令相同
当使用call 标号时,将当前的IP--注意:是call的下一个指令的IP(因为执行call前,IP就已经+3了)送入栈中
call+reg、call+内存地址(需使用word ptr/dword ptr注明长度)都跟jmp相同,只是要在跳转前将IP/CS和IP压入栈中
OD编译时优化选项按默认设置为Maximize speed。也可以按MinimizeSize优化选项编译一下进行比较,因为选项不同生成的汇编代码也会有所不同。
拆解一个Windows程序要比拆解一个DOS程序容易得多,因为在WIndows中,只要API函数被使用,想对寻找蛛丝马迹的人隐藏东西是比较困难的。因此分析一个程序,用什么API函数作为切入点就显得比较关键了。
一个TraceMe的序列号验证流程为:将姓名与序列号输入到文字框中,程序调用GetDlgItemTextA函数把字符读出来,然后进行计算,最后用函数lstrcmp进行比较。因此,这些调用的函数就是解密跟踪的目标,用这些函数作为断点,跟踪程序的序列号验证过程就能找出正确的序列号。
为了能让OD中断在程序的入口点,加载程序前必须要设置一下。调试选项配置对话框中,对Event标签里进行配置OD对中断入口点、模块加载、卸载、线程创建结束等事件的处理,一般调试只需要将暂停点设置在Entry point of main module 或WinMain即可。
System breakpoint:系统断点,OD用CreateProcessA加载DEBUG_ONLY_THIS_PROCESS参数执行,程序运行之后会触发一个INT3,在系统空间里
Entry point of main module:主模块的入口点,即文件的入口点
WinMain:程序的WinMain()函数入口点,即使设置这个选项,OD一般也只会中断在文件入口点处。
设置好后,打开程序。此时OD会中断在入口点,光标停在4013A0这行,即入口地址。
Ctrl+G可以直接查找源码中调用函数的位置,通过双击/F2可下断点
Alt+B可以打开断点窗口,对所有断点进行管理(暂停、恢复等等)
也可以通过Ctrl+N打开输入表,发现函数后按Enter或右键菜单执行Find references to import命令打开调用此函数的参考代码窗口,找到相应的代码
按Alt+F9回到调用函数的地方,也可以F8单步走出函数。
API函数基本采用的是__stdcall调用约定,即函数入口参数按从左到右的顺序入栈,并由被调用者清理栈中参数,返回值放在eax寄存器中。
观察内存可发现输入的字符,通过修改寄存器可以取消判断,或者让判断失效来达到爆破的目的
完成后可写入磁盘修改文件
C. 明日计划
汇编语言第十章
OD基本操作