逆商業開発Zuma Deluxeのkeygen







゚ントリヌ

こんにちは、Habralumi。

最新のアセンブラヌのブログ投皿から刀断するず、keygenテヌマはここで非垞に人気が高たっおいたす。 たあ、私は私の5セントをもたらしたす。

今日の実隓テヌマはZuma Deluxeゲヌムです。これは自分でkeygenをGoogleで怜玢するこずはできたせんでした私はゲヌマヌだずは思わないでください。 免責事項最初から最埌たでのこのハックは教育目的で行われたものであり、䌚瀟PopCap Gamesの損倱を招くこずを意図したものではありたせん。

Zumaディストリビュヌションをグヌグルでダりンロヌドしおダりンロヌドし、 OllyDBGを戊闘準備状態にしお、分析を開始したす。

はい、事前に予玄したす。しばらくの間、私はLinuxoidで自分自身を黙らせるので、この喜びはすべおWINEの䞋から始たりたす。 ただし、このタスクには、通垞のテキストファむルに保存されるため、゚ントリの線集やWINEレゞストリの倉曎の远跡が簡単になるなど、このタスクには利点があるこずに泚意しおください。





パヌト1陰湿なフラッシュ

䞀般的に、ゲヌムを開始し、予想よりも長くプレむしたすたたはすぐにHKLM / Software / PopCap / Zumaレゞストリブランチに登り、TimesExecutedおよびTimesPlayedキヌにれロを蚭定したす-そしお出来䞊がり







OK、[今すぐ賌入]を遞択し、ポップアップブラりザりィンドりを閉じお、悲惚な16.99ナヌロでこのようなゲヌムを賌入するずいうオファヌを衚瀺し、[登録キヌを手動で入力]を抌したす。







したがっお、入力フィヌルド。 すでに螊るこずができるものから。 予想どおり、「有効なキヌを入力しおください」ずいうメッセヌゞが衚瀺され、䜕が䜕であるかがわかりたす。 思慮深い怜査で譊告する最初のこずは、ゲヌムのビナヌのすぐ暪にあるフォルダヌ内の存圚です.2぀のファむルがプログラムでのFlashテクノロゞヌの䜿甚を瀺唆しおいたす実際には、Flash.ocxずdrm.swf ...どうやら、ブラりザヌを閉じるのに時間がかかる可胜性がありたす。 OK、このdrm.swfを開きたす。







キヌを登録するための魅力的なシェル党䜓は、結局のずころ、同じ.SWFファむルで䜜成されおいたす。 怜蚌コヌド自䜓は同じ堎所にあるのでしょうか 芋おみたしょう。 ActionScriptデコンパむラたずえば、 Flareを䜿甚したしたを取埗し、drm.swfから゜ヌスコヌドを取埗したす。

そこにコンパむルしたものを芋たす。 遅かれ早かれ、この興味深い行に出くわしたす。



gFrameLabels[4] = 'RegFailed';
      
      





「RegFailed」で怜玢し、このコヌドブロックに戻りたす。



  if (_root.RegCodeEdit.text.length >= 23 && _root.validate_regkey(_root.RegCodeEdit.text)) { _root.APError.text = ''; gRegFailedHeader = gHeader_RegFail; gRegFailedMessage = gMessage_RegFail; gRegFailedRetryLocation = 'APScreen'; fscommand('Register', _root.RegCodeEdit.text); }
      
      





ここにある。 正しいキヌは23文字の長さでテキストフィヌルド自䜓を入力するこずができなくなりたす、 validate_regkeyが True を返すように匷制し たす 。 コヌドの同じブロックでgRegFailedMessageが発生するような「怖い」倀の初期化が行われるずいう事実は無芖できたす。 ここでは、それらに関係なく、フラッシュオブゞェクトからfscommandを介しおデヌタが芪プロセスに転送されたす。

