I am tired calculating thousands crc32 hashes of exported functions so I made today binding crc32 for perl
Sample of using:
or even inside IDA Pro:
crc.asm
crc.i
Makefile.pl
Building of binding is very easy:
Sample of using:
my $val = crc::my_crc32("GetProcAddress"); # 0xC97C1FFF
or even inside IDA Pro:
use IDA;
use crc;
sub form_ascii
{
my $addr = shift;
my $res = '';
my $c;
while( $c = Byte($addr) )
{
$res .= chr($c);
$addr++;
}
return $res;
}
printf("%X\n", crc::
my_crc32(
form_ascii(ScreenEA())));
This binding uses swigcrc.asm
.386
.MODEL FLAT
public _my_crc32
.code
CRC_32 proc
push ecx
push edx
push ebx
xor ecx, ecx
dec ecx
mov edx, ecx
NextByteCRC:
xor eax, eax
xor ebx, ebx
lodsb
test al, al
jz short EndCRC32
xor al, cl
mov cl, ch
mov ch, dl
mov dl, dh
mov dh, 8
NextBitCRC:
shr bx, 1
rcr ax, 1
jnc short NoCRC
xor ax, 08320h
xor bx, 0EDB8h
NoCRC:
dec dh
jnz short NextBitCRC
xor ecx, eax
xor edx, ebx
jmp short NextByteCRC
EndCRC32:
not edx
not ecx
pop ebx
mov eax, edx
rol eax, 16
mov ax, cx
pop edx
pop ecx
ret
CRC_32 endp
_my_crc32 proc
push esi
mov esi, [esp + 8]
call CRC_32
pop esi
retn
_my_crc32 endp
END
crc.i
%module crc
extern unsigned long my_crc32(const char *);
Makefile.pl
require 5.004 ;
use ExtUtils::MakeMaker;
WriteMakefile(
'CCCDLFLAGS' => '/MT /EHsc',
'INC' =
>
'-I.',
'NAME' =
>
'crc',
'OBJECT' =
>
'crc_wrap.obj crc.obj',
'LIBS' =
>
'-llibcmt'
);
Building of binding is very easy:
swig.exe -perl -compat -noproxy crc.i
perl Makefile.pl
nmake
nmake install