脱壳系列_2_IAT加密壳_详细版_解法1_包含脚本
1 查看壳程序信息
使用ExeInfoPe
分析:
发现这个壳的类型没有被识别出来,Vc 6.0倒是识别出来了,Vc 6.0的特征是 入口函数先调用GetVersion()
2 用OD找OEP
- 拖进OD
发现 这个壳和我们的正常程序很像。但是并不是我们的真正程序入口
因为vc6.0特征的第一个调用的是GetVersion(),给GetVersion()下 硬件断点
//第一次断下来,但是根据栈回溯,调用者并不是我们的模块
//第二次断下来,就应该是了
//找到入口后 栈上右键 反汇编窗口跟随
//如下
在OD看内存布局,一般.rdata的最前面是放的IAT,而且OD数据窗口默认就是.rdata的起始位置。
也可以点一个call /jmp [];看一下来找IAT表
对那个地方下一个硬件写入断点 --DWORD,即当前面的壳程序在修改的时候就能段下来找到壳的加密算法的地方
3 对加密部分分析
这个分析的过程,需要自己去啃,是分享不了的。
我是从GetProcAddress 开始分析的,过程中往前观察分析了几次来解答这里的一些寄存器的内容信息、局部变量的信息,以下是我主要分析的部分:
- 通过对IAT表位置下硬件写入断点,我们找到了这个修改IAT的地方
断下这个GetProcAddress()这个函数 调用之后EAX保存的是 当前要填入IAT的真实地址
004385B9 FF15 CC924300 CALL DWORD PTR DS:[0x4392CC] ; kernel32.GetProcAddress
//开始怀疑修改进IAT的函数内容--加密代码前面几句--写死的硬编码opcode 到底意欲何为:
在内存窗口跳到[EBX-0X30]选择反汇编观察一下:
- 发现 这就是解密IAT代码。
总结:用硬编码 opcode (用于解密IAT)的首地址替代IAT中的函数地址,然后每次IAT调用的时候都会去调用这个代码块使用。
4 分析了加密算法了流程后
- 这时候我们只需要保存正确的函数地址值到IAT,那么这个程序就能脱掉了。
然后和前面几篇一样的流程dump到本地,用impREC修复一下IAT
运行没毛病!!
附:还可以使用OD脚本修正IAT
思路:
调用getprocAddress之后,立刻使用一个临时变量保存起来,
再待壳修改IAT后,立刻修改回正确的函数地址(前面保存的临时变量)
脚本如下:
//.定义变量 MOV dwGetApiAddr,004385bf MOV dwWriteAddr,004385f0 //.初始化环境 BC //清除软件断点 BPHWC //清除硬件断点 BPMC //清除内存断点 //下硬件执行断点 BPHWS dwGetApiAddr,"x" BPHWS dwWriteAddr,"x" BPHWS dwOEP,"x" //.构建逻辑 /* -- 用一个临时变量来存储 真正的函数地址 -- 在加密逻辑代码执行完,并且写入IAT后,立刻改回 */ LOOP0: RUN //相当于od -- F9 CMP dwGetApiAddr,eip//如果是执行完GetProcAddress后 JNZ CASE1 mov dwTemp,eax JMP LOOP0 CASE1: CMP dwWriteAddr,eip MOV [edi],dwTemp JMP LOOP0 CASE2: CMP dwOEP,eip JNZ LOOP0 MSG "改回来了哈哈"
脱壳系列_2_IAT加密壳_详细版_解法1_包含脚本的更多相关文章
- 脱壳系列_2_IAT加密壳_详细版解法1(含脚本)
1 查看壳程序信息 使用ExeInfoPe 分析: 发现这个壳的类型没有被识别出来,Vc 6.0倒是识别出来了,Vc 6.0的特征是 入口函数先调用GetVersion() 2 用OD找OEP 拖进O ...
- 脱壳系列_0_FSG壳_详细版
---恢复内容开始--- 1 查看信息 使用ExeInfoPe查看此壳程序 可以看出是很老的FSG壳. 分析: Entry Point : 000000154,熟悉PE结构的知道,入口点(代码)揉进P ...
- 脱壳系列(一) - CrypKeySDK 壳
程序: 运行 用 PEiD 载入程序 PEid 显示找不到相关的壳 脱壳: 用 OD 载入程序 这个是壳的入口地址 因为代码段的入口地址为 00401000 这三个是壳增加的区段 按 F8 往下走程序 ...
- 脱壳系列(五) - MEW 壳
先用 PEiD 看一下 MEW 11 1.2 的壳 用 OD 载入程序 按 F8 进行跳转 往下拉 找到这个 retn 指令,并下断点 然后 F9 运行 停在该断点处后再按 F8 右键 -> 分 ...
- 脱壳系列(四) - eXPressor 壳
先用 PEiD 查一下壳 用 OD 载入程序 这里有一串字符串,是壳的名称和版本号 按 Alt+M 显示内存窗口 这里只有三个区段,后面两个是壳生成的,程序的代码段也包含在里面 利用堆栈平衡 按 F8 ...
- 脱壳系列(二) - EZIP 壳
程序: 运行程序 用 PEiD 查壳 EZIP 1.0 用 OD 打开 按 F8 往下走 这个看似是 OEP 的地方却不是 OEP 因为代码段从 00401000 开始 可以看到,壳伪造了 3 个区段 ...
- CleanMyMac 4破解版-最强中文版_破解版_激活码_注册码
最新版CleanMyMac 4中文版本已经发布了,也受到了广大用户的喜爱.众所周知, 注册码是开启软件的钥匙,在获取软件安装包之后需要有效的注册码才能激活软件.但是关于CleanMyMac 4注册码的 ...
- CleanMyMac 3.7.5最强中文版_激活码_破解版_下载_注册码
版权归作者所有,任何形式转载请联系作者.作者:缘来远去(来自豆瓣)来源:https://www.douban.com/note/612586476/ 最新版CleanMyMac 3中文版本已经发布快要 ...
- 脱壳系列—— 揭开so section加密的美丽外衣
i春秋作家:HAI_ 0×00 前言 对so的加密,https://bbs.pediy.com/thread-191649.htm大神的帖子里已经很详细的说明了.当然加密不是我们研究的重点,如何搞掉这 ...
随机推荐
- Scala 学习之路(九)—— 继承和特质
一.继承 1.1 Scala中的继承结构 Scala中继承关系如下图: Any是整个继承关系的根节点: AnyRef包含Scala Classes和Java Classes,等价于Java中的java ...
- Scala 学习之路(六)—— 常用集合类型之 List & Set
一.List字面量 List是Scala中非常重要的一个数据结构,其与Array(数组)非常类似,但是List是不可变的,和Java中的List一样,其底层实现是链表. scala> val l ...
- Codeforces Round #568 (Div. 2)B
B. Email from Polycarp 题目链接:http://codeforces.com/contest/1185/problem/B 题目: Methodius received an e ...
- Mysql索引优化之索引的分类
Mysql的历史 简单回顾一下Mysql的历史,Mysql 是一个关系型数据库管理系统,由瑞典 Mysql AB 公司开发,目前属于 Oracle 公司.关系型数据库将数据保存在不同的表中,而不是将 ...
- [apue] 多进程管道读写的一些疑问
对于一对一的pipe: 1) 写进程关闭写管道后,读进程继续读管道会导致read返回0: 2) 读进程关闭读管道后,写进程继续写管道会激发SIGPIPE信号,若捕获,则write返回-1: 而对于多对 ...
- kafka入门(一)简介
1 什么是kafk Apache kafka是消息中间件的一种,在开始学习之前,先简单的解释一下什么是消息中间件. 举个例子,生产者消费者,生产者生产鸡蛋,消费者消费鸡蛋,生产者生产一个鸡蛋,消费者就 ...
- spring源码深度解析— IOC 之 bean 的初始化
一个 bean 经历了 createBeanInstance() 被创建出来,然后又经过一番属性注入,依赖处理,历经千辛万苦,千锤百炼,终于有点儿 bean 实例的样子,能堪大任了,只需要经历最后一步 ...
- jacoco生成覆盖率报告
操作步骤: 1.下载git上最新的代码到本地 git clone {代码地址} 2.在服务器上打出相关服务的jar包 1) 登上服务器,切换到目标服务所在路径: cd /xx/xx/xx/xx 2) ...
- 在FPS游戏中,玩家对音画同步感知的量化与评估
前言 在游戏测试中,音画同步测试是个难点(所谓游戏音画同步:游戏中,音效与画面的同步程度),现在一般采用人工主观判断的方式测试,但这会带来2个问题: 无法准确量化,针对同一场景的多次测试结果可能会相反 ...
- c++二分查找
c++二分查找 题目是在一些数字里找出一个数字,并输出他在第几行 代码 + 注释 #include <stdio.h> #include<iostream> using nam ...