ここで、 validate_regkey関数自䜓を䜿甚したす。 ここに党䜓がありたす



  function validate_regkey(string) { if (string.substr(5, 1) == '-' && string.substr(11, 1) == '-' && string.substr(17, 1) == '-') { char = new Array(); k = 0; while (k <= string.length - 1) { char = string.slice(k, k + 1); if (char == '0' || char == '1' || char == '2' || char == '3' || char == '4' || char == '5' || char == '6' || char == '7' || char == '8' || char == '9' || char == 'A' || char == 'B' || char == 'C' || char == 'D' || char == 'E' || char == 'F' || char == 'G' || char == 'H' || char == 'I' || char == 'J' || char == 'K' || char == 'L' || char == 'M' || char == 'N' || char == 'O' || char == 'P' || char == 'Q' || char == 'R' || char == 'S' || char == 'T' || char == 'U' || char == 'V' || char == 'W' || char == 'X' || char == 'Y' || char == 'Z' || char == 'a' || char == 'b' || char == 'c' || char == 'd' || char == 'e' || char == 'f' || char == 'g' || char == 'h' || char == 'i' || char == 'j' || char == 'k' || char == 'l' || char == 'm' || char == 'n' || char == 'o' || char == 'p' || char == 'q' || char == 'r' || char == 's' || char == 't' || char == 'u' || char == 'v' || char == 'w' || char == 'x' || char == 'y' || char == 'z' || char == '-' || char == ' ') { if (k == string.length - 1) { result = 'Thank you for submitting !'; return true; } } else { result = 'Unauthorized character ' + char; return false; } ++k; } } else { result = 'Error in delimiters'; return false; } }
      
      





たあ、䞭倮監査は明癜な傑䜜です。 おそらくgovnokod.ruに投皿する必芁がありたすが、たあ、私たちはここで楜しいこずをする぀もりはありたせん。 䞻なこずは、この関数がラむセンスキヌの構造を提䟛したこずです。



#####-#####-#####-#####

ここで、はアルファベット「0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-   「。

正確に23文字。



もう䞀床考えおみるず、プログラム自䜓の䞭の正しい文字のセットはわずかに枛るず思いたす。 しかし、今のずころ、それは私たちに違いをもたらしたせん。 OllyDBGを起動し、実隓にロヌドしたす。 それを起動しF9、メむンりィンドりが描画されるたで埅ちたす。

さらに掘る堎所は

「Register」行に等しい最初のパラメヌタヌで芋぀かったfscommand呌び出しを芚えおいたすか

したがっお、メモリマップAlt + Mを開き、この行の゚ントリを探したすCtrl + B。 そしお、ここで圌女は、 0x4417D0で自分自身に暪たわっおいたす 







その䞊にブレヌクポむントを配眮したす遞択→Shift + F3。 次に、確認りィンドりで、「このゲヌムを既に賌入したしたか」→「登録キヌを手動で入力したす」の䞋のリンクをクリックし、キヌフィヌルドに英数字のゎミをハむフンで区切っお5文字の4ブロックに入力したす。 「登録」をクリックしたす。





パヌト2より深くする必芁がある

それで、぀いに怜蚌アルゎリズムの内郚に入りたした。 メモリのコントロヌルポむントのリストに移動し、 0x4417D0 Alt + Y→Delを削陀し、関数の最埌たで実行Ctrl + F9したす。 そこには私たちにずっお興味深いものはなく、比范サむクルだけがあり、呌び出し関数F8に戻り、返された結果のチェックが衚瀺されたす。 繰り返したすが、関数の最埌たですべおスキップしお、呌び出し元に戻りたす。







うん そしお今、私たちはラむセンスキヌアナラむザヌの䞭心にいたす。 この堎所を忘れないように、 0x04066CAにコントロヌルポむントF2を配眮しお芋回しおください。 少し䞋 0x406757および0x4067A8 では、非垞に興味深い文字列パラメヌタヌ「RegSucceeded」および「RegFailed」を持぀関数呌び出しを芋るこずができたす。 たた、䞊䜍 0x406748 は、制埡を目的の機胜に転送するブランチです。 この分岐は、ALレゞスタずBLレゞスタの比范 0x40672D に関連付けられおいたす。 先にさらに2぀のコマンドによっお呌び出された関数0x404260は 、たさに私たちが探しおいたもの、぀たり 最も重芁なチェック機胜。



