вторник, 15 февраля 2011 г.

ntstatus.idc

а вот оказывается даже относительно свежие версии ida pro не содержат в качестве enum много всяких значений NTSTATUS
соотв-но пришлось озаботиться и смастерить на perl парзер файла заголовков ntstatus.h от wdk и конвертор в idc
Исходный код под катом

#!/usr/bin/perl
# Lame script for NTSTATUS to idc converting
# 15 Feb 2011 (C) RedPlait
use strict;
use warnings;

sub parse
{
  my($fname, $href) = @_;
  my($str, $fh, $name, $value, $res);
  $res = 0;
  open($fh, '<', $fname) or die("Cannot open $fname, error $!\n");
  while( $str = <$fh> )
  {
    chomp $str;
    next if ( $str =~ /^\s*\/\// );
    next if ( $str !~ /^\s*#\s*define\s+(\w+).*\(NTSTATUS\)(\w+)\)/ );
    $name = $1;
    $value = $2;
    # check if name contains STATUS
    next if ( $name !~ /status/i );
    $value =~ s/l//ig;
    if ( $value =~ /^0x(.*)$/i )
    {
      $value = hex($1);
    } else {
      $value = int($value);
    }
    next if ( exists $href->{$value} );
    $href->{$value} = $name;
    $res++;
  }
  close $fh;
  return $res;
}

sub dump_idc
{
  my $href = shift;
  print<<EOF1;
#include <idc.idc>

static Enums(void) 
{
  auto id,cid;
  id = AddEnum( 0, "NTSTATUS", 0x1100000 );
  if ( id == -1 )
  {
    id = GetEnum("NTSTATUS");
  }
  if ( id != -1 )
  {
EOF1
  my $iter;
  foreach $iter ( sort { $a <=> $b } keys %$href )
  {
    printf("    AddConstEx( id, \"%s\", 0x%X, -1);\n",  
      $href->{$iter}, $iter);
  }
  print<<EOF2;
  }
}

static main(void) {
        Enums();
}
EOF2
}

# main
my %hdb;
parse($_, \%hdb) foreach @ARGV;
dump_idc(\%hdb);

Комментариев нет:

Отправить комментарий