среда, 23 февраля 2011 г.

oids.idc

продолжаем дописывать всякое полезное для IDA Pro
На сей раз мне пришлось озаботиться импортом в idc NDIS OIDs, которые определены в wdk аж в трех файлах:
  • inc\api\ntddndis.h
  • inc\api\wimax.h
  • inc\api\windot11.h
Соотв-но для получения наиболее полного результата все три нужно скормить perl скрипту под катом

#!/usr/bin/perl -w
# Script for converting OIDs to IDA Pro idc enums
# 23.II.2011 (C) RedPlait
use strict;
use warnings;

sub parse
{
  my($fname, $href) = @_;
  my($str, $fh, $name, $base_name, $value, $res);
  $res = 0;
  open($fh, '<', $fname) or die("Cannot open $fname, error $!\n");
  while( $str = <$fh> )
  {
    chomp $str;
    next if ( $str =~ /^\s*\/\// );
    # check if we have form define some_oid (known_oid + number)
    if ( $str =~ /^\s*#\s*define\s+(OID\S+)\s+\((\S+)\s*\+\s*(\d+)\)/ )
    {
      $name = $1;
      $base_name = $2;
      $value = int($3);
      if ( !exists $href->{$base_name} )
      {
        warn("Unknown base OID $base_name\n");
        next;
      }
      $href->{$name} = $href->{$base_name} + $value;
      $res++;
      next;
    }
    next if ( $str !~ /^\s*#\s*define\s+(OID\S+)\s+([\dxaAbBcCdDeEfF]+)/ );
    $name = $1;
    $value = $2;
    $value =~ s/l//ig;
    if ( $value =~ /^0x(.*)$/i )
    {
      $value = hex($1);
    } else {
      $value = int($value);
    }
    next if ( exists $href->{$name} );
    $href->{$name} = $value;
    $res++;
  }
  return $res;
}

sub dump_idc
{
  my $href = shift;
  print<<EOF1;

#include <idc.idc>

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

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

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

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

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