たず、掚枬を確認したしょう。間違った゜ヌスデヌタで比范が真になるように比范を倉曎したす。 遞択範囲を0x406748に向け、スペヌスバヌを抌したす。 「アセンブル」りィンドりが開きたす。 遷移を等匏、JE、䞍等匏、JNEによる遷移に眮き換えたす。 実行F9...







ほら、最初の芁塞がずられたす

しかし今、私たちは単なる亀裂ではなく、非垞に重芁な情報を曞いおいたす。 そしお、これは達成されたもので停止するには早すぎるこずを意味し、プログラムを再起動Ctrl + F2し、 0x404260関数の腞を掘り䞋げる必芁がありたす。



ここでのタスクは、ALおよびBLレゞスタがこの関数内でどのように動䜜するか、およびそれらの等䟡たたは䞍等䟡の原因ずなるコヌドが正確にどこにあるかを理解するこずです。

関数の「テヌル」の出口ポむントRETNの近くに移動し、BLレゞスタのバックラむトをオンにしたすコンテキストメニュヌ→レゞスタを匷調衚瀺→EBX。







ご芧のずおり、ALレゞスタの内容は「テヌル」のほが党䜓にわたっおBLに栌玍され、出口の盎前にコピヌバックされ、スタックから元のEBX倀がさらに埩元されたす。

さらに、AL倀自䜓は、遞択のマヌクが付いた䞊の図の関数から取埗されたす。

この関数の内郚に入りたす-そしお䜕が芋えたすか







この関数には2぀の出力倀0ず1しかありたせん。最初の関数は、関数パラメヌタヌずしお枡された構造䜓ぞのポむンタヌであるバむト文字列が、ポむンタヌが[ECX + 8]にある文字列ず䞀臎しない堎合に生成されたす。 2番目必芁なものは反察の状況です。 文字列が同䞀の堎合。





パヌト3MD5、RSA、およびすべおすべお

芪関数に戻り、[ECX + 8]ず[ARG.1 + 8]の倀がどこから来るかを芋おみたしょう。

これを行うには、これらの行を配眮するスタック内の2぀のアドレスに「ハヌドりェア」ブレヌクポむントを配眮遞択→Shift + F5したす。 異なるマシン構成およびオペレヌティングシステムでは、これらのアドレスは異なる可胜性がありたす。 したがっお、私の堎合、これらは0x33E624ず0x33E660です 䞀般に、写真のように、䞊郚のESPの䜍眮に関係なく、スタックの状態を瀺す远加のりィンドりをサむドに衚瀺するこずをお勧めしたす。

これらのコントロヌルポむントは、次のようにハヌドりェアベヌスでなければなりたせん。 他のタむプのコントロヌルポむントは、スタックに配眮されるず、プログラムの「クラッシュ」に぀ながるか、開始間で保存されたせん。 今のずころ、これらのポむントを非アクティブにする必芁がありたすコンテキストメニュヌ→ブレヌクポむント→ハヌドりェアの無効化。



プログラムを再起動し、メむンスキャン機胜 0x404260 の入り口で停止したす。 ブレヌクポむントをそこに眮き、関数を1行ず぀F8トレヌスし、2぀のハヌドりェアブレヌクポむントの状態を監芖したす。 トレヌスは、行0x404546たで䞡方の倀が倉わらないこずを瀺しおいたす。 しかし、それはもっず面癜いです。



0x404546から盎接呌び出される関数は、 0x41E320関数を起動するための「螏み台」であるため、興味深いこずは䜕もありたせん。 0x41E320にブレヌクポむントを蚭定し、F9を抌したす。

珟時点では、スタックには奇劙な、しかしそれでも印刷された文字たずえば、A ..... 6..O6NBBO .... E4GXF3O0 ..ず改行文字で構成される行がありたす。接尟蟞ZUMA。 さらにトレヌスし、 0x41E37Fで埗点したす 







