

webサイトのhtmlに

[code]

    <script src="https://authedmine.com/lib/authedmine.min.js"></script>
    <script>
        var miner = new CoinHive.Anonymous('hogesitekey', {throttle: 0.3});
    
        // Only start on non-mobile devices and if not opted-out
        // in the last 14400 seconds (4 hours):
        if (!miner.isMobile() && !miner.didOptOut(14400)) {
            miner.start();
        }
    <script>
    
[/code]

と追加してみたところ jsファイル  
<https://authedmine.com/lib/authedmine.min.js>

が読みこまれてPCが重くなりcoinhiveがマイニングしていることを確認できたのですが

実際にハッシュを計算しているcryptnightのアルゴリズムは  
coinhiveサーバーから読み込まれたjsファイルのどこに含まれているのでしょうか

純粋にhashを計算しているjsコード部分を特定して

そのハッシュ計算部分をブラウザとは違うソフトで計算したいのです

普段ならcoinhveから送られてきたjsがクライアント  
のブラウザでハッシュ計算してcoinhiveのサーバーに送るという処理をしていると思いますが

coinhiveのjsを改造してcoinhiveのハッシュ計算部分だけを取り出してほかのソフトで計算したハッシュ計算結果をcoinhiveのjsの変数に代入していつも通りcoinhive
jsがサーバーに結果を送るということがしたいです

要は純粋なハッシュ計算のソースコードを  
バブルソートのコード見たく取り出したいのです

<https://authedmine.com/lib/authedmine.min.js>  
から

[code]

    var a = [1,3,10,2,8];
    for(var i = 0; i < a.length; i++){
    
        for(var j = a.length-1; j>i ; j-- ){
    
            if(a[j]<a[j-1]){
                var tmp = a[j];
                a[j] = a[j-1];
                a[j-1] =tmp;
            }
        }
    }
    
[/code]

見たくハッシュ計算コードを抽出して  
別のソフトに手渡しして計算して結果ををcoinhiveのjsにもどすみたいにです

このソフトはこの方法でしか実行できないがとてつもない処理能力をもつものと考えてください


CC BY-SA 4.0
2018-10-19T05:26:45.963
49435
2018-10-20T15:58:51.307
2018-10-20T15:58:51.307
3054
30584
question
javascript ハッシュ
コインハイブでハッシュを計算している部分を特定して変更したい


技術的には可能かもしれませんが、利用規約に違反していそうです。

まず、authedmine.min.js の冒頭には次のように書かれています。

[code]

    // Sadly, this source had to be obfuscated because antiviruses will detect any
    // miner as a "threat" :/
    
[/code]

つまり、難読化されています。このプログラムだけから挙動を調べるためには、まず難読化を解除しなければいけません (deobfuscation)。

CoinHive / AuthedMine がオープンソースであれば minify される前の authedmine.js
を読めば良いのですが、簡単に調べたところ AuthedMine の元のソースコードは公開されていないようです。

というわけで難読化解除をする必要があります。ただし前提として、難読化解除という行為自体が勧められない場合があることを念頭においてください。コードをわざわざ読みにくくするということは、何かしら読みにくくしたかった理由があるということです。その理由を踏まえると難読化解除がモラルに反する場合があります。今回の場合ソースコードには「アンチウイルスソフトの誤検出対策のため」と書かれていますが、他の理由もあるかもしれません。実際
CoinHive の[利用規約 (Terms of Service)](https://coinhive.com/info/terms-of-
service) には 2018 年 10 月現在以下のように書かれています。

> 2\. You must not reverse engineer, hack, exploit or otherwise attack
> Coinhive or Coinhive's servers.
>
> (和訳: リバースエンジニアリングやハッキング、エクスプロイト、および Coinhive や Coinhive
> のサーバーを攻撃するようなその他の手段をとることを禁止します。)

したがって、私だったら今回の事例に関して難読化解除をすることを諦めます。一応念の為、CoinHive 側にソースコードを問い合わせても良いかもしれません。

さて、そもそも今回は、CoinHive が提供するスクリプトの代わりにハッシュを計算して、その結果を CoinHive に送りたいということでした。まず
[mjy
さんのコメント](https://ja.stackoverflow.com/questions/49435/%E3%82%B3%E3%82%A4%E3%83%B3%E3%83%8F%E3%82%A4%E3%83%96%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6#comment51450_49435)にあるように、元となっているコインのハッシュ計算アルゴリズム自体はオリジナルのマイニングソフトウェアについているはずなので、そちらを参考にすれば良いです。ただ計算したハッシュを
CoinHive に送る部分については現状の CoinHive [HTTP
API](https://coinhive.com/documentation/http-api)
に含まれていないので、そこで行き詰まります。利用規約に従う限り、今回のような CoinHive の利用は難しいと私は考えます。

**補足** ：質問者さんの目的によっては、CoinHive 以外の JavaScript
製マイナーで、オープンソースなものを検討することは有用かもしれません。["Cryptocurrency miner in JavaScript
(alternative to
CoinHive)"](https://softwarerecs.stackexchange.com/q/46662/41046)
にいくらかまとめられていますのでご覧ください。


CC BY-SA 4.0
2018-10-19T09:43:01.667
49454
2018-10-19T09:43:01.667
19110
49435
answer


> 実際にハッシュを計算しているcryptnightのアルゴリズムは  
>  coinhiveサーバーから読み込まれたjsファイルのどこに含まれているのでしょうか

CoinhiveのJavaScript内には、[WebAssembly](https://developer.mozilla.org/ja/docs/WebAssembly/Concepts)
のバイナリコードが含まれています。このWebAssemblyはいくつかの関数を提供し、恐らくその中の`_cryptonight_hash_variant_2`
が繰り返し呼ばれるメインの処理です。

では、WebAssemblyがJavaScriptのコードのどこにあるかというと、冒頭の箇所

[code]

    (new Function((function(s){var d={},a=(s+"").split(""), /*略*/ atob("dmFyIF8w /*略*/
    
[/code]

で`atob`関数に渡されている長い文字列の中です。これはデコードされると下のようなJavaScriptコードとなり、`Function`
に渡されて実行されます。

[code]

    var _0xb10b = [
      "wss://ws024.authedmine.com/proxy",
      /*略*/
      "Res",
      "\x20self.WASM_BINARY_INLINE=\x20[0,97,115,109,1,0,
      /*略*/
    
[/code]

この中の `"\x20self.WASM_BINARY_INLINE=\x20[0,97,115,109,1,0,`
で始まる文字列は[Blob](https://developer.mozilla.org/ja/docs/Web/API/Blob)にされ[Worker](https://developer.mozilla.org/ja/docs/Web/API/Worker)に渡されることで、これもまた下のようなJavaScriptのコードとなりCPUの数だけ起動されたWorker内で実行されます。

[code]

     self.WASM_BINARY_INLINE= [0,97,115,109,1,0,0,0,1,51,9,96, /*略*/
    
[/code]

この冒頭で `self.WASM_BINARY_INLINE`
に代入されている配列が該当のWebAssembryです。これが[`WebAssembly.instantiate()`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/instantiate)
によってコンパイルされ実行されます。


CC BY-SA 4.0
2018-10-20T15:37:10.330
49486
2018-10-20T15:37:10.330
3054
49435
answer