首页
论坛
课程
招聘
[分享]《逆向工程核心原理》15-20章总结
2022-11-23 18:53 2229

[分享]《逆向工程核心原理》15-20章总结

2022-11-23 18:53
2229

pushad命令会将EAX~EDI寄存器的值保存到栈。
遇到循环(loop)时,先了解作用再跳出。


快速查找UPX OEP的方法(利用PUSHAD/POPAD的特点):

  1. 在POPAD指令后的JMP指令处设置断点
  2. 在栈中设置硬件断点(硬件断点会在设置断点的指令执行完成后才暂停调试,在执行POPAD的瞬间访问设置有硬件断点的xxx地址,然后暂停调试,其下方即是跳转到OEP的JMP指令)

  • EXE文件无须考虑重定位的问题,因为windows的ASLR安全机制,每次运行EXE文件都会被加载到随机地址
  • 但如果加载的是DLL(SYS)文件,且在ImageBase位置处已经加载了其他DLL(SYS)文件,就会重定位
  • 系统的DLL实际不会发生重定位问题
  • 使硬编码在程序中的内存地址随当前加载地址变化而改变的处理过程就是PE重定位

PE重定位的基本操作原理:

  1. 在应用程序中查找硬编码的地址位置
  2. 读取值后,减去ImageBase(VA → RVA)
  3. 加上实际加载地址(RVA → VA)

最关键的是第一步,会用到PE文件内部的Relocation Table(重定位表),其位于:
IMAGE_NT_HEADERS\IMAGE_OPTIONAL_HEADER\IMAGE_DATA_DIRECTORY[5]

 

其中TypeOffset值为2个字节(16位)大小,由4位的Type和12位的Offset合成。


删除.reloc节区操作步骤:

  1. 整理.reloc节区头
  2. 删除.reloc节区
  3. 修改IMAGE_FILE_HEADER(修改Number of Sections项)
  4. 修改IMAGE_OPTIONAL_HEADER(修改size of Image项,注意节区的大小要根据Section Alignment扩展

 

Upack这个压缩软件太古老了,现在网上的资源都没的下载了,只能用github上的upx压缩代替一下了,在实际调试的时候还是和书上有很多不同的地方。只能从书上领略其中的一些技巧,比如重叠节区、重叠文件头、强制将PointerToRawData识别为0。


 

当难以直接修改指定代码时(运行时压缩/加密),可内嵌补丁。
一个问题:是如何用XOR来加/解密的?

 

补丁代码设置在何处?

  1. 设置到文件的空白区域(补丁代码较少时)
  2. 扩展到最后节区后设置
  3. 添加新节区后设置

  • 重温movs指令:数据从字符串移到字符串。
    movs m8/m16/m32 [edi](目标), m8/m16/m32 [esi](源)

  • 重温rep指令:是重复指令,依赖ecx(计数寄存器)决定重复了多少次


 

至此,本书第二部分完结,第三部分DLL注入稍后就来。


[2022冬季班]《安卓高级研修班(网课)》月薪三万班招生中~

最后于 2022-11-23 19:06 被Sec214编辑 ,原因: 题目忘写了
收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回