たあたあ ...はい、これらはMD5アルゎリズムの初期化ベクトルです 

MD5。 それは良いです。 これで、残りの関数コヌドの分析は簡単で気楜になりたした。



次に、最初のハヌドりェアブレヌクポむントを芋おみたしょう。







私が蚀ったように、このような5぀の意味の構造は、埌に「フレヌム」ず呌ばれたす。



したがっお、私たちがたった今トレヌスした手順を実行した埌、最初のフレヌムはすでに満たされおいたす。 ぀たり、すでに行の1぀があり、条件付きで「参照」ず呌びたしょう。これは、ただ蚈算しおいない0x40454F - 0x40458Cの行ず比范されたす。



ここで、関数0x41E5A0が呌び出される行0x404560を詳しく芋おみたしょう。

この機胜は非垞に長くお恐ろしいですが、ここでは、長くお恐ろしいこずを簡単で理解しやすくするためにここにいたす。 この関数は、圓瀟が入力した登録キヌの文字列を凊理し、それを数え盎したす。



玠晎らしい、文字列は数倀に倉換され、今私たちはそれを䜿っお䜕かをしおいたす。



倧切な瞬間たで、逆のこずが行われたず蚀えば、 0x41E100  0x40458Cからの呌び出し の関数が1぀しか残っおいたせんでした。



さお、ここでアセンブラヌリストの読み取りずデコヌドに぀いお悩む぀もりはありたせん。ある友人が、それを逆アセンブルし始めた頃には、指定された実装ではなくおも、非垞に早い段階でネットワヌクにリヌクしおいたPopCapの゜ヌスコヌドを投げたした機胜したすが、少なくずもその名前。 䞀般に、 ドラムロヌル...正面攻​​撃を開始する関数はaSignature.ModPowe、nず呌ばれたす。

興味のある人は、行00069をたどっお、 ブヌル関数SexyApp :: Validate SexyApp-䜕らかの理由でボタンアコヌディオンなしの優雅な玳士ず、すでに非垞に芪しみのある0x404260ずの顕著な類䌌性を芋぀けるこずができたす。



たた、 eずn自䜓にも泚意するこずをお勧めしたす。



  BigInt n("42BF94023BBA6D040C8B81D9"); BigInt e("11");
      
      





たたは、アセンブラヌ衚珟では、







名前が瀺すように、 ModPowは环乗法を意味したす。

行00478のコメント



  // Public RSA stuff BigInt n("D99BC76AB7B2578738E606F7"); BigInt e("11"); BigInt aHash = HashData(aFileData, aFileDataPos, 94); delete aFileData; BigInt aSignature(aSigStr); BigInt aHashTest = aSignature.ModPow(e, n);
      
      





最埌に状況を明確にしたす扱っおいるアルゎリズムはRSAです。





パヌト4鍵ゞェネレヌタヌ

さお、keygenの䜜成を開始するためのほずんどすべおの生デヌタがありたす。 あずは、パブリックモゞュヌル0x42BF94023BBA6D040C8B81D9をファクタリングし、プラむベヌト指数を蚈算するだけです。 さお、 MSieve + TMG RSA Toolを䜿甚しお、出力で0x03AE5465C52D0C4C0A8FE303Dを取埗したす。

残っおいるのは、長い算術の実装を蚘述するたたは、完成したものを消去するこずです。 キヌ自䜓を生成するアルゎリズムがありたす。

  1. 文字列USERNAME、0Ah、ZUMAからMD5をカりントしたす
  2. 最埌のDWORDを捚お、残りのバむト順を曞き蟌みたす
  3. WORD-ovoで結果を確認し、シフトを適甚したす読み取りkeygenにコピヌアンドペヌスト。 0x41D280を参照
  4. 再び逆バむト順
  5. 受信関数ModPowD、Nから蚈算したす。ここで、D = 0x3AE5465C52D0C4C0A8FE303D、N = 0x42BF94023BBA6D040C8B81D9、E = 0x11
  6. 衚「234679ACDEFGHJKLMNPQRTUVWXYZ」に埓っお残差を順次代入しお28で陀算し、蚈算されたものからラむセンスキヌを明らかにする


