您的位置:首页 > 其它

第三篇:逆向之快速排序

2012-05-06 17:02 148 查看
下面是这次逆向分析的C源代码,优化选项是O2,不过严重怀疑O2和无优化是不是没区别对于这种小程序来说。。。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 100
#define SWAP(x,y,t) ((t)=(x),(x)=(y),(y)=(t))

void QuickSort(int p[],int start,int end)
{
int i,key,temp,j;
if(start<end)
{
i=start;
j=end+1;//bigest index +1 because --j
key=p[start];//key element is the first
for(;;)
{
while(i<j&&p[--j]>key) {}//find  element that less than the piovt of the
while(i<j&&p[++i]<key) {}//find  element that greater than the piovt of the
//above Circulation order should strictly Abide by
if(i<j)
SWAP(p[i],p[j],temp);//swap
else
break;
}
SWAP(p[i],p[start],temp);//swap piovt and i(this moment i==j)
QuickSort(p,start,i-1);
QuickSort(p,i+1,end);
}
}

int main()
{
int i;
int a[10];//={5,8,15,2,13,7,0,1,25,9};
srand((unsigned)(time(0)));
for(i=0;i<10;i++)
a[i]=rand()%10;
QuickSort(a,0,9);
for(i=0;i<10;i++)
printf("%3d",a[i]);
system("pause");
return 0;
}

这里主函数就贴了,直接贴排序函数,这个函数也不知道怎么讲。。个人感觉比较难
而且源码的第2个递归调用直接优化掉了,如果要反出源码应该会比较难
00251000 >/$  8B4424 0C     mov     eax, dword ptr [esp+C]           ;  eax存储第3个参数
00251004  |.  53            push    ebx
00251005  |.  8B5C24 0C     mov     ebx, dword ptr [esp+C]           ;  ebx存储第2个参数
00251009  |.  3BD8          cmp     ebx, eax
0025100B  |.  7D 67         jge     short 00251074
0025100D  |.  55            push    ebp
0025100E  |.  56            push    esi
0025100F  |.  57            push    edi
00251010  |.  8B7C24 14     mov     edi, dword ptr [esp+14]          ;  edi存储要排序数据地址
00251014  |>  8B0C9F        /mov     ecx, dword ptr [edi+ebx*4]      ;  在下面整个循环里,esi是自增下标i,eax是自减下标j
00251017  |.  8BF3          |mov     esi, ebx
00251019  |.  40            |inc     eax
0025101A  |.  8D9B 00000000 |lea     ebx, dword ptr [ebx]
00251020  |>  3BF0          |/cmp     esi, eax                       ;  下面这2个小循环是一个类型,仔细看下就行,在不远处有个jmp其实就是个大循环
00251022  |.  7D 28         ||jge     short 0025104C
00251024  |.  48            ||dec     eax
00251025  |.  390C87        ||cmp     dword ptr [edi+eax*4], ecx
00251028  |.^ 7F F6         ||jg      short 00251020
0025102A  |.  8D9B 00000000 ||lea     ebx, dword ptr [ebx]
00251030  |>  3BF0          ||/cmp     esi, eax
00251032  |.  7D 18         |||jge     short 0025104C
00251034  |.  46            |||inc     esi
00251035  |.  390CB7        |||cmp     dword ptr [edi+esi*4], ecx
00251038  |.^ 7C F6         ||\jl      short 00251030
0025103A  |.  3BF0          ||cmp     esi, eax
0025103C  |.  7D 0E         ||jge     short 0025104C
0025103E  |.  8B2C87        ||mov     ebp, dword ptr [edi+eax*4]     ;  SWAP(a[b],a[c])
00251041  |.  8B14B7        ||mov     edx, dword ptr [edi+esi*4]
00251044  |.  892CB7        ||mov     dword ptr [edi+esi*4], ebp
00251047  |.  891487        ||mov     dword ptr [edi+eax*4], edx
0025104A  |.^ EB D4         |\jmp     short 00251020
0025104C  |>  8B0C9F        |mov     ecx, dword ptr [edi+ebx*4]      ;  SWAP(a[b],a[c])
0025104F  |.  8B04B7        |mov     eax, dword ptr [edi+esi*4]
00251052  |.  8D56 FF       |lea     edx, dword ptr [esi-1]
00251055  |.  52            |push    edx
00251056  |.  53            |push    ebx
00251057  |.  890CB7        |mov     dword ptr [edi+esi*4], ecx
0025105A  |.  57            |push    edi
0025105B  |.  89049F        |mov     dword ptr [edi+ebx*4], eax
0025105E  |.  E8 9DFFFFFF   |call    QuickSort
00251063  |.  8B4424 28     |mov     eax, dword ptr [esp+28]         ;  eax=第3个参数
00251067  |.  8D5E 01       |lea     ebx, dword ptr [esi+1]          ;  ebx=i+1
0025106A  |.  83C4 0C       |add     esp, 0C
0025106D  |.  3BD8          |cmp     ebx, eax
0025106F  |.^ 7C A3         \jl      short 00251014
00251071  |.  5F            pop     edi
00251072  |.  5E            pop     esi
00251073  |.  5D            pop     ebp
00251074  |>  5B            pop     ebx
00251075  \.  C3            retn


自己看着都。。。。不是写文章的料啊诶。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c 优化 存储 less system