備忘録

備忘録

Node.js + TypeScript + puppeteerでevaluateを非同期で利用する方法

Ⅰ. はじめに

TypeScriptのようなAltJSで以下のコードを実行すると、以下のエラーが出力されます。

await page.goto('http://example.com')
let str = await page.evaluate(async () => {
  let res = await window.fetch('http://example.com')
  return await res.text()
})
console.log(str)
UnhandledPromiseRejectionWarning:
  Error: Evaluation failed:
    ReferenceError:
      __awaiter is not defined

解決方法

方法1

引数を文字列として渡す

let str = await page.evaluate(`(async () => {
  let res = await window.fetch('http://example.com/1')
  return await res.text()
})()`)
方法2

トランスコンパイル先としてECMAScript 2018を指定する
tsconfig.json

{
  "compilerOptions": {
    "target": "es2018"
  } 
}

GHIDRAにスキンを適応する方法

Ⅰ. はじめに

タイトルの通り「GHIDRAにスキンを適応する方法」です。

Ⅱ. やり方

1. git cloneする
git clone https://github.com/elliiot/ghidra_darknight
2. スクリプトを実行する
python set_colors.py C:\Users\%username%\.ghidra\.ghidra-9.0\tools\_code_browser.tcd
3. 黒いアイコンに任意のファイルをドラッグアンドドロップする。

f:id:kagasu:20190326213006p:plain

実行結果

f:id:kagasu:20190326213202p:plain

pyinstallerで作成されたexeをデコンパイルする方法

Ⅰ. はじめに

タイトルの通り「pyinstallerで作成されたexeをデコンパイルする方法」です。

Ⅱ. やり方

1. pyinstxtractor.py をダウンロードする

https://github.com/countercept/python-exe-unpacker

2. exe を展開する
python pyinstxtractor.py hello.exe
3. 拡張子を付け足す
cd hello.exe_extracted
move hello hello.pyc
4. ヘッダを追加する

先頭ヘッダ16バイトが欠損している為、手動で追加する
f:id:kagasu:20190326205644p:plain

オフセット 説明
0x00~0x01 バージョンのマジックナンバー
0x02~0x03 0x0D 0x0A 固定値
0x04~0x0F ゼロで埋める
5. uncompyle6 をインストールする
pip install uncompyle6
6. デコンパイルする
uncompyle6 hello.pyc

実行結果

f:id:kagasu:20190326210345p:plain

トラブルシューティング

Q. マジックナンバーが分かりません。

はじめに、展開されたディレクトリに存在するpython*.dllのバージョンを確認します。
f:id:kagasu:20190326183325p:plain

Python 3.7.0a2 の場合マジックナンバーは 3391です。
16進数リトルエンディアンで 0x3F 0x0Dです。
https://github.com/python/cpython/blob/ab9b31f94737895f0121f26ba3ad718ebbc24fe1/Lib/importlib/_bootstrap_external.py#L261

Q. 以下のようなエラーが出ます。

A. バージョンのマジックナンバーを別の値に変更し、デコンパイルを実行してください

ImportError: Ill-formed bytecode file hello.pyc
File hello.pyc doesn't smell like Python bytecode:
ImportError: Unknown magic number 3391 in hello.pyc

Visual Studio Codeで *.d.ts ファイルを非表示にする方法

Ⅰ. はじめに

タイトルの通り「Visual Studio Codeで *.d.ts ファイルを非表示にする方法」です。

Ⅱ. やり方

1. VSCodeで「Ctrk + ,」を押し「設定」を開く
2. settings.json を開く

f:id:kagasu:20190325000845p:plain

3. 以下を追記する
{
  "files.exclude": {
    "**/*.d.ts": { "when": "$(basename).ts" }
  }
結果

f:id:kagasu:20190325001159p:plain

TypeScript+webpack+Node.jsでHelloWorldする方法

Ⅰ. はじめに

タイトルの通り「TypeScript+webpack+Node.jsでHelloWorldする方法」です。

Ⅱ. やり方

1. プロジェクトを作成する
mkdir helloworld
cd helloworld
npm init -y
npm i -D typescript ts-loader webpack webpack-cli webpack-node-externals
npx tsc --init
2. webpack.config.js を作成する

webpack.config.js

const path = require('path')
const nodeExternals = require('webpack-node-externals')

module.exports = {
  mode: 'development',
  // mode: 'production',
  entry: './src/index.ts',
  output: {
    filename: 'index.js',
    path: path.resolve(__dirname, 'dist')
  },
  target: 'node',
  externals: [ nodeExternals() ],
  devtool: 'inline-source-map',
  module: {
    rules: [
      {
        loader: 'ts-loader',
        test: /\.ts$/,
        exclude: [ /node_modules/ ],
        options: {
          configFile: 'tsconfig.json'
        }
      }
    ]
  },
  resolve: {
    extensions: [ '.ts', '.js' ]
  }
}
3. package.json に start を追加する
{
  "scripts": {
    "start": "webpack --config webpack.config.js & node dist/index.js"
  }
}
4. サンプルプログラムを書く

src/index.ts

function myFunc(myName: string): string {
  return `hello ${myName}`
}

let myName = 'tanaka'
let str = myFunc(myName)
console.log(str)
5. 実行する
npm run start
6. 実行結果
hello tanaka