kkmomo 發表於 2015-5-18 03:01:33

alarm script

無聊寫的, 跟版本無關// main script

GlobalAlloc(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

anderson101866 發表於 2015-5-18 11:47:45

測謊狀態: 0x0183FCE0 (v179.1)

大大 對了可以順便問個問題嗎

關於楓谷使用API的方式

請問那個call convention有固定嗎? 就是(stdcall呀甚麼的那些... )

>>
其實我想問的是傳參數方式,

因為我不太知道怎麼把參數傳進去XD,大多數的數據看起來是都直接push (stdcall, 我之前看到的也是)

那是因為楓谷原生是用VC++寫嗎? 還是Windows API固定都是用這種傳法呢?:o

(stdcall, 呼叫者只需把參數push進去,API內部自行吃掉參數以後pop掉)

kkmomo 發表於 2015-5-18 12:48:23

本帖最後由 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:39:43

本帖最後由 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

Doem 發表於 2015-5-18 21:17:09

anderson101866 發表於 2015-5-18 13:39
是說我用 Ret N 去GOOGLE 搜到了XD 乾蝦

貼在這邊:


原來是要問這個啊....

kkmomo 發表於 2015-5-18 22:46:59

好像還有leave
如果結果跟預期不符時
我會比較進入時跟出來時的esp 差值
調整成一樣應該不太會有錯

我是習慣先try一次 , 可用就ok
不行再google查一下定義,然後寫個小程式調用,看asm實際怎麼走

偷比 發表於 2015-5-18 23:13:27

kkmomo 發表於 2015-5-18 22:46
好像還有leave
如果結果跟預期不符時
我會比較進入時跟出來時的esp 差值


下斷一下(挖鼻
記一下ESP
F8
減一下ESP
搞定(被打

kkmomo 發表於 2015-5-19 23:12:16

偷比 發表於 2015-5-18 23:13
下斷一下(挖鼻
記一下ESP
F8


T_T 我現在不能下斷了
所以只好人工check (昏

偷比 發表於 2015-5-20 01:25:26

kkmomo 發表於 2015-5-19 23:12
T_T 我現在不能下斷了
所以只好人工check (昏

那就問問廈門那位朋友,技術交流一下,彼此切磋切磋
頁: [1]
查看完整版本: alarm script