ExeWrightMod25k.as [自分に書き込み命令モジュール]

;*******************************************************************************
; 自分に書き込み命令モジュール by ぷま さん (ExeWrightMod)
;   CRC32関数 by 月影とも さん
;   modified by abo 2007.09.20
;*******************************************************************************
;【使い方】
;同梱のファイル"_exemodoki"を スクリプトと同じフォルダに
;入れておいてください。実行ファイル作成後は不要です。
;このファイルは スクリプトから実行した時に 使われるものです。
;編集はしないでください。デバッグ時に書き込んだ内容は実行ファイルには
;反映されません。(0で 初期化されます)
;
;スクリプトの流れは 以下のようになります。
;1) title2命令で 必ず 2重起動するのを防止してください。
;2) DataLoad命令で データーの取得(1KB)をします。
;3) その変数を編集し、onexit時に DataSave命令で保存します。
;
;※ 注)"_exemodoki" 及び、ExeWrightMod.hspは、
;テキトーに改造しないでください。アブナイものです。
;
;"_exemodoki"は 新しいスクリプトを作成する場合、
;初期化された"_exemodoki"を使用してください。

;■ 書式
; ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
;title2 "strings"
; "strings"  : タイトルバーキャプション
;
;ウィンドウのタイトルバーキャプションを、"strings"の内容に設定し、
;2重起動を防止します。
;(タイトルバーキャプションは、「Hot Soup Processor ver3.x」と
;通常は表示されている部分のことです)
;
;例 :
;   title2 "Window Title"
;
;上の例では、「Window Title」という文字をウィンドウのタイトルバーに
;表示し、既に同じキャプション名があった場合には 終了します。

;■ 書式
; ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
;DataLoad p1,p2
; p1 : 数値型配列変数名
; p2 : 文字列型変数名
;
;p1に数値型配列変数として、p2に文字列型変数として
;EXE内のデータを 1KB(1024byte:配列数256)読み出します。
;
;p1とp2は変数名は違いますが、同じメモリーを参照します。
;この1KB内に 文字列 または数値型の情報を書き込むことができます。
;
;数値型配列変数として読み出したい場合は p1の変数名を、
;文字列型変数として読み出す場合は p2の変数名を使います。
;
;このメモリーの情報は DataSave命令で 実行ファイル内に
;保存することができます。

;■ 書式
; ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
;DataSave p1
; p1 : 数値型配列変数
;
;p1で指定した 数値型配列変数の情報を実行ファイル内に書き込みます。(1KB)
;この命令は必ず onexit命令の飛び先で使用してください。

;#uselib "user32.dll"
;#func global FindWindowA "FindWindowA" int,var
;#uselib "kernel32.dll"
;#func global GetModuleFileNameA "GetModuleFileNameA" int,int,int
;#func global GetEnvironmentVariableA "GetEnvironmentVariableA" sptr,var,int
;#func global CreateProcessA "CreateProcessA" int,sptr,int,int,int,int,int,int,var,var
;#func global CloseHandle "CloseHandle" int
;#func global VirtualProtect "VirtualProtect" var,int,int,var

;#define global exedim(%1,%2)dim %1,%2:VirtualProtect %1, %2*4,$40,AZSD

#ifdef __hsp30__
#ifndef __EXEWRIGHTMOD__
#define __EXEWRIGHTMOD__

#module "ExeWrightMod25"
#defcfunc bsearch int i,var buf,int size,int char
    reg=-1
    if size>i {
        repeat size-i,i
            if char=peek(buf,cnt) : reg=cnt-i : break : else : continue
        loop
    }
    return reg
    
#deffunc Crypt array _buf
    reg=0x47AD2BA3
    repeat 6528
        reg*=0x5D588B65 : reg++
        _buf(cnt)^=reg
    loop
    return

#defcfunc CRC32 array _buf,int len
  crc = $FFFFFFFF
  repeat len
    crc = crc ^ peek(_buf,cnt)
    repeat 8
      if crc&1 { crc = crc >> 1 & $7FFFFFFF ^ 0xEDB88320 }
      else { crc = crc >> 1 & $7FFFFFFF }
    loop
  loop 
  return crc ^ $FFFFFFFF

#deffunc DataLoad array struct;,var dat
    sdim fn,MAX_PATH
    if hspstat&1{fn="_exemodoki25k"
        }else{
        GetModuleFileNameA 0,varptr.fn,MAX_PATH
        fn=getpath(fn,8)}

    notesel buf :noteload fn    :size=strsize
    i=0 :dpm=("D"+"PM")
    repeat
        if bsearch(i,buf,size,'D')=-1:break
        i+stat :if strmid (buf,i,3)=dpm:p=i
        i++
    loop

    p-26116
;   dupptr dat,varptr(buf)+p,400,2
    dupptr struct,varptr(buf)+p,26112,4

    repeat 6528
        if struct.cnt :Crypt struct :break
    loop
    return

#deffunc DataSave array a
    Crypt a
    memcpy buf,a,26112,p

    tmp="tmp"+fn
    bsave tmp,buf,size

    selfdel="selfdel.bat"
    bat="@echo off\n:lp\ndel "+fn+"\nif exist "+fn+" goto :lp"
    bat+="\nren "+tmp+" "+fn+"\ndel "+selfdel
    bsave selfdel,bat,strlen.bat

    sdim cmd,6532
    GetEnvironmentVariableA "Comspec",varptr(cmd),6532
    cmd+ " /c "+selfdel

    dim start,17 : start.11=1 :dim ProcInfo,4
    CreateProcessA  0,cmd,0,0,0,$4000000, 0,0,varptr(start),varptr(ProcInfo)
    CloseHandle ProcInfo
    return
    
#deffunc title2 str _ttl            ;指定タイトル名の二重起動防止
    ttl=_ttl :FindWindowA 0,varptr(ttl) :if stat:end
    title ttl
    return
#global

#endif
#endif

;--------------------------------------------------------------- (EOF) ---------