下面是这次逆向分析的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
自己看着都。。。。不是写文章的料啊诶。。