0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

MSVCの文字列定数をデマングリングする

Posted at

Visual C++(MSVC)でC/C++コードをコンパイルすると、文字列定数は例えば下記のようにマングリングされます。

" %u: wFuncFlags: 0x%08X<%s>\n"

??_C@_0BN@OHAHGLIK@?5?$CFu?3?5wFuncFlags?3?50x?$CF08X?$DM?$CFs?$DO?6@

ASCII部分が辛うじて読み取れますが、訳がわからない文字列です。

このマングリングされたシンボル名をUnDecorateSymbolName関数でデマングリングすると、素っ気なく``string'`とだけ返ってきます。
復元できそうなので、大変もどかしいです。

そこでデマングリングする方法を調べたところ、下記で言及されてました。
Visual C++ name mangling

どうやら、@で分割して(1つ目は特殊)

  • _C@_0で始まればシングルバイト文字、_C@_1で始まればマルチバイト文字
  • その次に文字列長(エンコードされている)
  • なんかわからんハッシュみたいな文字
  • ルールに従ってエンコーディングされた文字列

になっているようです。

ではそれを実装しましょう。
したものがこちらです。

試してみると、ほぼうまくいってそうですが、\nがVT(垂直タブ)になってしまっていますね。
もとの表で、{ctrl-K}{ctrl-J}が逆の気がします。

まぁそこを直せば使えるんじゃないでしょうか。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?