aardio調用匯編代碼獲取返回值的方法

aardio編程軟件可以對外部進程注入彙編代碼,並且轉換成aardio函數很方便的調用。有時候需要獲取彙編代碼內的某些數據,把這個數據作爲aardio函數的返回值。要讓注入代碼的aardio函數有返回值,需要注意2點。

1、聲明函數返回值必須是void,聲明爲其他類型時,該函數都不會有返回值。

2、聲明的函數參數內必須有一個指針類型的參數,這個指針指向的內存數據就是aardio函數的返回值。注意:注入的彙編代碼必須把數據寫入該指針內存。示例代碼:

func = app.asmCdecl(
	"void(INT call_addr,int &result)",
	'\x8B\x4C\x24\x04', //mov ecx, [esp+0x4]
	'\x8B\x54\x24\x08', //mov edx, [esp+0x8]
	'\xFF\xD1', //call ecx
	'\x89\x02', //mov [edx], eax,把結果寫入指針內存
	'\xC3', //ret
)
result=func(0x415E20,0);

另外,如果彙編代碼內有多個數據需要返回,可以使用結構體指針,例如:

func = app.asmCdecl(
	"void(INT call_addr,struct &result)",
	'\x8B\x4C\x24\x04', //mov ecx, [esp+0x4]
	'\x8B\x54\x24\x08', //mov edx, [esp+0x8]
	'\xFF\xD1', //call ecx
	'\x89\x02', //mov [edx], eax
	'\xB9\xE0\x56\x41\x00', //mov ecx, 0x4156e0
	'\xFF\xD1', //call ecx
	'\x89\x42\x04', //mov [edx+0x4], eax
	'\xC3', //ret
)
data={int result=0;int result2=0};
func(0x415E20,data);

這樣的代碼執行後,data.result和data.result2就是彙編代碼內2個call的返回值。同時,func這個函數的返回值也是data這個結構體。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章