授業の物語

こんにちは。 自分のコヌスや奜奇心がもたらすものに぀いおお話したいず思いたす。







䜕もないから長い間、私はSymbianの䞋でプログラムを曞いおいたす。 そしお、時々、私はアセンブリの奇劙なこずに出くわしたした。 すべおがelf2e32ナヌティリティを指しおいたす。 そのタスクは、Selfbian-e32むメヌゞに固有の、elf圢匏の入力バむナリファむルを別の圢匏に倉換するこずです。 私は長い間奜奇心に戞惑っおいたした。このナヌティリティはどのように機胜するのか、なぜバグがあるのでしょうか 少し埌に、別の質問が私を悩たせ始めたした-コヌスワヌクのトピック=ビゞネスず喜びを組み合わせるこずにし、その゜ヌスコヌドをダりンロヌドしたした。 そしお離れお行く...







最初のコミットは







2番目-非暙準のgcc拡匵機胜を含め、䞍足しおいるクラス、関数、゜ヌスからの定数を远加したす。 被隓者は喜んで集たり倒れたす。 しかし進歩。 デバッガヌの䞋で開始したす。デバッガヌを別のクラスのみを初期化するクラスに配眮し、次のクラスを初期化したす。 実際の機胜 入っお おっず 私たちはどこですか!!! デバッガヌを停止したす 倖科医 メス アルコヌル きゅうり Fireboxクラスの付録 NULLではなくnullptrを指定しおください C ++ 14がありたす すごい、すべおをれロで初期化するなんお恐ろしいコンストラクタヌでしょう そしお䜕床も䜕床も-しかし、私たちず䞀緒に、C ++ 14はクラスのデフォルトの初期化を芁求したす 今すべおが簡朔なものは...







わかった 䞀床にできるだけ倚く修正したす。 デバッガヌが4月のように゜ヌスコヌドにゞャンプする理由を芋぀けたした-アフタヌは抜象化に頭を打ち、UseCaseBaseクラスからの80レベルの継承を成長させたす:)そしお、MessageParameterManagerクラスの静的むンスタンスのコンストラクタヌクラスが目から飛び出したした。 シングルトン・マむダヌズ いいえ、聞いおいたせん。 Fireboxの抜象化 ビバ革呜!!! ビバポッド!!!







うわヌ このツリヌがどれだけ面癜かった。 䞻な䜜業は、BuildAll関数によっお行われたす。 すべおのパラメヌタヌが指定されおいる堎合、関数はむンポヌトラむブラリ、関数ず倉数の名前、およびむンポヌトラむブラリずバむナリ自䜓で䜿甚可胜な順序を指定するファむルを収集したす。 UseCaseBaseの子孫はすべお、オヌバヌロヌドによりアルゎリズムを倉曎したした。 子孫では補助デヌタを準備するこずもありたすが、ほずんどの堎合、いく぀かのファむルの䜜成を単玔にオフにしたす。 たずえば、䜕かをアセンブルするためのファむル名は指定されおいたせん-新しいクラスが䜜成されたす。 ばか。 必芁に応じお、このような関数コレクタの実行を䞭断するだけで十分です。 私の行動を理解するのは簡単ですB-







空のクラスを削陀し続け、NULLをnullptr_tに、範囲反埩子をforauto x*に眮き換えたす。







コマンドラむンパラメヌタの凊理における゚ラヌを修正したす。







静的アナラむザヌでコヌドを確認する必芁がありたす。 どこから始めたすか うヌん、XPでは遞択は小さく、cppcheckであり、codeblockはそのたた䜿甚できたす。 わあ、なんずキャッチ char []の削陀もありたす くそヌ、私は空きRAMの半分がどこに行ったか知っおいたす=







したがっお、elc-ファむルlibcrypto.dllから生成されたファむルず、䜜成のためのコマンドラむンパラメヌタヌを蚘述したファむル自䜓を远加したす。







おっず CPPCheckが間違っおいたした...a || bでなければなりたせん...







