エンコードしたテキストをsha256でハッシュ化
import hashlib text = "bbb" encode_string = text.encode() print(hashlib.sha256(encode_string).hexdigest())
$ python3 test.py
3e744b9dc39389baf0c5a0660589b8402f3dbb49b89b3e75f2c9355852a3c677
ソフトウェアエンジニアの技術ブログ:Software engineer tech blog
随机应变 ABCD: Always Be Coding and … : хороший
エンコードしたテキストをsha256でハッシュ化
import hashlib text = "bbb" encode_string = text.encode() print(hashlib.sha256(encode_string).hexdigest())
$ python3 test.py
3e744b9dc39389baf0c5a0660589b8402f3dbb49b89b3e75f2c9355852a3c677
liefはPE、ELFなどの実行ファイルをパースし、一部のレコードの編集を行うためのライブラリ
– 実行ファイルの一部のレコードを編集した上で新しい実行ファイルとして書き出し
– パース可能な実行ファイルフォーマットが多い
– pefile, pyelftoolsなどがあった
### LIEFのインストール(ubutu22.04)
$ git clone https://github.com/lief-project/LIEF.git
$ cd LIEF && mkdir build && cd build
$ sudo apt update
$ sudo apt install cmake
$ sudo apt install ninja-build
※ninjaはbuildを高速化するツール。よくオープンソースのbuildなどに使われる。CPUを効率的に使用しており、複数コアのCPUだと特に速くなる。
※cmakeはコンパイラに依存しない自動化ツール
$ cmake -DLIEF_PYTHON_API=on -DPYTHON_VERSION=3.6 -DCMAKE_BUILD_TYPE=Release -DLIEF_TESTS=on -GNinja ..
$ cd api/python
$ python3
Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import lief
Traceback (most recent call last):
File “
ModuleNotFoundError: No module named ‘lief’
>>> exit()
う〜ん、よくわかりませんね。
symbol-check.py
import sys import lief
まず対象となるファイルを適当に作成します。
script.cpp
#include "headers.h" bool CheckSig(vector<unsigned char> vchSig, vector<unsigned char> vchPubKey, CScript scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType);
file_name = './script.cpp' with open(file_name) as f: data = f.readlines() data.insert(1, '// Copyright (c) 2009 Satoshi Nakamoto\n') with open(file_name, mode='w') as f: f.writelines(data)
これだと、全部書き変わってしまう…
copyright_header.pyだと、作者をファイルごとに定義しています。
COPYRIGHT_WITH_C = r'Copyright \(c\)' COPYRIGHT_WITHOUT_C = 'Copyright' ANY_COPYRIGHT_STYLE = '(%s|%s)' % (COPYRIGHT_WITH_C, COPYRIGHT_WITHOUT_C) YEAR = "20[0-9][0-9]" YEAR_RANGE = '(%s)(-%s)?' % (YEAR, YEAR) YEAR_LIST = '(%s)(, %s)+' % (YEAR, YEAR) ANY_YEAR_STYLE = '(%s|%s)' % (YEAR_RANGE, YEAR_LIST) ANY_COPYRIGHT_STYLE_OR_YEAR_STYLE = ("%s %s" % (ANY_COPYRIGHT_STYLE, ANY_YEAR_STYLE)) ANY_COPYRIGHT_COMPILED = re.compile(ANY_COPYRIGHT_STYLE_OR_YEAR_STYLE) def compile_copyright_regex(copyright_style, year_style, name): return re.compile(r'%s %s,? %s( +\*)?\n' % (copyright_style, year_style, name)) EXPECTED_HOLDER_NAMES = [ r"Satoshi Nakamoto", r"The Bitcoin Core developers", r"BitPay Inc\.", r"University of Illinois at Urbana-Champaign\.", r"Pieter Wuille", r"Wladimir J\. van der Laan", r"Jeff Garzik", r"Jan-Klaas Kollhof", r"ArtForz -- public domain half-a-node", r"Intel Corporation ?", r"The Zcash developers", r"Jeremy Rubin", ]
f.writelines()ではなく、f.write(”.join())で関数と引数にして書いてます。
################################################################################ # read and write to file ################################################################################ def read_file_lines(filename): with open(filename, 'r', encoding="utf8") as f: file_lines = f.readlines() return file_lines def write_file_lines(filename, file_lines): with open(filename, 'w', encoding="utf8") as f: f.write(''.join(file_lines))
なるほど、Pythonならギリまだいけるな..
socketはネットワーク通信に利用するファイルの一種。
そして、このソケットに紐づけられた「ファイルディスクリプタ」を用いることで、アプリケーションに対してデータを送ることができる。
ファイルディスクリプタとは、プログラムが利用する標準入出力やファイル入出力をOSが識別するための識別子です。
### サーバサイド
1. socket()作成
2. bindはsocketをローカルのアドレスにバインド
3. listen()は接続を待ち受け
4. accept()は外部からの接続に対して新しいソケットをサック製
5. send()/receive()でデータの送受信
6. close()でソケットクローズ
### クライアントサイド
1. socket()でソケット作成
2. connect()はリモートソケットに接続
3. send()/receive()でデータの送受信
5. close()でソケットクローズ、ファイルディスクリプタ削除
### ソケット通信のバリエーション/パラメータ
ソケット通信の方式を決めるためのパラメータは、主に(1)アドレスファミリー、(2)ソケットタイプ
(1)アドレスファミリー
ソケットにバインドするアドレスの種類
・AF_UNIX: ローカル通信に使用する。同一マシン間でプロセス間通信を可能とする。
・AF_INET: IPv4インターネットプロトコル, TCP
・AF_INET6: IPv6インターネットプロトコル, TCP
(2)socket Type
TCPであればSOCK_STREAM, UDPであればSOCK_DGRAM
・SOCK_STREAM: 双方向のバイトストリーム
・SOCK_DGRAM: データグラム、UDPソケットで利用
import os import socket class BlockingServerBase: def __init__(self, timeout:int=60, buffer:int=1024): self.__socket = None self.__timeout = timeout self.__buffer = buffer self.close() def __del__(self): self.close() def close(self) -> None: try: self.__socket.shutdown(socket.SHUT_RDWR) self.__socket.close() except: pass def accept(self, address, family:int, type:int, proto:int) -> None: self.__socket = socket.socket(family, typ, proto) self.__socket.settimeout(self.__timeout) self.__socket.bind(address) self.__socket.listen(1) print("Server started:", address) conn, _ = self.__socket.accept() while True: try: message_recv = conn.recv(self.__buffer).decode('utf-8') message_resp = self.respond(message_recv) conn.send(message_resp.encode('utf-8')) except ConnectionResetError: break except BrokenPipeError: break self.close() def respond(self.message:str) -> str: return ""
import socket class BaseClient: def __init__(self, timeout:int=10, buffer:int=1024) self.__socket = None self.__address = None self.__timeout = timeout self.__buffer = buffer def connect(self, address, family:int, typ:int, proto:int): self.__address = address self.__socket = socket.socket(family, typ, proto) self.__socket.settimeout(self.__timeout) self.__socket.connect(self.__address) def send(self, message:str="") -> None: flag = False while True: if message == "": message_send = input("> ") else: message_send=messsage flag = True self.__socket.send(message_send.encode('utf-8')) message_recv = self.__socket.recv(self.__buffer).decode('utf-8') self.received(message_recv) if flag: break try: self.__socket.shutdown(socket.SHUT_RDWR) self.__socket.close() except: pass def received(self, message:str): print(message)
BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' print(BASE58_ALPHABET[-4:]) print(BASE58_ALPHABET[:-4])
$ python3 test.py
wxyz
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuv
テストコードを実行してみれば、そのまんまだけど、一見[-4:]と[:-4]がプログラム上で並ぶと困惑しますね。
enumerate()関数を利用することで、for文内のループ処理にインデックス番号を付与できる
ary = ['ドル', 'ユーロ', 'ポンド', 'リラ'] for i, d in enumerate(ary): print('index:' + str(i) + ' 通貨:' + d)
$ python3 test.py
index:0 通貨:ドル
index:1 通貨:ユーロ
index:2 通貨:ポンド
index:3 通貨:リラ
bytearray() method returns a bytearray object which is an array of given bytes.
prime = [2, 3, 5, 7] print(bytearray(prime))
$ python3 test.py
bytearray(b’\x02\x03\x05\x07′)
0 <= x < 256 の整数
num = -20 print(abs(num))
num = -30.33 などにしても結果は同じ
def OP_NOP(): print("This is OP_NOP, 76") def OP_IF(): print("This is OP_IF, 99") def OP_NOTIF(): print("This is OP_NOTIF, 100") OP_CODE = { 76: OP_NOP, 99: OP_IF, 100: OP_NOTIF } func = OP_CODE[76] func()
$ python3 test.py
This is OP_NOP, 76
bitcoinのOPcode一覧はこちら
https://en.bitcoin.it/wiki/Script
めちゃくちゃお洒落な書き方だな~
a = True if not a: print('a is false')
in String
a = '' if not a: print('a is empty')
def mul(num): if type(num) == int: print(num * 2) return True else: return False n = 'a' if not mul(n): print('please input number')
if notは基本的にTrue or Falseを判定している