第三篇:逆向之快速排序

下面是这次逆向分析的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


自己看着都。。。。不是写文章的料啊诶。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
逆向工程是一种通过对已有产品、软件或技术进行分析、研究和逆向推导,以揭示其设计、功能和运行原理的方法。它是为了获取对原产品的理解,从而进行改进、研究或模仿而进行的活动。 逆向工程使用各种技术和工具来研究产品的内部结构,包括软件反编译、硬件分析、电路追踪等。逆向工程的目的可能是为了获取技术上的好处,比如了解竞争对手的产品设计,学习新技术,提高产品的兼容性和易用性等。同时,逆向工程也经常用于软件安全领域,以发现潜在的漏洞和安全问题。 逆向工程需要有深入的技术知识和经验。研究人员需要拆解产品,进行逐层分析和测试。他们可能会使用一些特殊的工具和软件,例如反汇编器、调试器、仿真器等。通过逆向分析,研究人员可以了解产品的工作原理、算法、数据结构等核心内部信息。 尽管逆向工程在学术、商业和安全领域有着广泛的应用,但也存在着争议。一些公司对其进行严格保护和法律限制,防止他人逆向他们的产品。同时,逆向工程也可能被不法分子用于非法活动,如逆向工程软件获得非法利益。 总之,逆向工程是一种既有科学性、又有实践价值的技术活动。它为技术研究、产品改进、安全评估等提供了重要的途径和方法。但在进行逆向工程时,需要遵守法律法规,尊重知识产权,确保合法合规。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值