您的位置:首页 > 其它

逆向程序

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.也可以这样修改:* ~ ( ) , ? + =

只要符合进制的本质及定义,其他的也不修改。都很麻烦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: