第一篇:逆向之hash算法

本文深入探讨了逆向工程中的hash算法分析,从字节操作到查找与插入策略,揭示了算法优化的关键点。
摘要由CSDN通过智能技术生成

 

此算法为hash中比较简单的线性探测法,代码优化选项OD(无)
顺便说句,这些算法实现大多会拿我在学数据结构的时候自己实现的或者书上的,所以风格编码肯定不能和百度到的那些比,权当练练手,不过物尽其用吧,也不枉费当时特意把这些代码保存下来,嘿嘿
以下为C的算法代码:
//线性探测
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define MAX_SIZE 13
#define b 13

char *ht[MAX_SIZE];

int stringtoint(char *key)
{
	int number;
	for(number=0;*key;key++)
		number+=*key;
	return number;
}

int f(int k)
{
	return k%b;
}

char* search(char* key)
{
	int current,homebucket;
	homebucket=f(stringtoint(key));
	for(current=homebucket;ht[current]&&strcmp(ht[current],key);)
	{
		current=(current+1)%b;
		if(current==homebucket)
			return NULL;
	}
	if(strcmp(ht[current],key)==0)
		return ht[current];
	return NULL;
}

void insert(char *key)
{
	int homebucket,current;
	homebucket=f(stringtoint(key));
	for(current=homebucket;ht[current];)
	{
		current=(current+1)%b;
		if(current==homebucket)
			return;
	}
	ht[current]=(char*)malloc(sizeof(*key));
	strcpy(ht[current],key);
}

int main()
{
	int i;
	char word[MAX_SIZE];
	for(i=0;i<MAX_SIZE;i++)
	{
		ht[i]=NULL;
	}
	for(i=0;i<3;i++)
	{
		scanf("%s",word);
		insert(word);
		fflush(stdin);
	}
	printf("search:");
	scanf("%s",word);

	printf("%s\n",search(word));
	for(i=0;i<MAX_SIZE;i++)
		printf("%s\n",ht[i]);
	system("pause");
	return 0;
}

惯例,OD跟踪,往下翻,有个jmp main指令,很明显就是它啦,F7跟进去,显示如下代码
01381170 >/$  83EC 18       sub     esp, 18                                 ;  首先分配临时存储空间
01381173  |.  A1 00303801   mov     eax, dword ptr [__security_cookie]
01381178  |.  33C4          xor     eax, esp
0138117A  |.  894424 14     mov     dword ptr [esp+14], eax
0138117E  |.  33C0          xor     eax, eax
01381180  |.  53            push    ebx
01381181  |.  8B1D A8203801 mov     ebx, dword ptr [<&MSVCR90.fflush>]      ;  MSVCR90.fflush
01381187  |.  55            push    ebp
01381188  |.  8B2D AC203801 mov     ebp, dword ptr [<&MSVCR90.__iob_func>]  ;  MSVCR90.__p__iob
0138118E  |.  56            push    esi
0138118F  |.  8B35 B0203801 mov     esi, dword ptr [<&MSVCR90.scanf>]       ;  MSVCR90.scanf
01381195  |.  A3 6C333801   mov     dword ptr [ht], eax                     ;  初始化全局变量的指针数组
.....................
......................
013811DE  |.  57            push    edi
013811DF  |.  90            nop
013811E0  |>  8D4424 14     /lea     eax, dword ptr [esp+14]                ;  eax指向分配存储空间中最后一个变量
013811E4  |.  50            |push    eax
013811E5  |.  68 04213801   |push    01382104                               ;  ASCII "%s"
013811EA  |.  FFD6          |call    esi                                    ;  scanf("%s",esp+14)
01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值