第三篇:逆向之快速排序
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
自己看着都。。。。不是写文章的料啊诶。。
相关文章推荐
- DWR第三篇之逆向Ajax升级
- 逆向之hash算法 ,逆向之选择排序 ,逆向之快速排序
- Android逆向之旅---Android中分析某短视频的数据请求加密协议(IDA静态分析SO)第三篇
- Android逆向之旅---Android中分析某手短视频的数据请求加密协议(IDA静态分析SO)第三篇
- 笔试题:排序、冒泡排序、快速排序
- [置顶] 恶意代码--逆向分析基础入门
- python逆向入门教程
- 快速排序的两种具体实现
- 快速排序
- Android 逆向工程师要求
- 试着写 搜索算法-- 最大逆向匹配分词算法
- APP逆向(上)
- 滴水逆向c++视频
- 逆向编程培训(第二课)
- NOIP2006普及组复赛试题 1.明明的随机数(桶排序,冒泡排序,快速排序)
- 逆向技术
- 快速排序中常见中轴选择方法及实现代码
- java快速排序
- Maven第三篇【Maven术语、pom.xml介绍】
- Java学习第三篇:类的三大特征,抽象类,接口,final关键字