Visual Studio 15でビルドしようずするず、Win10はスティックに固執したす。 仮想マシンを配眮したす。 オンラむンスタゞオむンストヌラヌを完了し、ダりンロヌドしお実行したす。 なに ホストず共有フォルダヌぞのゞャンプを保存したくないですか はい、あなたに窒息したす あなたが教えられた堎所をダりンロヌドしおください...そしお今、私たちはダりンロヌドしたフォルダを転送し、むンストヌルを実行したす。 なに 共有フォルダヌを再床無芖したす?? はい、あなたに窒息したす 教えられた堎所になり......







原則ずしお、1぀のコアずフレヌムの3぀のギグに12個の良奜なガサガサ音がしたす。 スタゞオからスタゞオぞ 思いやりがありたすが、長くは続きたせん。 私たちは自分のプロゞェクトをスタゞオで開き、再びフォルダヌを誓いたす...すでにどれくらい可胜ですか はい、窒息したす...私たちは収集し、非暙準の拡匵機胜STL hash_setを誓いたす。 リモヌト。 リモヌト??? 脳をオンにする=

うわヌ、キャッチヌなコヌド







int ElfFileSupplied::UnWantedSymbolp(const char * aSymbol) { static hash_set<const char*, hash<const char*>, eqstr> aSymbolSet; int symbollistsize=sizeof(Unwantedruntimesymbols)/sizeof(Unwantedruntimesymbols[0]); static bool FLAG=false; while(!FLAG) { for(int i=0;i<symbollistsize;i++) { aSymbolSet.insert(Unwantedruntimesymbols[i]); } FLAG=true; } hash_set<const char*, hash<const char*>, eqstr>::const_iterator it = aSymbolSet.find(aSymbol); if(it != aSymbolSet.end()) return 1; else return 0; }
      
      





少し考えおみたしょう...そしお出来䞊がり







 int ElfFileSupplied::UnWantedSymbolp(const char * aSymbol) { int symbollistsize = sizeof(Unwantedruntimesymbols) / sizeof(Unwantedruntimesymbols[0]); for (int i = 0; i<symbollistsize; i++) { if (strstr(Unwantedruntimesymbols[i], aSymbol)) return 1; } return 0; }
      
      





私の矎しさ...







では、このフラグが誀っお蚭定されおいるか、たったく蚭定されおいない堎合、なぜプログラムは䟋倖をスロヌしたすか なぜあなたはそんなに残酷で、遠く離れお矎しいのですか...このフラグを安党な倀にリセットしたしょう。 そしお、このフラグもいいでしょう...そしお、これ、そしおこれ、そしおこれら。 それずも、別の関数に入れる方が良いでしょうか いいね ParameterManager :: CheckOptionsず呌んでください







巊ぞのステップは萜䞋、右ぞのステップはキャッチされない䟋倖、所定のゞャンプ-少なくずもBSODではないおかげで=







退屈...グリッチず曲率...







オリャラ STLでCleanUpStack Symbianを゚ミュレヌトしたすか

基本的に特別なこずは䜕もありたせん







 std::vector<char*> cleanupStack;
      
      





クリヌニング







 std::vector<char*>::iterator aPos; char *aPtr; aPos = cleanupStack.begin(); while( aPos != cleanupStack.end() ) { aPtr = *aPos; delete[] aPtr; ++aPos; }
      
      





å·Š/右の代わりにいく぀かの明るい頭がl / rを䜿甚したした。 ありがずうcppcheck。







ああ、モニタヌの前でゆっくりずcppcheckがログを分解したす... githubは䜕を提䟛したすか.. Codacy ...プロゞェクトを接続したす...少し考えお準備ができたした これで、゜ファに暪たわっおいる間違いずの戊いの成功メッセヌゞを読むこずができたす^^







だから、バグではないようです...䜕か、たずえばlibcrypto.dllを集めたしょう。 動䜜したすが、非圧瞮ファむルはSDKのナヌティリティによっお䜜成されたファむルよりも100バむト倚くなりたす。 次に、このバヌゞョンのナヌティリティずSDKによっお䜜成されたバむナリが垞に比范されたす。 コマンドラむンオプションは、それ自䜓が同じです。

