KCaptchaを逆アセンブルし、.NETの下で再アセンブルします...

KCaptchaは、CAPTCHAを生成するためのかなり一般的なPHPライブラリです。 私はこのプロジェクトにかなり長い間精通していましたが、ほんの少し前に、「すべてが内部でどのように機能し、どのように機能するのか」と考えたことがありますか? はい、それは起こります:脳は一見非常に目立たず、気取らずに何かを放出しますが、長い間頭から何かを見逃しません。 ですから、JavaScriptコードを最初に見たのはプログラミングでした。そのため、私は勉強することにしたSergey Kruglovのライブラリでした。



しかし、まず最初に。 私は何度も試したKCaptchaを隠し、解析し、理解しません。 私の試みは失敗に終わりました。 これは、最小限の空き時間、コード内のごく少数のコメント、および動機付けの問題(関心のみに依存)によって促進されましたが、主に、少なくとも背後にいくつかの経験がないことです。



時間が経ち、私はKCaptchaを取り上げ、それを再び投げました。 しかし、少しずつ、コードを理解するようになりました。 全体像は徐々に現れました。 おそらく、これはばかげているように思われるかもしれません:考えて、ランダムなキー生成と画像への出力! そうは思いませんでした 今、私はこれらのアルゴリズムを少し上から見ていきますが、コードが複雑で理解できない場合があるかどうかを理解しようとすると、自分を笑うことができなくなります。



コードをいじるのはなぜですか? 接続し、あなたの健康にそれを使用してください! 幸いなことに、このライブラリにより、不必要な詳細から簡単に抽象化できます。 1つのASP.NETプロジェクトで作業するまで、私は自分でこの質問をしました。 次に、一部のページをスパマーから保護する必要がありました。 ボットから身を守る最も単純で最も一般的な方法はキャプチャであると説明する必要はないと思います。



以前は、仕事でPHP以外は使用していませんでした。もちろん、.NETのCAPTCHAソリューションを見たこともありません。 クイックGoogle検索では、C#のReCaptchaラッパー以外は何もしませんでした。 オープンソースプロジェクトのホスティングの詳細な分析により、いくつかの結果が得られましたが、これらは長い間放棄されていた未完成の工芸品でした。 彼らは、おなじみのすでに部分的に研究されたKCaptchaにリモートでさえ似ていませんでした。



これまでずっと、私は少し経験を積んでいましたが、今ではモチベーションが高まり、完全な注文ができました。 解決しました! KCaptchaをPHPから.NETに移植する必要があります。



キー生成



プログラムの最初の部分。 彼女から、他のすべてがはじかれます。 アルゴリズムは非常にシンプルであり、アプリケーションの分野では一般的です。 キーの生成に使用される文字で構成される配列アルファベットがあります。 N個の要素がランダムに抽出されます。nはキーの長さです。 すべてが基本です。



しかし、そのような単純な場所でさえ、私たちは先に進みます! 最初に、すべての同様の記号を破棄します。0(数字)またはO(文字)があるキャプチャを解決する必要がありましたか? する必要がありますか? そうすれば、なぜこれが行われるのかを簡単に理解できます。 第二に、生成中に、文字/数字の組み合わせを監視します。一部の記号は、部分的に重なると読みにくい組み合わせを形成します。 たとえば、文字rとnを指定できます。 一緒にmとして解釈できることを理解するのは簡単です。







描画



したがって、文字列キーがあります。 それを画像に転送する時です。



ここで、KCaptchaはオリジナルです。 事実上の標準となったベクターフォントの代わりに、アルファベット文字を含むビットマップイメージのセットが使用されます。 画像は特別な方法でマークされます。 これは、重要なピクセルが配置されている領域(簡単に言えば、文字)を認識するために行われます。







ここでは、画像の上部にある1ピクセル幅のストリップがマークアップであり、黒のピクセルが重要な領域であり、白が文字間のスペースです。



実際、ビットマップフォントにはいくつかの利点があります。結果をより正確に配置できるため、文字間の接着が向上します。 さらに、ラスターはベクターと比較してパフォーマンスが向上し、インストールされているフォントから独立していることを保証する必要があります。これにより、ライブラリがクロスプラットフォームになります。 ただし、欠点もあります。スケーラビリティが低い(サイズ変更時に品質が大幅に低下する)と認識の素因(以下を参照)。



全体の考え方は、描画前にマーキングスケールを描画することです。これは、各シンボルの開始位置と終了位置へのポインタになります。 次に、このスケールにガイドされて、ライン全体を画像に転送し、y軸に沿って少しランダムに座標を調整し、同時にグレースケールをアルファチャネルに置き換えます。



歪み



これから、完全に使用可能なライブラリができました。 ただし、1つだけです! その結果、非常に弱いボットのみを除外できます。 そのようなキャプチャの標的型攻撃は、認識された画像のかなりの割合を与えます。 攻撃者がフォントを使用している場合、ハッキングはキャプチャ全体のピクセル単位の列挙と、元のフォントファイルとの比較に変わります。



しかし、解決策があります- 歪みフィルタ 。 KCaptchaはこれにサイン歪みを使用します。または、複数のサイン波を重ねて重ね合わせます。 これにより、回復力が大幅に向上します。 1つの波の作用の結果は、間接的な兆候によって無効になる可能性がありますが、2つ以上の波では、より困難になります。



フィルターを滑らかにするために、線形補間が使用されます。







まとめ



ASP.NETのサイトが失敗したため、作業の結果を実際に実行しませんでした。 しかし、完了後、すべてが小さなオープンソースプロジェクトに変わりました。 内部構造、アルゴリズム、およびコード自体は、独自の名前を持つために元のものとはまったく異なります(ただし、長い間考えていませんでした)。 NCaptchaをあまり蹴らないでください。










All Articles