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) ---------