alarm script
無聊寫的, 跟版本無關// main scriptGlobalAlloc(alarm, 64)
GlobalAlloc(alarm_switch, 4)
CreateThread(alarm)
alarm_switch:
DD 00
alarm:
push 00
call Sleep
// === 警報條件 ===
//ex:
mov eax, [測謊狀態 ptr] //看有沒有大大肯更新?
and eax,
test eax, eax
je alarm
// === 警報條件 ===
// === 發出警報 ===
push #440 // dwDuration
push #1000 // dwFreq
call beep
// === 發出警報 ===
jmp alarm
// switch
alarm_switch:
DD -1
alarm_switch:
DD 0 測謊狀態: 0x0183FCE0 (v179.1)
大大 對了可以順便問個問題嗎
關於楓谷使用API的方式
請問那個call convention有固定嗎? 就是(stdcall呀甚麼的那些... )
>>
其實我想問的是傳參數方式,
因為我不太知道怎麼把參數傳進去XD,大多數的數據看起來是都直接push (stdcall, 我之前看到的也是)
那是因為楓谷原生是用VC++寫嗎? 還是Windows API固定都是用這種傳法呢?:o
(stdcall, 呼叫者只需把參數push進去,API內部自行吃掉參數以後pop掉) 本帖最後由 kkmomo 於 2015-5-18 13:08 編輯
anderson101866 發表於 2015-5-18 11:47
測謊狀態: 0x0183FCE0 (v179.1)
大大 對了可以順便問個問題嗎
謝啦
我把時間改成240C8400 雖然畫面上時間一直停在9:xx
不過5分鐘到了還是GG,想得太天真了 哈哈
push 順序是args由後往前傳,是問這個嗎?
func(a, a, a, ..., a)
push a
push a
...
push a
call func
// add esp, 4*n // 如果func 裡沒有清,就自己加回來
回傳的部分我也不太了解,我是直接看最後是ret, retn xxx, ...來決定要怎麼寫
====================
int test(int a, int *b, void *c);
int A = 0;
int *B = &A;
void *C = B;
test (A, B, C);
===================
A:
DD 0
mov eax, OFFSET A
mov , eax
mov eax,
mov , eax
push
push
push
call test
本帖最後由 anderson101866 於 2015-5-18 13:56 編輯
是說我用 Ret N 去GOOGLE 搜到了XD 乾蝦
貼在這邊:
ret, retn, retf - how to use them
內文:push ebp
mov ebp, esp
sub esp, 8
.. 略
retn 10h(因為是英文的,我順便翻成中文給大家參考XD)
"In the mnemonic ret N, N is the size of parameters on the stack. In this case it is 4 * 4 = 16 (10h) for 4 DWORDs."
記憶中 ret N, N代表說stack中有幾個參數,在這個例子中,N是16 (4 * 4 = 16 = 0x10 (10h) ),也就是4個Dword
"But this only applies to calling conventions when the callee is responsible for stack cleanup."
但只有在callee(被call的函數) 需要清理stack(esp)的情況下才能這樣算
P.S. Calling Convention 是指 你call的那個函數是怎麼實作"調用"這個動作的,不同的寫法 導置用法不一樣,寫在高階語言是一樣的,但有的函式庫已經寫好了,不能改XD,你要用他就必須配合他;
用VC++的朋友調用的時候應該會注意到,有的時候會定義calling convention是哪一種,就是因為調用的方式不太一樣
"In case of cdecl convention the ret should be without any numbers, as the caller is responsible for stack cleanup."
在cdecl這種呼叫方式的例子中,ret後面不會有任何數字,那是因為caller(調用call的人),必須負責清理stack
總之,如同kkmomo大所說,所以可以直接看function結尾是 RET 還是 RET N
1. 若是RET,表示他calling convention是採用 cdecl這一類的,調用call的時候,除了push參數進去外,跑完call跳回來,還要自己把stack條回去(數據裡面是 調esp的意思)
2. 若是RET N, 表示他calling convention是採用stdcall這一類的,調用call的時候,只要push參數進去,跑完跳回來不用自己調整stack,因為這個call在RET N的時候,會都幫你pop掉
不過我不確定其他的calling convention是怎樣,也許RET的還有其他種XD 或者RET N還有其他種
有錯歡迎指正XD,我也不太熟!
感謝 大大開導 XD anderson101866 發表於 2015-5-18 13:39
是說我用 Ret N 去GOOGLE 搜到了XD 乾蝦
貼在這邊:
原來是要問這個啊.... 好像還有leave
如果結果跟預期不符時
我會比較進入時跟出來時的esp 差值
調整成一樣應該不太會有錯
我是習慣先try一次 , 可用就ok
不行再google查一下定義,然後寫個小程式調用,看asm實際怎麼走 kkmomo 發表於 2015-5-18 22:46
好像還有leave
如果結果跟預期不符時
我會比較進入時跟出來時的esp 差值
下斷一下(挖鼻
記一下ESP
F8
減一下ESP
搞定(被打 偷比 發表於 2015-5-18 23:13
下斷一下(挖鼻
記一下ESP
F8
T_T 我現在不能下斷了
所以只好人工check (昏 kkmomo 發表於 2015-5-19 23:12
T_T 我現在不能下斷了
所以只好人工check (昏
那就問問廈門那位朋友,技術交流一下,彼此切磋切磋
頁:
[1]