Hi, i need some help with returning values from DoString, which works fine.
Code:
public void DoString(string lua)
{
Synchronize();
uint codeCave = _magic.AllocateMemory(0x2048);
_magic.WriteBytes(codeCave + 0x1024, Encoding.UTF8 .GetBytes(lua));
// _magic.WriteASCIIString(codeCave + 0x1024, lua);
_magic.Asm.Clear();
AsmUpdateCurrentManager();
//_magic.Asm.AddLine("push {0}", State);
_magic.Asm.AddLine("push {0}", 0);
_magic.Asm.AddLine("mov eax, {0}", codeCave + 0x1024);
_magic.Asm.AddLine("push eax");
_magic.Asm.AddLine("push eax");
_magic.Asm.AddLine("call {0}", (uint)Offsets.Lua.Lua_DoString);
_magic.Asm.AddLine("add esp, 0xC");
_magic.Asm.AddLine("retn");
_magic.Asm.InjectAndExecute(codeCave);
_magic.FreeMemory(codeCave);
ResumeMainThread();
}
This doesn't return anything, but doesn't crash.
Lua.DoString("result1251 = " & cmdstr)
result = Lua.GetLocalizedText("result1251")
Code:
public byte [] GetLocalizedText(string lua)
{
Synchronize();
uint codeCave = _magic.AllocateMemory(0x256 );
// _magic.WriteBytes(codeCave + 0x256, Encoding.UTF8.GetBytes(lua));
_magic.Asm.Clear();
AsmUpdateCurrentManager();
_magic.Asm.AddLine("mov ecx, {0}", BlackRain.Common.Objects.ObjectManager.Me.BaseAddress);// BlackRain.Common.Objects.ObjectManager.Me.BaseAddress);
_magic.Asm.AddLine("push {0}", -1);
_magic.Asm.AddLine("push {0}", codeCave + 0x128);
_magic.Asm.AddLine("call {0}", (uint)Offsets.Lua.Lua_GetLocalizedText);
_magic.Asm.AddLine("retn");
uint result = _magic.Asm.InjectAndExecute(codeCave);
byte[] sResult = new byte [128];
if (result != 0)
{
sResult = _magic.ReadBytes(result, 128);
}
ResumeMainThread();
return sResult;
}
This one crashes.
Code:
public string ToString(int argument, int length)
{
uint codeCave = _magic.AllocateMemory(0x1024);
AsmUpdateCurrentManager();
_magic.Asm.Clear();
_magic.Asm.AddLine("push {0}",0);
_magic.Asm.AddLine("push {0}", argument);
_magic.Asm.AddLine("push {0}", State );
_magic.Asm.AddLine("call {0}", (uint)Offsets.Lua .LuaToString);
_magic.Asm.AddLine("add esp, 0xC");
_magic.Asm.AddLine("retn");
uint result = _magic.Asm.InjectAndExecute(codeCave);
System.Console.WriteLine("ToString: {0:X}", result);
_magic.FreeMemory(codeCave);
try
{
return _magic.ReadASCIIString(result, length);
}
catch (Exception e)
{
return "";
}
}
public override string ToString()
{
return ToString(GetArgument(), 100);
}
private int GetArgument()
{
if (LastArg < GetTop())
{
LastArg++;
}
return LastArg;
}
public int GetTop()
{
uint codeCave = _magic.AllocateMemory(0x1048);
_magic.Asm.Clear();
_magic.Asm.AddLine("push {0}", State);
_magic.Asm.AddLine("call {0}", (uint)Offsets.Lua.LuaGetTop);
_magic.Asm.AddLine("add esp, 0x4");
_magic.Asm.AddLine("retn");
uint result = _magic.Asm.InjectAndExecute(codeCave);
_magic.FreeMemory(codeCave);
return (int)result;
}
public uint GetState()
{
uint codeCave = _magic.AllocateMemory(0x1048);
_magic.Asm.Clear();
_magic.Asm.AddLine("call {0}", (uint)Offsets.Lua.LuaGetState);
_magic.Asm.AddLine("retn");
uint result = _magic.Asm.InjectAndExecute(codeCave);
_magic.FreeMemory(codeCave);
return result;
}
private void ResumeMainThread()
{
SThread.ResumeThread(MainThread);
}
private void Synchronize()
{
SThread.SuspendThread(MainThread);
}
I want to write a simple bot, which will iteract with world using WoW API.
Is it rationally to use this aproach without callbacks to get the return values?