大三上学期《软件逆向工程》考前整理。现在看好像都忘得差不多了...
第一章-前言
-
逆向工程的应用:
-
逆向工程的应用(动态、静态)
-
闭源软件漏洞分析(发现和分析漏洞、开发破解程序(exploit))
-
闭源软件互操作性分析(只能获得二进制程序而想开发与其互操作的软件;依据已有程序,开发适用于其他硬件平台的程序)
-
验证编译器的性能和准确性(验证编译器是否符合规范;寻找优化编译器输出的方法;编译器本身是否有安全问题.
-
-
逆向工程的合法性
-
以互操作为目的的逆向工程
-
当软件版权所有者无法进行软件错误修正时,通过逆向工程对软件错误进行修正和破解
-
在不违反专利权或商业秘密保护的前提下,通过逆向工程确定软件中不受版权保护的部分(如一些算法)
-
第二章-86_x64:
-
x86:Intel体系结构的32位实现,基于Intel8086处理器的小端序体系结构
-
三种主要操作模式:
-
实模式(real):只支持16位指令集
-
保护模式(protected):支持虚拟内存、分页等
-
系统管理模式(System Management Mode):用于执行嵌入在固件中的特殊代码
-
-
小端序(little endian):低位字节存储在内存中低位地址,效率较高;大端序(RISC架构采用)
-
用户态应用运行于Ring3,内核运行于Ring0。Ring等级在CS寄存器中保存。
-
EFLAGS:
- ZeroF:结果0->ZF=1
- OverflowF:有符号整数溢出时OF=1
- CarryF:无符号整数溢出时CF=1
- SignF:与最高位相同
- DirectionF:=1则ESI、EDI每次减小
-
Byte->1 Word->2 Dword->4
-
scas->AL/AX/EAX与[EDI]比较,并对EDI自增/自减,STOS->AL/AX/EAX的值写入EDI指向的内存
第四章-PE结构:
3C->PE头地址
第五章-Windoes编程
核心API
- OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)
- CreateRemoteThread(hProcess, NULL, 0, lpStartAddress, lpParameter, 0, NULL)
- VirtualAllocEx(hProcess, NULL, dwBufSize, MEM_COMMIT, PAGE_READWRITE)
- hThread = CreateThread(NULL,0,lpStartAddress,lpParameter,0,&dwThread)
- WriteProcessMemory(hProcess,lpBaseAddress,lpBuffer,nSize,Out SIZE_T *lpNumberOfBytesWritten)
- GetProcAddress(hModule->DLL模块的句柄可由LoadLibrary等返回, lpProcName名或序数)
- WaitForSingleObject(hHandle-必有synchronize权限, dwMilliseconds)
- GetModuleFileName(hModule-被装载模块句柄,NULL则返回当前进程可执行文件路径,Out LPTSTR lpFilename,nSize-大于则截尾)
- GetModuleHandle(lpModuleName-被装载模块(.dll或.exe文件)名称,若省略扩展名则默认为.dll,若为NULL,则返回创建当前进程的.exe的句柄)
- CloseHandle(hObject)
- SetWindowsHookEx(idHook,lpfn-指向(回调函数)的指针,hMod-指向回调函数所在DLL的句柄,dwThreadId-被关联到的线程的ID)
- CallNextHookEx(hhk,nCode-传递到当前钩子过程的钩子代码,wParam,lParam)
- UnhookWindowsHookEx(hhk-被移除钩子的句柄,由前一次调用的SetWindowsHookEx函数返回)
第六章-DLL注入
1.注入方法:实现远程线程CreateRemoteThread()、使用注册表AppInit_DLLs值、消息钩取SetWindowsHookEx()
第七章-API钩取
第八章-混淆技术
- 防篡改技术分为静态和动态,混淆属于静态技术
- 基于数据的混淆:常量展开/插入死代码/数据编码方案(f,x-混淆->f(x0),解混淆时f(x0)-恢复->x0)
- 等价-x=~x+1,x-1=~(-x),x+1=-(~x)
- 基于控制的混淆:组合使用函数内联与外联/引入无条件分支,破环局部性/插入垃圾代码/基于处理器的控制间接化/不透明谓词