看到北极星GG~发布了这么多代码/..小弟自感惭愧..
最近精神好一点..也捣鼓了一点点东西...
看了一下ShellCode
发现有许多不同的字符串Hash..感觉蛮有意思的
在这里发出来一下
ShellCode 中应用最多的hash算法...
1.ror 13算法--刚开始用Pascal写.发现里面居然没有循环移位.指令唉~~
代码:
//与$D作循环移位计算
function GetRORHashEx(StrAPI:Pchar):DWORD;
var
I:Integer;
begin
Result := 0;
for I:= 0 to Length(StrAPI)-1 do
begin
asm
ror Result,$D
end;
Result := Result + ord(StrAPI[I]);
end;
end;
PEID不知道是什么原理居然可以扫描出来算法..Poly Crc32?
2.Crc32b算法---小弟只在Coban2k的Hash Unit中看到过~Crc32a算法
但是感觉差不多~估计是因为有重复Hash出现所以开发了b算法
一下代码是..从zhengxin的 病毒代码中提取出来的
这里抱怨一下...BASM真难用..字符串赋值老是出错...
估计可能是..我用的Delphi 6的问题..郁闷的说
代码:
//Crc32b算法
function GetCrc32bHash(StrAPI:PChar):DWORD;
asm
mov esi, eax//算法太经典了~
xor eax, eax
dec eax
mov edx, esi
@@1:
cmp byte ptr [edx], 0//判断字符串是否是00..是的话就结束
je @@4
xor al, [edx]
mov bl, 8
@@2:
shr eax, 1
jnc @@3
xor eax, 0EDB88320h//太熟悉了~~
@@3:
dec bl
jnz @@2
inc edx
jmp @@1
@@4:
not eax
mov Result,eax
end;
3.xCrc32算法--一种Crc32b的变型算法...这个算法是从
z0mbie的 Crc算法库中提取出来的..自己加工了一下..
..呵呵~~不知道为什么在Delphi 10下就可以象我想的这么跑了
但是不知道为什么Delphi 6 就不正常了~~居然会把
第二个参数放在edx中??哪位高手能告诉我为什么会这样??
代码:
//xCrc32算法
function GetxCrc32Hash(StrAPI:PChar;StrSize:Integer):DWORD;
asm
mov ecx, edx //将数据长度保存在ECX中
add ecx, 1 //由于char *是以00结束的所以这里多循环一次
mov edx, StrAPI //将StrAPI指针保存在edx中...不知道为什么汇编参数不好用~
jecxz @@4 //是否循环完毕~ecx为0就.跳!
xor eax, eax //EAX清0
not eax //翻转EAX---EAX=$FFFFFFFF
@@1:
xor al, [edx]
inc edx
mov bl, 8
@@2:
shr eax, 1
jnc @@3
xor eax, 0EDB88320h
@@3:
dec bl
jnz @@2
loop @@1
not eax
@@4:
mov Result,eax
end;
附件附原代码+工程:Hash.rar
希望大家批评..