冰楓論壇

標題: alarm script [打印本頁]

作者: kkmomo    時間: 2015-5-18 03:01
標題: alarm script
無聊寫的, 跟版本無關
  1. // main script
  2. [enable]
  3. GlobalAlloc(alarm, 64)
  4. GlobalAlloc(alarm_switch, 4)
  5. CreateThread(alarm)

  6. alarm_switch:
  7. DD 00

  8. alarm:
  9. push 00
  10. call Sleep

  11. // === 警報條件 ===
  12. //ex:
  13. mov eax, [測謊狀態 ptr] //看有沒有大大肯更新?
  14. and eax, [alarm_switch]
  15. test eax, eax
  16. je alarm
  17. // === 警報條件 ===

  18. // === 發出警報 ===
  19. push #440 // dwDuration
  20. push #1000 // dwFreq
  21. call beep
  22. // === 發出警報 ===

  23. jmp  alarm

  24. [disable]
複製代碼
  1. // switch
  2. [enable]
  3. alarm_switch:
  4. DD -1

  5. [disable]
  6. alarm_switch:
  7. DD 0
複製代碼

作者: anderson101866    時間: 2015-5-18 11:47
測謊狀態: 0x0183FCE0 (v179.1)

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

關於楓谷使用API的方式

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

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

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

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

(stdcall, 呼叫者只需把參數push進去,API內部自行吃掉參數以後pop掉)
作者: kkmomo    時間: 2015-5-18 12:48
本帖最後由 kkmomo 於 2015-5-18 13:08 編輯
anderson101866 發表於 2015-5-18 11:47 [url=forum.php?mod=redirect&goto=findpost&pid=1020269&ptid=127645][/url]
測謊狀態: 0x0183FCE0 (v179.1)

大大 對了可以順便問個問題嗎
謝啦
我把時間改成240C8400 雖然畫面上時間一直停在9:xx
不過5分鐘到了還是GG,想得太天真了 哈哈

push 順序是args由後往前傳,是問這個嗎?

func(a[1], a[2], a[3], ..., a[n])

push a[n]
push a[n-1]
...
push a[1]
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 [B], eax

mov eax, [B]
mov [C], eax

push [C]
push [B]
push [A]
call test


作者: anderson101866    時間: 2015-5-18 13:39
本帖最後由 anderson101866 於 2015-5-18 13:56 編輯

是說我用 Ret N 去GOOGLE 搜到了XD 乾蝦

貼在這邊:
ret, retn, retf - how to use them

內文:
  1. push    ebp
  2. mov     ebp, esp
  3. sub     esp, 8
  4. .. 略
  5. 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
anderson101866 發表於 2015-5-18 13:39 [url=forum.php?mod=redirect&goto=findpost&pid=1020308&ptid=127645][/url]
是說我用 Ret N 去GOOGLE 搜到了XD 乾蝦

貼在這邊:

原來是要問這個啊....
作者: kkmomo    時間: 2015-5-18 22:46
好像還有leave
如果結果跟預期不符時
我會比較進入時跟出來時的esp 差值
調整成一樣應該不太會有錯

我是習慣先try一次 , 可用就ok
不行再google查一下定義,然後寫個小程式調用,看asm實際怎麼走
作者: 偷比    時間: 2015-5-18 23:13
kkmomo 發表於 2015-5-18 22:46 [url=forum.php?mod=redirect&goto=findpost&pid=1020882&ptid=127645][/url]
好像還有leave
如果結果跟預期不符時
我會比較進入時跟出來時的esp 差值

下斷一下(挖鼻
記一下ESP
F8
減一下ESP
搞定(被打
作者: kkmomo    時間: 2015-5-19 23:12
偷比 發表於 2015-5-18 23:13 [url=forum.php?mod=redirect&goto=findpost&pid=1020954&ptid=127645][/url]
下斷一下(挖鼻
記一下ESP
F8

T_T 我現在不能下斷了
所以只好人工check (昏
作者: 偷比    時間: 2015-5-20 01:25
kkmomo 發表於 2015-5-19 23:12 [url=forum.php?mod=redirect&goto=findpost&pid=1022030&ptid=127645][/url]
T_T 我現在不能下斷了
所以只好人工check (昏

那就問問廈門那位朋友,技術交流一下,彼此切磋切磋




歡迎光臨 冰楓論壇 (https://bingfong.com/) Powered by 冰楓