На сей раз мне пришлось озаботиться импортом в idc NDIS OIDs, которые определены в wdk аж в трех файлах:
- inc\api\ntddndis.h
- inc\api\wimax.h
- inc\api\windot11.h
#!/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);
Комментариев нет:
Отправить комментарий