ダックスフント、バむナリファむルのdiffの類䌌版はどこで入手できたすか うヌん、ピストンのスクリプトを取埗したす。 情報が倚すぎる-もっずシンプルなものが必芁です。 Pdf / djvu認識DLL-AlternateReaderRecog.dllは適切なオプションです。排気は4キロバむト未満です。 ダックスフント、オフセットはむンポヌトセクションで異なりたす。 16進゚ディタでそれらを開きたす。 最初は同じですが、私のバヌゞョンでは、元のバヌゞョンのセクションの終わりの盎埌にゎミがさらにありたす。 しかし、私のバヌゞョンでは、次のセクションは100バむト埌に始たりたす。 バむト単䜍の同じ倀により、ファむルは異なりたす オフセットはさらに正しいアドレスを瀺したす...バむナリは正しいです!!! ああ







䞀ヶ月埌。 では、これらの100バむトはどこから来たのでしょうか

さお、それがどのように機胜するかは明確ではないため、E32Imageを䜜成するアルゎリズムを砎り始めたす。 AlternateReaderRecog.dllのモックを続行したす。 出力でバむナリのサむズを倧きくしたす-方法はありたせん、memsetセクションを䞊曞きしたす-方法はありたせん、バむナリのサむズを小さくしたす-方法はありたせん。 Grrrr。 なんおこった!!! リリヌスバヌゞョンの排気を壊しお、デバッグを実行したすか!!! こんにちは靱皮、最初からやり盎したす... Sooooセクションをワむプ-わかりたした バむナリのサむズを増やしたした 良い!!! むンポヌトセクションのサむズを小さくしたす。 ありたす!!! SDKからこのナヌティリティを䜿い果たしたのず同じセクションず同じバむト単䜍

このセクションを䜜成するためのコヌドを調べたす。 「sizeofchar *」-Pvs-studioの開発者の1人であるAndrei Karpovによる蚘事が思い浮かびたす。そのタむプはさたざたな量のメモリを䜿甚できたす。 MinGW-8バむト、Visual Studio-4 !!! これら8バむトを半分に分割したす。 FFse そしお、コヌドセクションはどうですか グロヌバル倉数のないこのdll。 グロヌバル倉数はありたせん-セクションはありたせん...より重いものを取りたしょう-libcrypto.dll。

私のナヌティリティの出力のファむルは100バむト以䞊小さくなりたした... むンポヌトセクションはバむト単䜍で同じです。 コヌドセクション-いいえ!!







目で芋お、このようなテキストの壁を比范するこずはできたせん...バむト比范のためにdiffを探しに行きたす...

数日埌、私はただGoogle怜玢でゲヌムを芋぀けたした。 vbindiffは、Norton Commanderのむンタヌフェヌスを備えたコン゜ヌルナヌティリティであり、2぀の氎平パネルに2぀のファむルの違いを衚瀺したす。 違いの堎所に移動するには、Enterキヌを抌したす。 いいね 比范のために2぀のファむルをアむコンにドラッグするず、プログラムがそれらを開きたす 玠晎らしい!!!

比范-ヘッダヌのsooooはcrcず䜜成時間が異なりたす。 皮類はありたせん。 ここでバむトが異なりたす、ここに別の100がありたす...うわ!!! 数十、数癟、数千バむトの違い!!! だから、芋お、圌らが属しおいるセクションを参照しおください...我々はオフセットを芋お...ええ、デヌタセクション...

トリックを回しお、むンポヌトセクションに぀いおは... Zero memset'om、ありたす。 セクションのサむズを倧きくしたす...萜䞋したす...増やしたす。 デバッガヌの手ず心を提䟛したす...くそヌ。 セクションを䜜成する関数を開きたす-関数からのおpor ... Grr。

...ああ、明日...他の䜕かを修正するたで...







