1. #include <ida.idc>
  2. /************************************************************************
  3. Desc: Label all lua functions with proper name
  4. Author: TOM_RUS
  5. Credit: bobbysing for RenameFunc
  6. *************************************************************************/
  7. // 1 = Success, 0 = Failure
  8. static RenameFunc(dwAddress, sFunction)
  9. {
  10. auto dwRet;
  11. //return 1;
  12. dwRet = MakeNameEx(dwAddress, sFunction, SN_NOWARN);
  13. if(dwRet == 0)
  14. {
  15. auto sTemp, i;
  16. for(i = 0; i < 32; ++i)
  17. {
  18. sTemp = form("%s_%i", sFunction, i);
  19. if((dwRet = MakeNameEx(dwAddress, sTemp, SN_NOWARN)) != 0)
  20. {
  21. Message("Info: Renamed to %s instead of %s\n", sTemp, sFunction);
  22. break;
  23. }
  24. }
  25. }
  26. return dwRet;
  27. }
  28. static main()
  29. {
  30. auto counter, x, y, count, i, luaName, luaFunc, luaGlobal;
  31. // Live client 3.2.0.10314
  32. x = FindBinary(0, SEARCH_DOWN, "55 8B EC 8B 45 0C 56 8B 35 ? ? ? ? 6A 00 50 56 E8 ? ? ? ? 8B 4D 08 51 56 E8 ? ? ? ?");
  33. // PTR client 0.2.2.10433
  34. //x = FindBinary(0, SEARCH_DOWN, "55 8B EC 56 8B 35 ? ? ? ? 85 F6 75 22 6A 01 56 68 ? ? ? ? 68 9E 06 00 00 68 ? ? ? ?");
  35. if(x == BADADDR)
  36. {
  37. Message("Can't find FrameScript::RegisterFunction, aborting...\n");
  38. return -1;
  39. }
  40. Message("FrameScript::RegisterFunction found at: %X\n", x);
  41. for(y = RfirstB(x); y != BADADDR; y = RnextB(x, y))
  42. {
  43. auto dwRet, nameOffset, luaOffset, op1, op2, op3;
  44. //Message("Reference at: %X\n", y);
  45. nameOffset = y - 8;
  46. luaOffset = y - 14; // -13 if no loop
  47. //Message("%X %X\n", nameOffset, luaOffset);
  48. //Message("%X %X\n", GetOperandValue(nameOffset, 1), GetOperandValue(luaOffset, 1));
  49. op1 = GetOperandValue(y + 0x05, 1);
  50. op2 = GetOperandValue(y + 0x08, 1);
  51. op3 = GetOperandValue(y + 0x0B, 1);
  52. //Message("op1 %i\n", op1);
  53. //Message("op2 %i\n", op2);
  54. //Message("op3 %i\n", op3);
  55. if(op2 == BADADDR) // all this shit only because of Lua_PlayDance...
  56. {
  57. luaOffset++;
  58. luaName = GetString(Dword(GetOperandValue(nameOffset, 1)), -1, ASCSTR_C);
  59. luaFunc = GetOperandValue(luaOffset, 1);
  60. //Message("%s %X %X\n", luaName, luaFunc, Dword(luaFunc));
  61. if((dwRet = RenameFunc(Dword(luaFunc), form( "Script_%s", luaName))) == 0)
  62. Message("Failed to rename 0x%08X to %s\n", Dword(luaFunc), luaName);
  63. else
  64. counter++;
  65. }
  66. else
  67. {
  68. count = op3 / op2;
  69. //Message("count %i\n", count);
  70. for(i = 0; i < count; ++i)
  71. {
  72. luaName = GetString(Dword(GetOperandValue(nameOffset, 1) + (i * 8)), -1, ASCSTR_C);
  73. luaFunc = GetOperandValue(luaOffset, 1) + (i * 8);
  74. //Message("%s %X %X\n", luaName, luaFunc, Dword(luaFunc));
  75. if((dwRet = RenameFunc(Dword(luaFunc), form("Script_%s", luaName))) == 0)
  76. Message("Failed to rename 0x%08X to %s\n", Dword(luaFunc), luaName);
  77. else
  78. counter++;
  79. }
  80. }
  81. }
  82. // Live client 4.0.1.13164, seems work with PTR too
  83. x = FindBinary(0, SEARCH_DOWN, "55 8B EC 56 33 F6 39 75 10 7E ? 53 8B 5D 0C 57 8B 7D 08 8B 04 F3 50 57 E8 ? ? ? ? 8B 4C F3");
  84. if(x == BADADDR)
  85. {
  86. Message("Can't find FrameScript::FillScriptMethodTable, aborting...\n");
  87. return -1;
  88. }
  89. Message("FrameScript::FillScriptMethodTable found at: %X\n", x);
  90. for(y = RfirstB(x); y != BADADDR; y = RnextB(x, y))
  91. {
  92. auto offset, classCount;
  93. offset = GetOperandValue(y - 6, 0);
  94. count = GetOperandValue(y - 8, 0);
  95. //Message("%X %X %i\n", y, offset, count);
  96. for(i = 0; i < count; ++i)
  97. {
  98. luaName = GetString(Dword(offset + (i * 8)), -1, ASCSTR_C);
  99. luaFunc = Dword(offset + (i * 8) + 4);
  100. //Message("%s %X\n", luaName, luaFunc);
  101. // those functions belong to some FrameScript object class, but we don't know which one...
  102. if((dwRet = RenameFunc(luaFunc, form("Script_%s_class%i", luaName, classCount))) == 0)
  103. Message("Failed to rename 0x%08X to %s\n", luaFunc, luaName);
  104. else
  105. counter++;
  106. }
  107. classCount++;
  108. }
  109. // Live client 3.2.2.10505
  110. x = FindBinary(0, SEARCH_DOWN, "55 8B EC 8B 45 10 8B 4D 0C 8B 55 08 6A 00 50 51 52 E8 ? ? ? ? 83 C4 10 5D C3 ? ? ? ? ?");
  111. if(x == BADADDR)
  112. {
  113. Message("Can't find RegisterLuaApi, aborting...\n");
  114. return -1;
  115. }
  116. Message("RegisterLuaApi found at: %X\n", x);
  117. for(y = RfirstB(x); y != BADADDR; y = RnextB(x, y))
  118. {
  119. offset = ReadPushOperand(y - 11, "offset");
  120. luaGlobal = GetString(ReadPushOperand(y - 1, "offset"), -1, ASCSTR_C);
  121. Message("%X %X %s\n", y, offset, luaGlobal);
  122. i = 0;
  123. while((luaFunc = Dword(offset + (i * 8) + 4)) != 0 && (luaName = GetString(Dword(offset + (i * 8)), -1, ASCSTR_C)) != "")
  124. {
  125. Message("%s %X\n", luaName, luaFunc);
  126. if((dwRet = RenameFunc(luaFunc, form("LuaApi_%s::%s", luaGlobal, luaName))) == 0)
  127. Message("Failed to rename 0x%08X to %s\n", luaFunc, luaName);
  128. else
  129. counter++;
  130. i++;
  131. }
  132. }
  133. Message("Successfully renamed %i lua functions!\n", counter);
  134. return 0;
  135. }
  136. static ReadPushOperand( xref, filter )
  137. {
  138. do
  139. {
  140. auto disasm;
  141. disasm = GetDisasm( xref );
  142. if ( strstr( disasm, "push" ) > -1 && strstr( disasm, filter ) > -1 )
  143. break;
  144. xref = PrevHead( xref, PrevFunction( xref ) );
  145. } while ( 1 );
  146. return GetOperandValue( xref, 0 );
  147. }