cdecl
またもや時間が空いてしまった日記&久方ぶりのなでしこの話題。
なでしこではDLLを呼び出す時に呼び出し規約の指定が出来ません。
stdcallしかないのです。
つまりSHIORIとか呼び出せません。無理矢理呼び出すと変なところでエラーが出ます。
そこでこれ、cdeclで呼び出すサンプル。
でも、これと大差ないので、プログラム掲示板に投稿するのは気が引ける。
だから、ここで公開。
●VirtualAlloc({参照渡し}lpAddress,dwSize,flAllocationType,flProtect)=DLL("kernel32.dll",
"LPVOID VirtualAlloc(
LPVOID lpAddress,
int dwSize,
DWORD flAllocationType,
DWORD flProtect
)")
●VirtualFree({参照渡し}lpAddress,dwSize,dwFreeType)=DLL("kernel32.dll",
"BOOL VirtualFree(
LPVOID lpAddress,
int dwSize,
DWORD dwFreeType
)")
●MoveMemory({参照渡し}d,{参照渡し}s,l)=DLL("kernel32.dll",
"VOID RtlMoveMemory(
LPVOID Destination,
LPVOID Source,
int Length
)")
●GetProcAddress(hModule,{参照渡し}lpProcName)=DLL("kernel32.dll",
"DWORD GetProcAddress(
HMODULE hModule, // DLL モジュールのハンドル
LPCSTR lpProcName // 関数名
)")
●LoadLibrary(lpFileName)=DLL("kernel32.dll",
"HMODULE LoadLibraryA(
LPCTSTR lpFileName
)")!MEM_COMMIT=$1000
!MEM_RELEASE=$8000
!PAGE_EXECUTE_READWRITE=$40
!NULL = 0
!変数宣言が必要●AddBinary({参照渡し}target,value,size)
MoveMemory(target,POINTER(value),size)
target=target+size●CallFuncPtr(pfunc,params,count)
pbinarycodeとは整数
pcとは整数
もし、countが(-1)ならば、count=paramsの要素数
pbinarycode=VirtualAlloc(NULL,256,MEM_COMMIT,PAGE_EXECUTE_READWRITE)
pc=pbinarycode
AddBinary(pc,$55,1) //push edp
count 回
AddBinary(pc,$68,1)
AddBinary(pc,TOINT(params[count-回数]),4) //push TOINT(params[count-回数])
AddBinary(pc,$B8,1)
AddBinary(pc,pfunc,4) //mov eax,pfunc
AddBinary(pc,$D0FF,2) //call eax
AddBinary(pc,$C483,2)
AddBinary(pc,count*4,1) //add esp,count*4
AddBinary(pc,$5D,1) //pop edp
AddBinary(pc,$C3,1) //ret
EXEC_PTR(pbinarycode,0,「」,「DWORD」)#サンプル
!変数宣言が不要
ハンドルはLoadLibrary("crtdll.dll")
関数ポインタはGetProcAddress(ハンドル,"strcat")
メッセージ0=「1番目{\0} 」
メッセージ1=「2番目」
引数はPOINTER(メッセージ0)&改行&POINTER(メッセージ1)
CallFuncPtr(関数ポインタ,引数,2)
表示
メッセージ0を表示
POINTER(メッセージ0)を表示