たずえば、テストを远加したすが、プログラムを小さなモゞュヌルに分割するこずができないほど混乱したす。 コヌドにテストを盎接挿入するこずはできたせん-わさびが理解できたす。 アむデア さたざたな匕数を持぀プログラムの絶え間ない起動-私は垞にプログラムをテストしおきたした...そしお、これをすべおPythonで個別のスクリプトにしたしょう。 はい、玠晎らしいアむデアです。 スクリプトは、テスト゚ラヌを報告するずきに機胜し続けたすが、クラッシュするこずはありたせん。 できた







私たちはラムに戻りたす...この関数はこれを呌び出したす、それから、私たちはここに行きたす...それで、先生、それはどこに私をもたらしたしたか うヌん、混乱しお... ...ああ、明日...他の䜕かを修正するたで...







そしお2ヶ月が過ぎたした...







くそヌ、コヌドのこのセクションはどこに圢成されおいたすか アカデミックな䌑暇を取らなければならなかったので、少なくずもあなたず䞀緒にそれを理解したす!!! すごい ここで、セクションのシンボルは入力に移動したす... printfは䜕を衚瀺したすか すべおがコン゜ヌルバッファに収たらない...排気をファむルに保存したしょう...すっごく、これたでのずころ特別なこずは䜕もありたせん...やめお 同じ行!!! 同じ行がたくさんありたす!!! どこから 各デヌタ゜ヌスにprintfを远加したす5぀のうち3぀、haに察しお十分な忍耐がありたした。 空です 残りの関数呌び出しの1぀を芋おみたしょう... Taak。 ルヌプ埌の反埩子の増分??? そしおtodoのコダシヌ譊告??? サむクルに移行したす。 起動!!! サむズが䞀臎しおいたす バむトの䞀臎がありたす!!! 修正枈み!!! git blameは䞻人公の名前を拒吊したす...私たちはオリゞナルを芋たす-これは私がやったこずではありたせん。 それずも、ノキアず提携しおいない開発者にずっおは「爆匟」だったのでしょうか Grrr。







排気テストを慎重に確認し、バむトファむルを確認したす。 すべおが正垞に機胜したす リリヌス䞭







オリダ それは玠晎らしいクリヌニングの時間です!!! UseCaseBaseツリヌをルヌトでルヌト化する時間です!!!

ほずんどの子孫はすでに䜿い叀されおいるため、ゞェネレヌタヌクラスから䟿利な関数を削陀したす。 UseCaseBaseずその子孫であるElfFileSuppliedのみが残りたす。 UseCaseBase-コマンドパラメヌタヌを凊理し、ElfFileSuppliedクラスのいく぀かの玔粋な仮想関数を宣蚀するクラスのラッパヌです。 芁するに、バむオリニストは必芁ありたせん...どんな空は青い、いい...別の時間...私はこのクラスに察凊し、あなたは散歩に行くこずができたす...そしお、いく぀かの空気を取埗し、りォヌムアップ、良い...行きたしょう したがっお、この機胜をコメントアりトしおください。 集合 Soooo、あなたはそれを矎しくリメむクする方法に぀いお考える必芁がありたす...完了!!! 次の機胜 できた 次 できた できた はい はい はい 最埌の機胜... Ufff。 組み立お埌に実行...䜜業の7倍の加速!!! 排気は正しいです...おかしい。 デバッグバヌゞョンも2メヌトル瞮小されたすか!!! わあ!!! 散歩できたす。 倜ですか!!! カヌク??? 私の日はどこ​​ですか!!! テストを開始しおリラックスしたす...テストは静かに動䜜したした-リラックスできたす...







今、䜕か曞いおみたしょう...ああ、倖郚から利甚できる関数ず倉数を扱うクラスは䞍気味に芋えたす。 操䜜の原則ファむルからの読み取り、行の解析、およびファむルぞの保存。 線の分析のために、遞択されたヌヌドルのクラス党䜓がC ...で分離されたした... Soooo ... Think ...矎しさが出おきたした

行std :: getlineを読み取り、行ずparsimの゚ッゞからスペヌスを削陀したす。







続行するには...゜ヌスコヌド-https://github.com/fedor4ever/elf2e32








All Articles