ZC: IDA新的模式"proximity view",快捷键:"-"触发"proximity view"(应该是小键盘减号),"+"放大返回到 函数
1、
【01:30】笨笨雄(nemo314@gmail.com) 写的教程
【03:22】重新载入exe,关闭时 的设置 【03:28】重新载入的时候,IDA会自动定位到程序入口
【03:36】IDA -->Options-->General...-->标签页"Disassembly"-->将"Line prefixes (graph)" 勾上,将"Number of opcode bytes (graph)"(操作码)设置为6 --> OK 【04:20】"Graph overview"
【05:00】注释 的快捷键 分号";"
【05:36】将 脱壳点 记录一下,用OD将它脱壳 【07:52】用LoadPE "纠正镜像大小"-->"完全脱壳" 【08:42】ImportREC_chs修复IAT
【10:45】介绍IDA功能,如何使用。以后单独一课再讲...
【13:11】见一下什么叫 交叉引用:程序中相互调用的地方。导入表 里面肯定是交叉引用的
【13:35】RegQueryValueExA,有"↑"的地方 就是交叉引用,双击"↑"处 随表来到一个交叉引用的地方
【】ZC: 上面这段 没听怎么明白...
【15:25】快捷键
【16:50】IDC(脚本)(这个部分 可以暂时 跳过,比较复杂)
【18:00】下节课 "静态脱壳",里面有一些 被混淆过的代码,反汇编出现混乱
【未完毕,有未听懂的部分】
2、
【00:55】看雪上面的一个例子
【01:25】静态脱壳的优点
【02:05】dump 【02:10】dump之后的程序是不能直接运行起来的 【02:13】dump 和 脱壳 是不一样的(ZC: 哪里不一样??)
【02:50】IDA 分析完毕
【03:03】两句一个jmp,两句一个jmp,这就很想是 被混淆过,被VM过的(ZC: 你确定是 被VM过?这里确实是在 破VM??)
【03:13】IDA 中出现:"start endp ; sp-analysis failed" 分析失败了,它无法再往下分析了,能分析出来的代码 也就这么多了
【03:30】看到 "pusha",找一下"popa"
【04:10】拖来拖去 没找到 "popa"
【04:15】用OD来找,看看是不是反调试的。这个(ZC: 是指这个正在被研究的exe程序吗?)应该是没有反调试 这么强大的功能
【04:38】直接在 OD中,"查找命令" 来找 "popad"
【04:40】这里 有 "popad",在"0045A5BF"附近
【04:50】看到这里,连续两组"pushad"和"popad",它明显是花指令 它就是为了不让你一下子定位到 "pushad"&"popad" 附近。所以说 我们这里 直接通过 "pushad"&"popad" 的方法是不可以的
【05:15】"popad" 在 "start endp ; sp-analysis failed" 的下面,再往下走 (ZC: 如何证明你说的?能看到 现在分析到的地方的地址吗?)
【05:38】把鼠标放到 最后一行。 IDA--> "IDA Options"--> Disassembly--> "Line prefixes" √上,"Number of opcode bytes"填入"6"--> OK (ZC: 这下 显示汇编地址了)
【05:45】然后,按 空格键 切换一下
【06:05】来到 "start endp ; sp-analysis failed"的地方,下面有一个 红色的交叉引用,红色的交叉引用 说明 代码中分析有冲突。上面 或者 下面 不管哪个地方,程序中肯定是有冲突的 【06:18】看 导航带,它有 很多深红色的地方,表示 代码被混淆过的。
【06:25】ZC: 可以看到,红色代码地址部分是 004560FF,下面一句代码"call sub_4560FF"的地址是 00456104,下面的函数开始的地址是 00456109 。
【06:40】首先 选到 红色"sub_4560FF endp; sp-analysis failed"的上面(ZC: 貌似 地址是一样的)(ZC: 注意,不是 "start endp ; sp-analysis failed"!!)
【06:52】把它转成数据,这里 按 键盘键"D"(ZC: 提示是"Directly convert to data?")
【07:07】转换成数据之后,是这个样子的,机器码(ZC: 怎么感觉 把下面的指令也一起转了?见【06:25】) 可以看到机器码 【07:17】IDA--> "IDA Options"--> Disassembly--> "Line prefixes" √上,"Number of opcode bytes"填入"6"--> OK
【07:20】E8 Eb ...,E8 其实就是一个"call"(ZC: 也就是CALL 00000CEB?注意call后面跟的是偏移值),根本就没有这个地址 这个地址是错误的。【07:40】这里 其实就是一个短的jmp(0xEB)
【07:50】在 地址00456100处,按 键C,将 数据 转成 代码,是这4个:"E8 0C 00 00"(ZC: 从地址低位-->高位))(ZC: jmp指令 一共4位?)【08:05】这里看起来,jmp指令一共就2位?(ZC: 还是说 短jmp是 E8+1字节偏移,长jmp是E8+4字节偏移?段间跳转呢?jmp 段:偏移?具体说明指令?)
【08:22】00456104处的代码 " call near ptr byte_4560FF" 也是一个错误的 迷惑反汇编工具的 地方,它直接call到上面的004560FF 然后就来到 "sub_4560FF endp; sp-analysis failed"处(乱码,IDA分析不出来的地方)
【08:40】这里 也转换成 数据(ZC: 转出来是 00 00 E8 F6 FF FF FF)
【08:55】其实 它的乱码已经分析出来了 其实就是这个样子的(ZC: 纳尼?这就算分析出来了?)
【09:10】将 花指令 【09:26】刚才的这一段"00 00 E8 F6 FF FF FF" 就是 花指令(上面的那个 单独的 0E8h也是花指令)
【09:35】统计出来 就是这样
【09:45】用记事本进行整理
【10:10】先在这一句上 "call sub_456109",然后 "db 0E8h"就是花指令 【10:37】然后 "jmp short loc_45610E" 也是(花指令),接下来 2句"db 0" + "db 0E8h" + "db 0F6h" + "db 0FFh" "db 0FFh" "db 0FFh" 【11:52】这里的花 是很简单的花,像VM过的花 简直跟天书一样 很难读懂
【12:15】这一段 已经搞定了 (ZC: 没明白啊...这一段怎么就 花 了?如何去掉花指令?为什么是那样操作来去掉花指令?)
【12:18】接下来 一个 "call label2",其实就是代码里面的"call loc_456100" 它又跳转回来了
【13:10】添加 标号 【14:25】配合着 原教程的Word内容 一起讲解 比较能接受了
【14:40】这就是 第1段花指令
【15:12】它是向正常代码中插入一些 花指令,然后 IDA误认为 这个"E8"是个call 其实 就是一个垃圾数据。【15:23】IDA 将 "E8"误认成call后 后面的FFFFFFF6 就是要call的函数 但是FFFFFFF6是无效的,于是IDA分析不下去了 就无法再往下汇编了
ZC: 我的理解:∵ IDA 是静态的反汇编器,∴它不知道哪些指令会实际被执行到 哪些不会被实际执行到,于是 它只能将所有指令都分析一下,而 花指令就是利用这个特点 来误导欺骗IDA。这种的花指令的话,应该使用OD等动态分析工具 就可以应付了,但是用OD的话 又会有另外的问题 如调试器检测退出等,需要很好的隐藏OD。
【15:35】接下来 解决 第2段花指令
【15:45】通过4段花指令,写出来脚本,将花指令排除掉,将整个程序的花指令全部脱干净
【16:20】ZC: 如何知道这一段是花?如何定位的?
【16:30】先不管这一段 花指令,∵这2句并没有被混淆过。被混淆过的应该是 红色的地方。
【16:45】首先 先看 0045611F的地方,将它转换成 数据
【16:55】00456119处 明显也是被混淆过的,也转换成 数据
【17:07】00456117处 明显也是被混淆过的,也转换成 数据
【17:20】00456115处 明显也是被混淆过的,也转换成 数据
【17:30】选择 00456117处
【17:35】ZC: 他这里 是看了 Word教程 才去 00456117处 的,如果没有这个Word教程的话,我们如何定位到 00456117处?00456117处 有何特殊?【17:39】ZC: 可以看到 00456113处 也有一个 红色区域
【17:41】00456115处 的 "EB 02" 并不是 jmp,00456117处 的 "EB 01" 才是jmp,jmp到 00456119处(ZC: 为何 前者不是jmp,后者是 jmp?)【17:51】00456117处 转换成 代码(键盘C),变成"jmp short loc_45611A"
【未完】
3、
4、
5、
来源:https://www.cnblogs.com/debugskill/p/7161580.html