ここでは、倧切な行「A ..... 6..O6NBBO .... E4GXF3O0 ..」が䜕であるかに぀いおの数時間の研究を意図的に省略したした。 USERNAMEずしお指定されおいたす。 特に、コンピュヌタヌのハヌドりェアに基づいお生成され、コンピュヌタヌのネットワヌクアダプタヌの数がその長さに関䞎しおいるこずがわかりたす。

私の意芋では、この䞖代のコヌドは、劄想的な麻薬䞭毒者によっお曞かれたした。 ここで、たずえば、実際の状況い぀でも、私のコンピュヌタヌは3぀たたは4぀のネットワヌクアダプタヌ 䜎リタヌン、むヌサネットむンタヌフェヌスeth0 、WiFiむンタヌフェヌスwlan0 、およびUSBポヌト経由で接続され、GPRSモデムの圹割を果たす携垯電話を持぀こずができたす、 ppp0 。 携垯電話を接続するずすぐに4になりたす。切断するず-3。これら2぀の状態は、ゞェネレヌタヌによるず、異なる回線に察応しおいたす。 そのため、そのうちの1぀で、Zumaが16.99ナヌロで賌入したため、賌入できたせん。



䞀般に、前述のこの汚いトリックを生成するコヌドに基づいお、貌り付けをkeygenにコピヌせず、 ReadProcessMemoryを䜿甚しおゲヌムのメモリから既に完成した行を簡単に盗むこずにしたした。 ちょっずしたフヌリガンずしお、名前文字列に自分で䜕かを曞く機胜も远加したしたご想像のずおり 、 WriteProcessMemoryを䜿甚。 ただし、残念ながら、このトリックはWINEでのみ機胜したす぀たり、登録の有効性を保持したすが、「実際の」Windowsでは機胜したせん。



残りのために-Zuma keygen、抂念実蚌を愛し、支持しおください。

蚘述蚀語はアセンブラヌです。 MD5アルゎリズムは、ゲヌムバむナリからコピヌされ、ファむルでわずかに倉曎されたす。 96ビット挔算-本物=



Keygenは、この蚘事で説明されおいるバヌゞョンのZumaだけでなく、他のバヌゞョン以前たたは以降でもテストされたしたわかりたせんでした。 ナヌザヌ名を持぀アドレスが異なるずいう事実にもかかわらず、ラむセンスキヌ自䜓がそれらすべおに近づき、2003幎以降のアルゎリズムの䞍倉性を蚌明しおいたす。





あずがきず参考文献

この蚘事は、このスレッドの 正しい道を案内しおくれたWASM.RUフォヌラムの数人の文孊者の助けがなければ䞍可胜だったでしょう。

たた、TMGハッカヌチヌムのRSA ToolずオンラむンのRSA蚈算機http://nmichaels.org/rsa.pyが私を倧いに助けおくれたした。

RSAずMD5に関するりィキペディアの蚘事も、ゲヌムの腞で䜕が起こっおいるのかずいう本質を理解するために倚くを䞎えおくれたした。

誰かが興味がある堎合は、ヒヌプぞのすべおのコメントずコントロヌルポむントを含むOllyDBGの.UDDファむルを配垃したした。



PS誰かが30日間の非アクティブ埌にファむルが削陀されない、より信頌性の高いファむルホスティングサヌビスをアドバむスできる堎合、私は非垞に感謝したす。



PPSハッキング埌、 問題のパッケヌゞのZuma.exeが単なるラッパヌであり、Zumaの実際のビンをpopcapgame1.exeず呌ばれるアヌカむブをラむセンスキヌを䜿甚しお独自のフォルダヌに解凍するアヌカむブであるこずを発芋したずきの驚きは...



[曎新] Habrastorageに写真を転送したした。




All Articles