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這個結構體。