逆向程序
2016-06-03 12:25
169 查看
逆向一段程序
一、从整体上了解一个EXE程序
从整体上认识这一堆二进制数据。(相当于你到北京来需要买一个地图。) 任何一个在win上运行的可执行文件都需要遵守一定的格式,这个结构就是PE(exe。Dll。sys)。
为什么要了解PE结构。如果分析一个程序,那么有几个步骤:
第一:程序是从哪里开始执行的。第二:代码藏在哪里。代码基址()。
第三:数据藏在哪里。数据的基址()。
不管数据还是代码,最终存储到内存都是0和1,了解pe文件结构,才知道这一块存的是什么。
Byte:1个字节; word:2字节; dword:4个字节。
只有win操作系统是低位在前。
我最近也发现一个问题,代码段的才需要看。找一个helloword,从最开的断点 单步记录下来,带调试符号,分析一遍。 以后见到了就不怕了。
为什么都是从ntdll 中的一个call开始的(有5个参数)。Call edx。
PE文件结构是逆向、外挂、入侵、病毒必须掌握的。
向pe中注入病毒。(使用二进制工具对比查看)
二、 从细节处入手
逆向一段程序:
PE查看器->找到代码段起始地址->
找到第一个函数:
那找到的函数体保存在哪呢?一
会试一下。 从导入表的文件偏移来看,是在代码区,并且从od中看,代码区也有系统好多东西.
55 8b 83 bc 。。。。。
编 码:55 8b bc 就是函数头。
学习硬编码,把硬编码转换为二进制代码:(我认为常见的应该背过)
55 push ebp。。。
原因:好多有反调试,一开od就蓝屏(用的od被提串了,提取特征码,把市面上的od的核心算法都找到,检测。大的工作室从不用市面流通的调试工具。杨哥。)
写一些自动分析的工具:比如自动找call,参数分析等等。
逆向的过程:
二进制——-> 汇编—–大部分人—–>C语言
分析一个 外部a+b的程序。
{
跟完这个程序,然后顺便用vs跟了一遍,到里面发现一个有意思的程序。checkmangerapp 在checkesp之后,居然在解析pe。也可以参考windows是怎么解析的,抠出来代码。
二是把crtexe.c跟一遍,看看这家伙都在干嘛呢。一天弄的烦人。
}
写一个解析pdb文件的.
三、逆向思路(下面各分项均需开专题)
1.找数据的方式
Debug 是通过base+偏移的方式来找Release 是通过 top +偏移来找的。
2.逆向er 眼中没有数据和代码之分。
贴 指向数据的代码。函数指针:
什么时候用函数指针,就是你用别人写的代码,程序啥也没给你,没头问及那没lib文件,把程序拿过来,分析里面的函数,分析完了发现有个函数的功能对我来说挺有用,通过逆向发现这个函数有两个参数,有一个返回值。那我就想调用它,和上次写注册机一样。怎么办,你就typedef 一个函数指针,在程序中找到函数地址,把地址赋值给函数指针,就能调用了。
因此,我们是可”通过函数指针执行一段代码的”。
对于一般程序,有代码区,数据区,但是对于逆向,没有区别,我让你是什么就是什么。我可以把这段代码抠出来,放到一个全局变量里去,全局变量是放在数据区的。
0x00158000 处的第一机会异常(在 函数指针.exe 中): 0xC0000005: 执行位置 0x00158000 时发生访问冲突。
断点未能绑定。
558BEC81ECCC0000005356578DBD34FFFFFFB933000000B8CCCCCCCCF3ABC745F8020000008B450803450C5F5E5B8BE55DC3
3.变形的艺术
数据入栈:Mov eax,0x88888888 Push eax
变形:
Mov eax,0x88888888 Mov dword ptr ds:[esp] ,eax Lea esp,dword ptr ss:[esp-4] Push eax 相当于: lea esp, dword ptr ss:[esp-4]; mov dword ptr ss:[esp],eax 或者 Mov dword ptr ss:[esp-4], 所谓的push eax,就是压到栈里,然后让栈的地址提升(减小)。通过别的相同的方式达到相同的目的。 所有的push 、pop都变成自己的方式。Push、pop 在逆向中是重点盯防的。---就是虚拟机吧,老x说的就变一条 call。
4.逆向得一堆一堆的看,先熟悉整个流程。
以后分析程序,不要见到call就进去,那样会累死的,先把外层的分析完,再回头去分析这个call做了什么(根据参数、返回值)推测其功能。5.重点盯防 Push、pop、eax。
call之后:
- mov dword ptr [ebp-0x1C],eax
也有可能返回值存放在一块内存中。
6.如何判断函数有几个参数。
_cdecl 外平栈 - call之后 add esp+0x xx_stdcall 内平栈 - 跟到函数内部看–> ret n
_fastcall 关注 ecx、edx、函数内部—ret n
上面的都需要结合函数前面的 push进行推测。
7.查看API
1.逆向的时候根据调用的API推测功能2.逆不出来–先写注释。
3.自己是调用这个函数的,写个Demo,跟进一下。
4.举例:VirtualProtectEx()
8.搜集整理一些特征码
1.查看PEid的特征码2.虚拟机中查看其他编译器的入口点
3.对一些常用的 数据结构、函数 结合 裸函数进行调用模拟。
9 要防止用进制加密。
十进制1.默认:0 1 2 3 4 5 6 7 8 9
2.修改:0 1 2 5 7 9 3 4 6 8
3.也可以这样修改:* ~ ( ) , ? + =
只要符合进制的本质及定义,其他的也不修改。都很麻烦。
相关文章推荐
- 第13章 MySQL 数据库与JDBC编程
- 自定义Camera,闪光灯,相机切换,相机聚焦
- 【Java 基础】Java 局部变量、实例变量、类变量(静态变量)区别
- 【Android】广播机制 Broadcast
- 在势不可挡和快速变化的现代web开发中 所需要学习的前端技能
- 嵌入式Linux基础知识2(嵌入式Linux开发环境搭建)
- 【tomcat】获取访问者真实IP
- 关于(WinCE系统).Net Framework 3.5平台通用复制和粘贴程序实现
- DBCP链接有效性验证的两种配置方案
- 特殊符号 UNICODE编码
- python challenge 0-6关 攻略
- Linux 进程控制
- Xcode及模拟器快捷键
- 代码规范
- Xcode7 制作通用的framework(转)
- vim编辑器使用教程
- [leetcode] 21. Merge Two Sorted Lists
- jva 线程的生命周期和状态控制
- webpack入门(二)——webpack使用
- iOS移动View点击事件(二)