UPXもどきを作る#1

  • (by K, 2020.01.09)

(1)

  • UPXするとWindows Defenderにマルウェア扱い受けることがある。これは悲しい。どうにかしてマルウェア扱いを受けないようにしたい。

(2)

  • UPXでesbasic32.exeを圧縮してみると、UPX0, UPX1, UPX2という3つのセクションができる。これは明らかに「普通」ではない。普通なら、まず「.text」があって、「.data」があって、「.bss」があって、最後に「.idata」がある。・・・ここを見てWindows Defenderはケチをつけてきているのかもしれない。
  • 私が、winchars0i.exeを作った時に分かったこととして、セクションは「.text」の一個だけでも許してくれるので(.idataを.textの末尾に入れられる)、.textの一つで何とかできないだろうか?
  • とはいえ、一度にあれこれと改造するとたぶん収拾がつかなくなるので、まずは「.text」「.bss」「.idata」の順番にすることを試みよう。具体的にはどうするのかというと、UPX1のセクションの内容の頭に、メモリ転送プログラムを付ける。その後にUPX版のエントリポイントにJMP。これでUPX0, UPX1の順番でロードされたかのように振る舞う。

(3)

  • [分かったこと#1]
    • セクションのサイズは4KB単位で切り上げることは許されるけど、それよりも1バイトでも大きくすると怒られる。
  • [分かったこと#2]
    • UPXではインポートテーブルを少しでも小さくするために、ASCIZの末尾のゼロを省略できるときは省略している。これは攻めている!
  • [分かったこと#3]
    • UPXが出力する.exeファイルのヘッダサイズは4KBということになっているが、実際は512バイトしかない。でもWindowsはこれをとがめない。
    • このフィールドを無視しているというわけではなく、0にすると起動できなくなる。
    • いやでも、ここでいうheaderは0x400000〜0x400fffの4KBのサイズのことを言っているのかもしれない。それならおかしくはない。
  • [分かったこと#4]
    • KERNEL32.dllをインポートする指定にすると、途端にチェックが厳しくなるようだ。
  • [分かったこと#5]
    • .idataのセクションは他のセクションとマージしてはいけない。それをやるとWindows7では実行できないバイナリになってしまう。・・・ようだ。
    • でも、この.idataのセクションはサイズを切り詰めることは可能っぽい。
    • いや、それもだめだった・・・。

こめんと欄


コメントお名前NameLink

リロード   新規 編集 差分 添付   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Last-modified: 2020-01-14 (火) 19:05:08 (255d)