软件逆向工程复习整理

大三上学期《软件逆向工程》考前整理。现在看好像都忘得差不多了...

第一章-前言

  1. 逆向工程的应用:

    • 逆向工程的应用(动态、静态)

    • 闭源软件漏洞分析(发现和分析漏洞、开发破解程序(exploit))

    • 闭源软件互操作性分析(只能获得二进制程序而想开发与其互操作的软件;依据已有程序,开发适用于其他硬件平台的程序)

    • 验证编译器的性能和准确性(验证编译器是否符合规范;寻找优化编译器输出的方法;编译器本身是否有安全问题.

  2. 逆向工程的合法性

    • 以互操作为目的的逆向工程

    • 当软件版权所有者无法进行软件错误修正时,通过逆向工程对软件错误进行修正和破解

    • 在不违反专利权或商业秘密保护的前提下,通过逆向工程确定软件中不受版权保护的部分(如一些算法)

第二章-86_x64:

  1. x86:Intel体系结构的32位实现,基于Intel8086处理器的小端序体系结构

  2. 三种主要操作模式:

    • 实模式(real):只支持16位指令集

    • 保护模式(protected):支持虚拟内存、分页等

    • 系统管理模式(System Management Mode):用于执行嵌入在固件中的特殊代码

  3. 小端序(little endian):低位字节存储在内存中低位地址,效率较高;大端序(RISC架构采用)

  4. 用户态应用运行于Ring3,内核运行于Ring0。Ring等级在CS寄存器中保存。

  5. EFLAGS:

    • ZeroF:结果0->ZF=1
    • OverflowF:有符号整数溢出时OF=1
    • CarryF:无符号整数溢出时CF=1
    • SignF:与最高位相同
    • DirectionF:=1则ESI、EDI每次减小
  6. Byte->1 Word->2 Dword->4

  7. scas->AL/AX/EAX与[EDI]比较,并对EDI自增/自减,STOS->AL/AX/EAX的值写入EDI指向的内存

第四章-PE结构:

3C->PE头地址

第五章-Windoes编程

核心API

  1. OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)
  2. CreateRemoteThread(hProcess, NULL, 0, lpStartAddress, lpParameter, 0, NULL)
  3. VirtualAllocEx(hProcess, NULL, dwBufSize, MEM_COMMIT, PAGE_READWRITE)
  4. hThread = CreateThread(NULL,0,lpStartAddress,lpParameter,0,&dwThread)
  5. WriteProcessMemory(hProcess,lpBaseAddress,lpBuffer,nSize,Out SIZE_T *lpNumberOfBytesWritten)
  6. GetProcAddress(hModule->DLL模块的句柄可由LoadLibrary等返回, lpProcName名或序数)
  7. WaitForSingleObject(hHandle-必有synchronize权限, dwMilliseconds)
  8. GetModuleFileName(hModule-被装载模块句柄,NULL则返回当前进程可执行文件路径,Out LPTSTR lpFilename,nSize-大于则截尾)
  9. GetModuleHandle(lpModuleName-被装载模块(.dll或.exe文件)名称,若省略扩展名则默认为.dll,若为NULL,则返回创建当前进程的.exe的句柄)
  10. CloseHandle(hObject)
  11. SetWindowsHookEx(idHook,lpfn-指向(回调函数)的指针,hMod-指向回调函数所在DLL的句柄,dwThreadId-被关联到的线程的ID)
  12. CallNextHookEx(hhk,nCode-传递到当前钩子过程的钩子代码,wParam,lParam)
  13. UnhookWindowsHookEx(hhk-被移除钩子的句柄,由前一次调用的SetWindowsHookEx函数返回)

第六章-DLL注入

1.注入方法:实现远程线程CreateRemoteThread()、使用注册表AppInit_DLLs值、消息钩取SetWindowsHookEx()

第七章-API钩取

第八章-混淆技术

  1. 防篡改技术分为静态和动态,混淆属于静态技术
  2. 基于数据的混淆:常量展开/插入死代码/数据编码方案(f,x-混淆->f(x0),解混淆时f(x0)-恢复->x0)
  3. 等价-x=~x+1,x-1=~(-x),x+1=-(~x)
  4. 基于控制的混淆:组合使用函数内联与外联/引入无条件分支,破环局部性/插入垃圾代码/基于处理器的控制间接化/不透明谓词
updatedupdated2020-05-252020-05-25