Fråga:
Hur förenklar jag C ++ - standardmallbiblioteket i IDA?
Biswapriyo
2018-06-06 00:19:00 UTC
view on stackexchange narkive permalink

Jag har en X64 DLL-fil som använder C ++ standardbibliotek kraftigt. Jag har laddat PDB-symbolfilen i IDA och alla underrutiner namn sub_xxyz ändras till std :: xyz , vilket är som förväntat. Men det finns många subrutiner, till exempel ett namn är som std :: basic_string<char, std :: char_traits<char>, std :: allocator<char>> :: basic_string<char, std :: char_traits<char>, std :: allocator<char>> (void * sommartid _BYTE * a2 , __int64 a3) . För länge, är det inte;)

Under huven gör alla dessa underrutiner främst lite minnesmanipulation med malloc () , memcpy () , memmove () etc. Därför min fråga, kan jag förenkla dessa underrutiner i IDA på något sätt?

Det här pluginet kan vara till hjälp för dig. https://github.com/zyantific/REtypedef
Ett svar:
NirIzr
2018-06-06 02:35:28 UTC
view on stackexchange narkive permalink

Även om det här funktionsnamnet verkligen är ganska långt finns det inget enkelt sätt att förenkla det och det är inte heller för svårt att förstå när du förstår anständig C ++ - utvecklingserfarenhet, speciellt med std. TLDR-svaret är att det här är en konstruktör för ett std :: string -objekt (specifikt ser det ut som substring (3) -konstruktören, men Jag är inte 100% säker).

Om du besöker std :: string referenssidan ser du att detta är definitionen för std::string:

  typedef std :: basic_string<char> string; 

Klassen std :: string definieras med hjälp av std :: basic_string klassmallen, som har tre mallparametrar:

  1. teckentypen som används för strängobjektet.
  2. ett objekt för att styra vissa strängegenskaper.
  3. Tilldelaren som används för att faktiskt fördela strängbuffertarna för klassen.

I fallet std :: string tillhandahålls dock endast den första mallparametern - de andra två är standarddefinierade baserat på första mallparametern (char), och även om de kan ersättas med olika eller mer komplexa egenskaper eller allokatorer, är detta inte fallet för klassen std :: string .

Även om typedef-strängen är ganska enkel och okomplicerad tack vare att standardmallparametrarna är ospecificerade, används hela definitionen när objektet byggs och faktiskt definieras av kompilatorn, vilket lägger till många definitioner av pannplattor.

Om vi ​​delar upp det till dess delar ser vi att std :: basic_string används och tre mallparametrar anges. Som nämnts för std :: string , härleds den andra ( std :: char_traits<char> ) och tredje ( std :: allocator<char> ) av först och är båda mallarna själva och får samma mallparameter std :: basic_string got ( char ).

Efter klassdefinitionen är de två kolon anger en definition av ett objekt under klassnamnutrymmet:

  :: basic_string<char, std :: char_traits<char>, std :: allocator<char>> (void * Dst3, _Y > 

Vi kan lätt se att detta är en funktion som har samma namn som själva klassen, vilket är det kända sättet att definiera en konstruktör.

Slutligen, som med alla funktioner har vi de parametrar som denna funktion accepterar inom parentes:

  void * Dst, _BYTE * a2, __int64 a3  

För att förenkla den fullständiga definitionen tillbaka till std :: basic_string<char> , måste man hålla standardmallparametrarna för alla std-mallklasser och ta bort de som känns igen som standard . Även om detta inte är en mycket svår uppgift, verkar det lite överflödigt för mig. Du uppenbarligen uppmuntras att antingen utveckla ett sådant plugin själv eller föreslå funktionsförbättring till IDA-utvecklingsteamet.

AiliznzitvCMT The last paragraph discusses the task of actually simplifying those names but as mentioned I personally find it redundant.
AilizbihafCMT may be a worthwhile endeavor parsing the for `typedef` occurrences that are specializations of the standard containers and use an IDAPython script or plugin to make the names more readable. But yeah, it looks kind of like a tedious task. It'd probably require some proper C++ parser like `libclang` in the first place.
AilidwrehdCMT Not sure about the c++ parsing, because these function names are not really free strings but compiler-mangled names. There are slight variations between compilers (which IDA already support, obviously) but basically I think it is structured enough for you to not need a actual C++ parsing, at least on the plugin's side. I believe you could also scrape some DBs or websites to get the default values without doing any c++ parsing either. YMMV and I didn't go into details because I don't thing anybody should be wasting their time on that, tbh.
@Biswapriyo Jag gick också in i detaljer här för alla som inte känner till std och har problem med att läsa funktionsnamnen. Målet var inte att förklara det namnet du angav utan att visa hur std / mallnamn byggs och hur de ska tolkas av den okända läsaren.
AilirgkydzCMT I was referring to the part where one sifts through the STL headers, looking for `typedef` instances that look akin to `typedef basic_string wstring` for any number of container classes. Because that's where the short names come from (`std::string`, `std::wstring` etc) and where the defaults will be known (provided you can parse C++). With libclang it's really a lot easier than it used to be (e.g. trying to parse the XML AST output from GCC).
AilinftlwiCMT yea, that's where I said there's probably a parsed DB or you could parse a website like the std reference. It could very well be easier to use libclang - I've never used it so I wouldn't know.
Finns det något sätt att testa dessa underrutiner med någon ingång och kontrollera utdata? Det finns 100-tal av dessa underrutiner och IDA kan inte ladda det i felsökaren (DLL-filen ligger bakom ett COM-gränssnitt).
Ett praktiskt tillvägagångssätt kan vara att ta bort delarna mellan `<` och `>`. Dessa är oftare standardmallparametrar och kan ignoreras. Du kanske vill verifiera att det bara finns en förekomst av varje resulterande sträng för att se till att du inte skapar några kollisioner.


Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 4.0-licensen som det distribueras under.
Loading...