Advertisement
Guest User

Untitled

a guest
Jul 8th, 2014
442
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 82.21 KB | None | 0 0
  1. #include amxmodx
  2. #include amxmisc
  3.  
  4. #include orpheu
  5. #include orpheu_memory
  6. #include orpheu_advanced
  7.  
  8. #define PLUGIN_NAME "Check files by OSTROG"
  9. #define PLUGIN_VERSION "1.0"
  10. #define PLUGIN_AUTHOR "OSTROG"
  11.  
  12. //  Название команды на меню
  13. #define SHOW_MENU_CMD_NAME  "ost_menu_create"
  14.  
  15. #define CONFIG_PATH                 "addons/amxmodx/configs/ost_path_list.ini"
  16. #define ORPHEU_FUNCTIONS_PATH       "addons/amxmodx/configs/orpheu/functions/"
  17. #define ORPHEU_MEMORY_PATH          "addons/amxmodx/configs/orpheu/memory/"
  18.  
  19. #define CONSOLE_PRINT_PREFIX        "[OST Check Files] "
  20. #define CONSOLE_PRINT_ERROR_PREFIX  "[ERROR] "
  21.  
  22. static  NAME_CMD_PATH[]                     =   "add_path"
  23. static  NAME_CMD_ACCESS[]                   =   "add_flags"
  24. static  CHAR_PATH_W_B[]                     =   "["
  25. static  CHAR_PATH_W_E[]                     =   "]"
  26. static  CHAR_PATH_R_E[]                     =   "="
  27.  
  28. static  CONFIG_SAVE[]                       =   "add_path[ kick ^"%n^" ^"OpenGL Detected^" ] = ../opengl32.dll^r^nadd_path[ kick ^"%n^" ^"Anime Detected^" ] = ../anime.ini^r^nadd_path[ kick ^"%n^" ^"CSXGuard Detected^" ] = ../CSXGuard.dll^r^nadd_path[ kick ^"%n^" ^"Protector Detected^" ] = ../protector.dll^r^nadd_flags = abcd"
  29.  
  30.  
  31.  
  32. /*    ######################################    EngineBase Begin    ######################################    */
  33. static  ORPHEU_NAME_ENGINE_BASE[]                       =   "__ost_engine_base"
  34. static  ORPHEU_PATTERN_ENGINE_BASE[]                    =   "[^"*^"]"
  35. /*     ######################################    EngineBase End    ######################################     */
  36.  
  37. /*    ######################################    WriteByteEng Begin    ######################################    */
  38. static  ORPHEU_NAME_WRITE_BYTE_ENG[]                    =   "__ost_write_byte_eng"
  39. static  ORPHEU_PATTERN_WRITE_BYTE_ENG[]                 =   "0"
  40. /*     ######################################    WriteByteEng End    ######################################     */
  41.  
  42. /*    ######################################    WriteByte Begin    ######################################    */
  43. static  ORPHEU_NAME_WRITE_BYTE[]                        =   "__ost_write_byte"
  44. static  ORPHEU_ARGV_WRITE_BYTE[]                        =   "{^"type^":^"long^"},{^"type^":^"long^"}"
  45. static  ORPHEU_RET_WRITE_BYTE[]                         =   "long"
  46. static  ORPHEU_PATTERN_WRITE_BYTE[]                     =   "[0x43,0x6D,0x64,0x5F,0x41,0x64,0x64,0x43,0x6F,0x6D,0x6D,0x61,0x6E,0x64,0x3A,0x20,0x25,0x73,0x20,0x61,0x6C,0x72,0x65,0x61,0x64,0x79,0x20,0x64,0x65,0x66,0x69,0x6E,0x65,0x64,0x20,0x61,0x73,0x20,0x61,0x20,0x76,0x61,0x72,0x0A,0x00]"
  47. /*     ######################################    WriteByte End    ######################################     */
  48.  
  49. /*    ######################################    MoveResource Begin    ######################################    */
  50. static  ORPHEU_NAME_MOVE_RESOURCE[]                     =   "__ost_move_resource"
  51. static  ORPHEU_ARGV_MOVE_RESOURCE[]                     =   "{^"type^":^"long^"},{^"type^":^"long^"},{^"type^":^"long^"}"
  52. static  ORPHEU_RET_MOVE_RESOURCE[]                      =   "long"
  53. /*     ######################################    MoveResource End    ######################################     */
  54.  
  55. /*    ######################################    Malloc Begin    ######################################    */
  56. static  ORPHEU_NAME_MALLOC_WIN[]                        =   "__ost_malloc_win"
  57.  
  58. static  ORPHEU_NAME_MALLOC_LIN[]                        =   "__ost_malloc_lin"
  59. static  ORPHEU_PATTERN_MALLOC_W[]                       =   "[^"*^"]"
  60. static  ORPHEU_PATTERN_MALLOC_L[]                       =   "^"Hunk_Alloc^""
  61.  
  62. static  ORPHEU_ARGV_MALLOC[]                            =   "{^"type^":^"long^"}"
  63. static  ORPHEU_RET_MALLOC[]                             =   "long"
  64. /*     ######################################    Malloc End    ######################################     */
  65.  
  66. /*    ######################################    Cbuf_AddText Begin    ######################################    */
  67. static  ORPHEU_NAME_CBUF_ADDTEXT[]                      =   "__ost_cbuf_addtext_lin"
  68. static  ORPHEU_PATTERN_CBUF_ADDTEXT_W[]                 =   "[^"*^"]"
  69. static  ORPHEU_PATTERN_CBUF_ADDTEXT_L[]                 =   "^"Cbuf_AddText^""
  70. /*     ######################################    Cbuf_AddText End    ######################################     */
  71.  
  72. /*    ######################################    SV_SendRes_f Begin    ######################################    */
  73. static  ORPHEU_NAME_SV_SENDRES_F[]                      =   "__ost_sv_sendres_f"
  74. static  ORPHEU_PATTERN_CALL_BASE_W[]                    =   "[0xE8,^"*^",^"*^",^"*^",^"*^",0x8B,0x0D,^"*^",^"*^",^"*^",^"*^",0x8D,0x45,0xEC,0x83,0xC1,0x20,0x50,0x51,0x6A,0x01,0xE8]"
  75. static  ORPHEU_PATTERN_CALL_BASE_L[]                    =   "^"SV_SendRes_f^""
  76. /*     ######################################    SV_SendRes_f End    ######################################     */
  77.  
  78. /*    ######################################    SV_ParseConsistencyResponse Begin    ######################################    */
  79. static  ORPHEU_NAME_SV_PARSECONS[]                      =   "__ost_sv_parseconsistencyresponse"
  80. static  ORPHEU_PATTERN_SV_PARSECONS_W[]                 =   "[0xE8,^"*^",^"*^",^"*^",^"*^",0x8B,0x4E,0x4D,0x83,0xC4,0x04,0x3B,0xC1,0x0F,0x84,^"*^",^"*^",^"*^",^"*^",0xE9,^"*^",^"*^",^"*^",^"*^",0x8D,0x55,0xEC,0x6A,0x0C,0x52,0xE8,^"*^",^"*^",^"*^",^"*^",0x8D,0x45,0xE0,0x6A,0x0C,0x50,0xE8,^"*^",^"*^",^"*^",^"*^"]"
  81. static  ORPHEU_PATTERN_SV_PARSECONS_L[]                 =   "^"SV_ParseConsistencyResponse^""
  82. /*     ######################################    SV_ParseConsistencyResponse End    ######################################     */
  83.  
  84. /*    ######################################    SV_SendResources Begin    ######################################    */
  85. static  ORPHEU_NAME_SV_SENDRES[]                        =   "__ost_sv_sendresources_lin"
  86. static  ORPHEU_PATTERN_SV_SENDRES_W[]                   =   "[^"*^"]"
  87. static  ORPHEU_PATTERN_SV_SENDRES_L[]                   =   "^"SV_SendResources^""
  88. /*     ######################################    SV_SendResources End    ######################################     */
  89.  
  90. /*    ######################################    MSG_ReadBits Begin    ######################################    */
  91. static  ORPHEU_NAME_MSG_READBITS[]                      =   "__ost_msg_readbits_lin"
  92. static  ORPHEU_PATTERN_MSG_READBITS_W[]                 =   "[^"*^"]"
  93. static  ORPHEU_PATTERN_MSG_READBITS_L[]                 =   "^"MSG_ReadBits^""
  94. /*     ######################################    MSG_ReadBits End    ######################################     */
  95.  
  96. /*    ######################################    MSG_WriteBits Begin    ######################################    */
  97. static  ORPHEU_NAME_MSG_WRITEBITS[]                     =   "__ost_msg_writebits_lin"
  98. static  ORPHEU_PATTERN_MSG_WRITEBITS_W[]                =   "[^"*^"]"
  99. static  ORPHEU_PATTERN_MSG_WRITEBITS_L[]                =   "^"MSG_WriteBits^""
  100. /*     ######################################    MSG_WriteBits End    ######################################     */
  101.  
  102.  
  103.  
  104. static  SAVE_ORIGINAL_DATA_W[] = {
  105.     0x43,0x6D,0x64,0x5F,0x41,0x64,0x64,0x43,0x6F,0x6D,0x6D,0x61,0x6E,0x64,0x3A,0x20,0x25,0x73,0x20,
  106.     0x61,0x6C,0x72,0x65,0x61,0x64,0x79,0x20,0x64,0x65,0x66,0x69,0x6E,0x65,0x64,0x20,0x61,0x73,0x20,
  107.     0x61,0x20,0x76,0x61,0x72,0x0A,0x00
  108. }
  109.  
  110.  
  111.  
  112.  
  113. static  BYTE_CODE_W_BYTE[] = { 0x8A, 0x44, 0x24, 0x08, 0x8B, 0x54, 0x24, 0x04, 0x88, 0x02, 0xC3 , 0x00 }
  114. static  BYTE_CODE_MOVE_RESOURCE[] = { 0x57577342,0x0E251341,0x12250B6D,0x16254389,0xFD03A84F,0xC0305C19,0x0000E2AF,0xABF2949C,0x9D673679,0x00418359,0x51ED8A3B,0xFE44BDCE }
  115. static  BYTE_CODE_RANDOM[] = {
  116.     0x32C68851,0x00015884,0xF2FCFFD7,0xB8060BA6,0x00010030,0xFFB9C16D,0x290100E1,0x90C235D4,0x89522D72,0xFCE07FA1,0x29FE9551,0x02E8BF69,0xD688BD97,0x89A49128,0x5BA5912F,0x90C23305,
  117.     0x89522C12,0xFCE082C1,0x29FE9431,0x02E8C209,0xD688BCF7,0x75A69048,0xF3D88933,0xB8060E7E,0x000102FF,0x00B8FDC1,0x5B010288,0x90C234D5,0x83ED87A3,0x4D88B070,0xF8547C8C,0x8BFD497B,
  118.     0x4527FFE3,0x0C447E1C,0xFFE548EF,0x458AA747,0xF8547EAC,0x5F73B4F1,0xE0547B06,0x8BFD489B,0xC084A8C3,0x8940DBAA,0x45C6B18B,0x000104C0,0xF4447E90,0x0FED4A89,0x4588050A,0xE87C8654,
  119.     0x00010579,0x458A00D0,0xEC4404B4,0x3B0158C5,0x08749D33,0xFFED4ACD,0xD574B273,0x3BED4AD9,0x0B740283,0x03FD49A1,0x4587FFCB,0xFF0C9BBC,0x4DFE9213,0x33A915D4,0xF04481D8,0x8BF145F9,
  120.     0x08C32DC3,0x00417DC4,0x83ED821B,0x89679A48,0x83678CF3,0x75018F8F,0x89C0D879,0x4BEA915F,0x22F542C1,0x8B22EBFA,0x6967940B,0x4085052C,0xF2447EF2,0x66F547F1,0x66F337DD,0xB70DFB3B,
  121.     0xB70E9623,0xEAF68AB7,0xC1ED472F,0x0F119CA7,0x89ED4721,0xB70E93D7,0x453A8DFB,0x660D1284,0xE8FF4745,0xFFFE8A04,0x8BF9440F,0xE58A93AF,0xC08AC6AB,0x51ED9707,0x62FDD05A,0x0002C21E,
  122.     0xFFFE8F48,0x01E98F1D,0x15751366,0xEB22FE44,0x18B8F39A,0xFF6F75D4,0x61058861,0xEBFDD194,0x18B8F33A,0xFF5F7564,0x410588D1,0xEBFDCE24,0x08B8F29A,0xFF4F74F4,0x30058941,0x8AFDD2B4,
  123.     0x5D5889A3,0x00419BB9,0x83ED94DB,0x45C68088,0x11101FE8,0x08B8F1FB,0xFF2B77B8,0x45028605,0x04C18A58,0xEBF4D0A3,0xFF877703,0x558A86B5,0xFF0397C8,0x458A8677,0xF4444B00,0x458A7BAF,
  124.     0x00014FB8,0x8BFCCE41,0x90C1E68B,0x9C66DDEE,0xB1E8EDD2,0x66FE840D,0x669BEC67,0x33327524,0xFFFE434D,0xFFFE87BD,0xFFFE8751,0xFFFE8775,0xFFFE8709,0xFFFE872D,0xFFFE86C1,0xFFFE86E5,
  125.     0xFFFE86F9,0xFFFE86DD,0xFFFE8631,0xFFFE8615,0xFFFE8669,0xFFFE864D,0xFFFE81A1,0xFFFE8185,0xFFFE81D9,0xFFFE81FD,0xFFFE8111,0xC08A4D35,0xFFFE8149,0xFFFE816D
  126. }
  127. static  BYTE_CODE_GET_INDEX_FILE[] = {
  128.     0x22E90346,0x8322E1DA,0x0587FBAC,0x110FF0E3,0xFFFE964D,0xFFFE960D,0xFFFE95E1,0xFFFE95C5,0xFFFE9599,0xFFFE95BD,0xFFFE9551,0xFFFE9575,0xFFFE9509,0xFFFE952D,0xFFFE94C1,0xFFFE94E5,
  129.     0xC3FE94F9,0xFFFE94DD,0xFFFE9431
  130. }
  131. static  BYTE_CODE_TRY_FILES[] = {
  132.     0x32C68851,0x00015884,0xF2FCFFD7,0xB8060BA6,0x00010030,0xFFB9C16D,0x290100E1,0x90C235D4,0x89522D72,0xFCE07FA1,0x29FE9551,0x02E8BF69,0xD688BD97,0x89A49128,0x5BA5912F,0x90C23305,
  133.     0x89522C12,0xFCE082C1,0x29FE9431,0x02E8C209,0xD688BCF7,0x75A69048,0xF3D88933,0xB8060E7E,0x000102FF,0x00B8FDC1,0x5B010288,0x90C234D5,0x83ED87A3,0x4D88B070,0xF8547C8C,0x8BFD497B,
  134.     0x4527FFE3,0x0C447E1C,0xFFE548EF,0x458AA747,0xF8547EAC,0x5F73B4F1,0xE0547B06,0x8BFD489B,0xC084A8C3,0x8940DBAA,0x45C6B18B,0x000104C0,0xF4447E90,0x0FED4A89,0x4588050A,0xE87C8654,
  135.     0x00010579,0x458A00D0,0xEC4404B4,0x3B0158C5,0x08749D33,0xFFED4ACD,0xD574B273,0x3BED4AD9,0x0B740283,0x03FD49A1,0x4587FFCB,0xFF0C9BBC,0x4DFE9213,0x33A915D4,0xF04481D8,0x8BF145F9,
  136.     0x08C32DC3,0x00417DC4,0x83ED821B,0x55889248,0xFC448128,0xB9FD42D1,0x0001097E,0xF1F6BB91,0x8B31CA00,0xC0829027,0xB91181CF,0x0001082A,0x33FD4295,0x89F095DA,0x458A8C9B,0x000B53E0,
  137.     0xD23208E0,0xC2819BD5,0xF84481F8,0x8809C831,0x000B5240,0x458A0B14,0xF7D2D6A4,0xFC448093,0xB9FD4745,0x00010BA2,0xF1F6B9C5,0x8B31C9EC,0xC0829393,0xB9119235,0x00010A1E,0x33FCD079,
  138.     0x89F0834E,0x458A8987,0x000BC5F4,0xD2320D8C,0xC2817DA1,0xF84494C4,0x88074D45,0x000BC2EC,0x458A0D00,0xF7D33C38,0xFC4492C7,0xB9FCCE29,0x00010C96,0xF1F65AF9,0x8B314A58,0xC08284FF,
  139.     0xB9119463,0x00010C02,0x33FCD3AD,0x89F081E2,0x458A8833,0x000BC7C8,0xD2320FB8,0xC2817C0D,0xF8449290,0x88054FD9,0x000BC438,0x458A0EEC,0xF7D33ACC,0xFC4498FB,0xB9FCCD1D,0x00010E7A,
  140.     0xF1F6636D,0x8B315344,0xC0828A2B,0xB91195F1,0x00011236,0x33FCC9D1,0x89F07C16,0x458A865F,0x000BC59C,0xD23212E4,0xC2817D59,0xF844983C,0x880352AD,0x000BC804,0x458A1358,0xF7D342E0,
  141.     0xFC4498EF,0xB9FCCC01,0x000113AE,0xF1F66241,0x8B314DF0,0x884188D7,0x000BCB08,0x458A10DC,0xF7D33DDC,0xFC449BEB,0xB9FCCF0D,0x0001116A,0xF1F6629D,0x8B3157B4,0x108979DB,0x8BF4DB79,
  142.     0x90C1E243,0x83ED8C77,0x4D88692C,0xF8548ED8,0x8BFCDA37,0x408A8217,0xEC4489CC,0xC7ECDA99,0x2062E300,0xEC448F7A,0xB90556F5,0x0001178C,0xE8F8E515,0xFFFE801C,0x83ECD85D,0xC082377C,
  143.     0x00015564,0xE8ECD881,0xFFFE807C,0x8BE8D84B,0x45027333,0x00C5FBFC,0x458234E6,0x558A1634,0xE854112C,0x35F4DBA1,0x00134FB6,0xFFFF2584,0xE84491C9,0xEC4490B2,0x66E8D6A5,0x000B153D,
  144.     0x50ECD625,0xFFFCD741,0x8B580F18,0xE58A84CF,0xC08A59CB,0x83ED9267,0x4D885E3C,0xF8548CC8,0x8BFCD707,0x408A7E27,0xEC448CFC,0xE8F4D0A9,0xFFFE7F5C,0x8BE0D5F3,0x4502869B,0x02E99BDC,
  145.     0x8BDCD467,0x45888547,0x8B0C73C0,0x8167728F,0x746F35A8,0xE8447811,0x3BE8D6BD,0xEB745D1F,0x3BE8D545,0x26745C67,0x8BE0CE0D,0x458A85DF,0xFCAB713C,0x458A786D,0xE0441C74,0x0A01611E,
  146.     0xEC44A520,0xFC44A574,0x590CC8F1,0x4589F0E9,0xF44445D8,0x8BE4DC53,0x558A8333,0xEC44A648,0xFFFCF668,0xEC44A63D,0xB9E4DC75,0x00011E8C,0xE8F8CC15,0xFFFE7A1C,0x03ECE15D,0xC08282FF,
  147.     0x00015C40,0xE8ECE181,0xFFFE7A7C,0x8BE4E14B,0x452A5A33,0x4587DCFC,0xE854A7D8,0x8B035F21,0x45028983,0xE04CA040,0xFFFD2860,0xEC44A0B5,0x03E4E1ED,0xC7677C77,0x8B012A98,0x8B5180BF,
  148.     0x50FE7763,0x4589DCC8,0x5DE4AE78,0x0041A031,0x83EDAEC3,0x45888110,0xFC44ADE4,0xC7F8D81B,0x11106843,0x33B90B8B,0x8B323585,0xF044AC2C,0x8BF0DF95,0x023A6947,0xC0320755,0x8BF8DB3B,
  149.     0x408A6923,0x0501AC8C,0x0000E2A0,0x83ECDACB,0x750175EB,0xFC44A363,0x89F4C9BD,0x4D8A1A62,0xEC54A3DC,0xE8F4D921,0xFFFE70B0,0x458A3C09,0x0441A344,0x74FCEC21,0xF4449A31,0x8B10E079,
  150.     0x3C8277D3,0x207527B4,0x8BFCECED,0x4288733F,0xF4449BB4,0x8B10E051,0x0C8A700B,0xEC54996C,0xE8F4EC85,0xFFFE7788,0x8BF8E3CD,0x90C1CBCF,0x9C66D272,0x5756D2DA,0xE820FF35,0x22234722,
  151.     0xFF4B7996,0x5F5A745D,0x665ACBD2,0xC35B03B7,0xFFFE74E9,0xFFFE74CD,0xFFFE6B21,0xFFFE6B05,0xFFFE6B59,0xFFFE6B7D,0xFFFE6B91,0xFFFE6BB5,0xFFFE6BC9,0xFFFE6BED,0xFFFE6A01,0xFFFE6A25,
  152.     0x90C26BB9,0xFFFE6B9D,0xFFFE6B71
  153. }
  154.  
  155.  
  156.  
  157. #define OS_BAD      0
  158. #define OS_WINDOWS  1
  159. #define OS_LINUX    2
  160.  
  161. static OS = OS_BAD
  162. static PE_Base = 0
  163. static MODULE_SIZE = 0
  164.  
  165. static IF_RESTART = false
  166. static CURR_PATH_FILE[1024]
  167. static ENGINE_BASE = 0
  168. static ENGINE_END = 10*1024*1024
  169. static Malloc_Base = 0
  170. static WriteByteAddr = 0
  171. static OrpheuFunction:o_Malloc
  172. static OrpheuFunction:o_wByte
  173. static OrpheuFunction:o_MoveResource
  174. static SV_SendResourcesCall_Base = 0
  175. static SV_SendResources = 0
  176. static Resources_Base = 0
  177. static CountResources_Base = 0
  178. static SomeTotalValue_Base = 0
  179. static Cbuf_AddText = 0
  180. static MSG_ReadBits = 0
  181. static MSG_WriteBits = 0
  182. static SV_SendRes_f_Lin = 0
  183. static SV_ParseCons = 0
  184. static SV_ParseConsCall_Base = 0
  185. static FileIndexCall_Base = 0
  186. static FileIndex_Base = 0
  187. static WriteByteProcess = false
  188.  
  189. static InfoTable_Size = 0x500
  190. static InfoTable_Base = 0
  191.  
  192. static TASK_ID = 1
  193.  
  194. static global_host_client = 0
  195. static RandomPathID = 0
  196. static RandomPathCode_Base = 0
  197. static RandomPathEntryPoint_Base = 0
  198. static TryFilesCode_Base = 0
  199. static GetFileIndex_EntryPoint = 0
  200. static TryFiles_EntryPoint = 0
  201. static OwnResourcesCount = 0
  202. static MoveResourseProcess = false
  203.  
  204. static AdminFlags[ 1024 ] = ""
  205.  
  206. #define REOURCE_COUNT_MAX       0x500
  207. #define REOURCE_ITEM_SIZE       0x88
  208. #define CONS_DATA_COUNT_MAX     0x200
  209.  
  210. /*
  211. 5758 {
  212.     amd     =   0x00080DBF
  213.     i486    =   0x0009242E
  214.     i686    =   0x0008DC4F
  215. }
  216. 6132 {
  217.     i486fb  =   0x0008B569
  218. }
  219. __ost_real_write_byte
  220. */
  221.  
  222. public plugin_init() {
  223.  
  224.     register_plugin (   PLUGIN_NAME     ,   PLUGIN_VERSION          ,   PLUGIN_AUTHOR   )
  225.  
  226.     MSG_Print( "Loaded..." )
  227.  
  228.  
  229.  
  230.     TryConfig()
  231.  
  232.     read_function_init()
  233.  
  234. }
  235. public plugin_end() {
  236.  
  237.     DeatchAllEngineHook()
  238.  
  239. }
  240.  
  241.  
  242.  
  243. stock MSG_Print( msg[] ) {
  244.    
  245.     server_print( "%s%s" , CONSOLE_PRINT_PREFIX , msg )
  246.  
  247. }
  248. stock MSG_Error( msg[] ) {
  249.  
  250.     server_print( "%s%s%s" , CONSOLE_PRINT_PREFIX , CONSOLE_PRINT_ERROR_PREFIX , msg )
  251.  
  252. }
  253. stock GetDWordHex( W ) {
  254.  
  255.     static HexTable[256][2] = {
  256.         { 0x30 , 0x30 } , { 0x30 , 0x31 } , { 0x30 , 0x32 } , { 0x30 , 0x33 } , { 0x30 , 0x34 } , { 0x30 , 0x35 } , { 0x30 , 0x36 } , { 0x30 , 0x37 } , { 0x30 , 0x38 } , { 0x30 , 0x39 } , { 0x30 , 0x41 } , { 0x30 , 0x42 } , { 0x30 , 0x43 } , { 0x30 , 0x44 } , { 0x30 , 0x45 } , { 0x30 , 0x46 } ,
  257.         { 0x31 , 0x30 } , { 0x31 , 0x31 } , { 0x31 , 0x32 } , { 0x31 , 0x33 } , { 0x31 , 0x34 } , { 0x31 , 0x35 } , { 0x31 , 0x36 } , { 0x31 , 0x37 } , { 0x31 , 0x38 } , { 0x31 , 0x39 } , { 0x31 , 0x41 } , { 0x31 , 0x42 } , { 0x31 , 0x43 } , { 0x31 , 0x44 } , { 0x31 , 0x45 } , { 0x31 , 0x46 } ,
  258.         { 0x32 , 0x30 } , { 0x32 , 0x31 } , { 0x32 , 0x32 } , { 0x32 , 0x33 } , { 0x32 , 0x34 } , { 0x32 , 0x35 } , { 0x32 , 0x36 } , { 0x32 , 0x37 } , { 0x32 , 0x38 } , { 0x32 , 0x39 } , { 0x32 , 0x41 } , { 0x32 , 0x42 } , { 0x32 , 0x43 } , { 0x32 , 0x44 } , { 0x32 , 0x45 } , { 0x32 , 0x46 } ,
  259.         { 0x33 , 0x30 } , { 0x33 , 0x31 } , { 0x33 , 0x32 } , { 0x33 , 0x33 } , { 0x33 , 0x34 } , { 0x33 , 0x35 } , { 0x33 , 0x36 } , { 0x33 , 0x37 } , { 0x33 , 0x38 } , { 0x33 , 0x39 } , { 0x33 , 0x41 } , { 0x33 , 0x42 } , { 0x33 , 0x43 } , { 0x33 , 0x44 } , { 0x33 , 0x45 } , { 0x33 , 0x46 } ,
  260.        
  261.         { 0x34 , 0x30 } , { 0x34 , 0x31 } , { 0x34 , 0x32 } , { 0x34 , 0x33 } , { 0x34 , 0x34 } , { 0x34 , 0x35 } , { 0x34 , 0x36 } , { 0x34 , 0x37 } , { 0x34 , 0x38 } , { 0x34 , 0x39 } , { 0x34 , 0x41 } , { 0x34 , 0x42 } , { 0x34 , 0x43 } , { 0x34 , 0x44 } , { 0x34 , 0x45 } , { 0x34 , 0x46 } ,
  262.         { 0x35 , 0x30 } , { 0x35 , 0x31 } , { 0x35 , 0x32 } , { 0x35 , 0x33 } , { 0x35 , 0x34 } , { 0x35 , 0x35 } , { 0x35 , 0x36 } , { 0x35 , 0x37 } , { 0x35 , 0x38 } , { 0x35 , 0x39 } , { 0x35 , 0x41 } , { 0x35 , 0x42 } , { 0x35 , 0x43 } , { 0x35 , 0x44 } , { 0x35 , 0x45 } , { 0x35 , 0x46 } ,
  263.         { 0x36 , 0x30 } , { 0x36 , 0x31 } , { 0x36 , 0x32 } , { 0x36 , 0x33 } , { 0x36 , 0x34 } , { 0x36 , 0x35 } , { 0x36 , 0x36 } , { 0x36 , 0x37 } , { 0x36 , 0x38 } , { 0x36 , 0x39 } , { 0x36 , 0x41 } , { 0x36 , 0x42 } , { 0x36 , 0x43 } , { 0x36 , 0x44 } , { 0x36 , 0x45 } , { 0x36 , 0x46 } ,
  264.         { 0x37 , 0x30 } , { 0x37 , 0x31 } , { 0x37 , 0x32 } , { 0x37 , 0x33 } , { 0x37 , 0x34 } , { 0x37 , 0x35 } , { 0x37 , 0x36 } , { 0x37 , 0x37 } , { 0x37 , 0x38 } , { 0x37 , 0x39 } , { 0x37 , 0x41 } , { 0x37 , 0x42 } , { 0x37 , 0x43 } , { 0x37 , 0x44 } , { 0x37 , 0x45 } , { 0x37 , 0x46 } ,
  265.        
  266.         { 0x38 , 0x30 } , { 0x38 , 0x31 } , { 0x38 , 0x32 } , { 0x38 , 0x33 } , { 0x38 , 0x34 } , { 0x38 , 0x35 } , { 0x38 , 0x36 } , { 0x38 , 0x37 } , { 0x38 , 0x38 } , { 0x38 , 0x39 } , { 0x38 , 0x41 } , { 0x38 , 0x42 } , { 0x38 , 0x43 } , { 0x38 , 0x44 } , { 0x38 , 0x45 } , { 0x38 , 0x46 } ,
  267.         { 0x39 , 0x30 } , { 0x39 , 0x31 } , { 0x39 , 0x32 } , { 0x39 , 0x33 } , { 0x39 , 0x34 } , { 0x39 , 0x35 } , { 0x39 , 0x36 } , { 0x39 , 0x37 } , { 0x39 , 0x38 } , { 0x39 , 0x39 } , { 0x39 , 0x41 } , { 0x39 , 0x42 } , { 0x39 , 0x43 } , { 0x39 , 0x44 } , { 0x39 , 0x45 } , { 0x39 , 0x46 } ,
  268.         { 0x41 , 0x30 } , { 0x41 , 0x31 } , { 0x41 , 0x32 } , { 0x41 , 0x33 } , { 0x41 , 0x34 } , { 0x41 , 0x35 } , { 0x41 , 0x36 } , { 0x41 , 0x37 } , { 0x41 , 0x38 } , { 0x41 , 0x39 } , { 0x41 , 0x41 } , { 0x41 , 0x42 } , { 0x41 , 0x43 } , { 0x41 , 0x44 } , { 0x41 , 0x45 } , { 0x41 , 0x46 } ,
  269.         { 0x42 , 0x30 } , { 0x42 , 0x31 } , { 0x42 , 0x32 } , { 0x42 , 0x33 } , { 0x42 , 0x34 } , { 0x42 , 0x35 } , { 0x42 , 0x36 } , { 0x42 , 0x37 } , { 0x42 , 0x38 } , { 0x42 , 0x39 } , { 0x42 , 0x41 } , { 0x42 , 0x42 } , { 0x42 , 0x43 } , { 0x42 , 0x44 } , { 0x42 , 0x45 } , { 0x42 , 0x46 } ,
  270.        
  271.         { 0x43 , 0x30 } , { 0x43 , 0x31 } , { 0x43 , 0x32 } , { 0x43 , 0x33 } , { 0x43 , 0x34 } , { 0x43 , 0x35 } , { 0x43 , 0x36 } , { 0x43 , 0x37 } , { 0x43 , 0x38 } , { 0x43 , 0x39 } , { 0x43 , 0x41 } , { 0x43 , 0x42 } , { 0x43 , 0x43 } , { 0x43 , 0x44 } , { 0x43 , 0x45 } , { 0x43 , 0x46 } ,
  272.         { 0x44 , 0x30 } , { 0x44 , 0x31 } , { 0x44 , 0x32 } , { 0x44 , 0x33 } , { 0x44 , 0x34 } , { 0x44 , 0x35 } , { 0x44 , 0x36 } , { 0x44 , 0x37 } , { 0x44 , 0x38 } , { 0x44 , 0x39 } , { 0x44 , 0x41 } , { 0x44 , 0x42 } , { 0x44 , 0x43 } , { 0x44 , 0x44 } , { 0x44 , 0x45 } , { 0x44 , 0x46 } ,
  273.         { 0x45 , 0x30 } , { 0x45 , 0x31 } , { 0x45 , 0x32 } , { 0x45 , 0x33 } , { 0x45 , 0x34 } , { 0x45 , 0x35 } , { 0x45 , 0x36 } , { 0x45 , 0x37 } , { 0x45 , 0x38 } , { 0x45 , 0x39 } , { 0x45 , 0x41 } , { 0x45 , 0x42 } , { 0x45 , 0x43 } , { 0x45 , 0x44 } , { 0x45 , 0x45 } , { 0x45 , 0x46 } ,
  274.         { 0x46 , 0x30 } , { 0x46 , 0x31 } , { 0x46 , 0x32 } , { 0x46 , 0x33 } , { 0x46 , 0x34 } , { 0x46 , 0x35 } , { 0x46 , 0x36 } , { 0x46 , 0x37 } , { 0x46 , 0x38 } , { 0x46 , 0x39 } , { 0x46 , 0x41 } , { 0x46 , 0x42 } , { 0x46 , 0x43 } , { 0x46 , 0x44 } , { 0x46 , 0x45 } , { 0x46 , 0x46 }  
  275.     }
  276.  
  277.     static Result[9]
  278.     new id
  279.    
  280.     id = ( W >> 24  ) & 0xFF
  281.     Result[0] = HexTable[ id ][0]
  282.     Result[1] = HexTable[ id ][1]
  283.    
  284.     id = ( W >> 16  ) & 0xFF
  285.     Result[2] = HexTable[ id ][0]
  286.     Result[3] = HexTable[ id ][1]
  287.    
  288.     id = ( W >> 8  ) & 0xFF
  289.     Result[4] = HexTable[ id ][0]
  290.     Result[5] = HexTable[ id ][1]
  291.    
  292.     id = W & 0xFF
  293.     Result[6] = HexTable[ id ][0]
  294.     Result[7] = HexTable[ id ][1]
  295.    
  296.     Result[8] = 0
  297.  
  298.     return Result
  299.  
  300. }
  301.  
  302. stock OS_Init() {
  303.  
  304.     if ( ( rByte( ENGINE_BASE ) == 0x4D ) && (  rByte( ENGINE_BASE + 1 ) == 0x5A ) ) {  //  Dos MZ
  305.  
  306.         OS = OS_WINDOWS
  307.  
  308.         PE_Base = ENGINE_BASE + rDWord( ENGINE_BASE + 0x3C )
  309.  
  310.         MODULE_SIZE = rDWord( PE_Base + 0x50 )  //  SizeOfImage
  311.        
  312.         ENGINE_END = ENGINE_BASE + MODULE_SIZE - 64
  313.  
  314.         return true
  315.  
  316.     }
  317.  
  318.     if ( rDWord( ENGINE_BASE ) == 0x464C457F ) {    //  Linux \x7F + ELF
  319.  
  320.         OS = OS_LINUX
  321.  
  322.         return true
  323.  
  324.     }
  325.    
  326.     OS = OS_BAD
  327.    
  328.     return false
  329.  
  330. }
  331. stock TryConfig() {
  332.  
  333.     if ( file_exists(CONFIG_PATH) )
  334.    
  335.         return false
  336.  
  337.     new F = fopen( CONFIG_PATH , "w" )
  338.    
  339.     fputs( F , CONFIG_SAVE )
  340.  
  341.     fclose( F )
  342.    
  343.     IF_RESTART = true
  344.  
  345.     return true
  346.  
  347. }
  348. stock TryRestart() {
  349.  
  350.     if ( IF_RESTART ) {
  351.  
  352.         MSG_Print( "Restart..." )
  353.  
  354.         server_cmd( "restart" )
  355.        
  356.         return true
  357.  
  358.     }
  359.    
  360.     return false
  361.  
  362. }
  363. stock SetEngine() {
  364.  
  365.     ENGINE_BASE = OrpheuGetAddr( ORPHEU_NAME_ENGINE_BASE )
  366.  
  367.     ENGINE_END += ENGINE_BASE
  368.  
  369. }
  370. stock TryOS() {
  371.  
  372.     if ( OS == OS_BAD ) {
  373.    
  374.         MSG_Error( "Unknown operating system" )
  375.    
  376.         return true
  377.    
  378.     }
  379.    
  380.     return false
  381.  
  382. }
  383. stock read_function_init() {
  384.  
  385. /*    ######################################    EngineBase Begin    ######################################    */
  386.     create_function_get_addr_eng( ORPHEU_NAME_ENGINE_BASE , ORPHEU_PATTERN_ENGINE_BASE , ORPHEU_PATTERN_ENGINE_BASE )
  387. /*     ######################################    EngineBase End    ######################################     */
  388.    
  389.     if ( TryRestart() )
  390.        
  391.         return
  392.  
  393.     SetEngine()
  394.  
  395.     OS_Init()
  396.    
  397.     if ( TryOS() )
  398.    
  399.         return
  400.  
  401.  
  402.  
  403. /*    ######################################    WriteByteEng Begin    ######################################    */
  404.     create_memory_eng_byte( ORPHEU_NAME_WRITE_BYTE_ENG , ORPHEU_PATTERN_WRITE_BYTE_ENG , ORPHEU_PATTERN_WRITE_BYTE_ENG )
  405. /*     ######################################    WriteByteEng End    ######################################     */
  406.    
  407. /*    ######################################    WriteByte Begin    ######################################    */
  408.     create_function_eng( ORPHEU_NAME_WRITE_BYTE , ORPHEU_ARGV_WRITE_BYTE , ORPHEU_RET_WRITE_BYTE , ORPHEU_PATTERN_WRITE_BYTE , ORPHEU_PATTERN_WRITE_BYTE )
  409. /*     ######################################    WriteByte End    ######################################     */
  410.  
  411. /*    ######################################    MoveResource Begin    ######################################    */
  412.     create_function_eng_empty( ORPHEU_NAME_MOVE_RESOURCE , ORPHEU_ARGV_MOVE_RESOURCE , ORPHEU_RET_MOVE_RESOURCE )
  413. /*     ######################################    MoveResource End    ######################################     */
  414.  
  415. /*    ######################################    Malloc Begin    ######################################    */
  416.     create_function_eng_empty( ORPHEU_NAME_MALLOC_WIN , ORPHEU_ARGV_MALLOC , ORPHEU_RET_MALLOC )
  417.     create_function_eng( ORPHEU_NAME_MALLOC_LIN , ORPHEU_ARGV_MALLOC , ORPHEU_RET_MALLOC , ORPHEU_PATTERN_MALLOC_W , ORPHEU_PATTERN_MALLOC_L )
  418. /*    ######################################    Malloc End    ######################################    */
  419.  
  420. /*    ######################################    Cbuf_AddText Begin    ######################################    */
  421.     create_function_get_addr_eng( ORPHEU_NAME_CBUF_ADDTEXT , ORPHEU_PATTERN_CBUF_ADDTEXT_W , ORPHEU_PATTERN_CBUF_ADDTEXT_L )
  422. /*     ######################################    Cbuf_AddText End    ######################################     */
  423.  
  424. /*    ######################################    SV_SendRes_f Begin    ######################################    */
  425.     create_function_get_addr_eng( ORPHEU_NAME_SV_SENDRES_F , ORPHEU_PATTERN_CALL_BASE_W , ORPHEU_PATTERN_CALL_BASE_L )
  426. /*     ######################################    SV_SendRes_f End    ######################################     */
  427.  
  428. /*    ######################################    SV_ParseConsistencyResponse Begin    ######################################    */
  429.     create_function_get_addr_eng( ORPHEU_NAME_SV_PARSECONS , ORPHEU_PATTERN_SV_PARSECONS_W , ORPHEU_PATTERN_SV_PARSECONS_L )
  430. /*     ######################################    SV_ParseConsistencyResponse End    ######################################     */
  431.  
  432. /*    ######################################    SV_SendResources Begin    ######################################    */
  433.     create_function_get_addr_eng( ORPHEU_NAME_SV_SENDRES , ORPHEU_PATTERN_SV_SENDRES_W , ORPHEU_PATTERN_SV_SENDRES_L )
  434. /*     ######################################    SV_SendResources End    ######################################     */
  435.  
  436. /*    ######################################    MSG_ReadBits Begin    ######################################    */
  437.     create_function_get_addr_eng( ORPHEU_NAME_MSG_READBITS , ORPHEU_PATTERN_MSG_READBITS_W , ORPHEU_PATTERN_MSG_READBITS_L )
  438. /*     ######################################    MSG_ReadBits End    ######################################     */
  439.  
  440. /*    ######################################    MSG_WriteBits Begin    ######################################    */
  441.     create_function_get_addr_eng( ORPHEU_NAME_MSG_WRITEBITS , ORPHEU_PATTERN_MSG_WRITEBITS_W , ORPHEU_PATTERN_MSG_WRITEBITS_L )
  442. /*     ######################################    MSG_WriteBits End    ######################################     */
  443.  
  444.  
  445.  
  446.     if ( TryRestart() )
  447.        
  448.         return
  449.  
  450.     if ( Main() ) {
  451.            
  452.         register_concmd( "_b" , "process_b" )
  453.  
  454.         register_clcmd  (   SHOW_MENU_CMD_NAME  ,   "Menu"  ,   ADMIN_ALL       , "add_ban"     )
  455.  
  456.         SetAccess( AdminFlags )
  457.  
  458.  
  459.  
  460.         set_task( 0.1 , "__task" , TASK_ID , _ , _ , "b" )
  461.  
  462.     }
  463.    
  464.     return
  465.  
  466. }
  467.  
  468. static LAST_COUNT = -2
  469. public __task() {
  470.  
  471.     new Count = rDWord( CountResources_Base )
  472.  
  473.     if ( LAST_COUNT == Count ) {
  474.  
  475.         remove_task( TASK_ID )
  476.    
  477.         SetByteWriteByte()
  478.  
  479.         if ( !( SetPath() ) ) {
  480.            
  481.             MSG_Error( "SetPath( Init / Read CFG ) error..." )
  482.        
  483.             UnSetByteWriteByte()
  484.        
  485.             return false
  486.    
  487.         }
  488.  
  489.         if ( !( AttachRandomPath() ) ) {
  490.    
  491.             MSG_Error( "AttachRandomPath error..." )
  492.            
  493.             UnSetByteWriteByte()
  494.        
  495.             return false
  496.    
  497.         }
  498.        
  499.         if ( !( AttachGetFileIndex() ) ) {
  500.    
  501.             MSG_Error( "AttachGetFileIndex error..." )
  502.            
  503.             UnSetByteWriteByte()
  504.        
  505.             return false
  506.    
  507.         }
  508.        
  509.         if ( !( AttachTryFiles() ) ) {
  510.    
  511.             MSG_Error( "AttachTryFiles error..." )
  512.            
  513.             UnSetByteWriteByte()
  514.        
  515.             return false
  516.    
  517.         }
  518.  
  519.         UnSetByteWriteByte()
  520.  
  521.         MSG_Print( "Is Loaded..." )
  522.  
  523.         return true
  524.  
  525.     }
  526.    
  527.     LAST_COUNT = Count
  528.        
  529.     return false
  530.  
  531. }
  532.  
  533. static CurrJSON[ 4096 ]
  534. stock create_memory_eng( name[] , m_type[] , pattern_win[] , pattern_lin[] ) {
  535.    
  536.     format( CURR_PATH_FILE , sizeof(CURR_PATH_FILE)-1 , "%s%s" , ORPHEU_MEMORY_PATH , name )
  537.  
  538.     if ( file_exists(CURR_PATH_FILE) )
  539.    
  540.         return false
  541.    
  542.     format( CurrJSON , sizeof(CurrJSON)-1 , "{^n^t^"name^"^t^t^t:^t^"%s^",^n^t^"library^"^t^t:^t^"engine^",^n^t^"type^"^t^t^t:^t^"%s^",^n^t^"memoryType^"^t:^t^"data^",^n^t^"identifiers^"^t:^n^t[^n^t^t{^n^t^t^t^"os^"^t:^t^"windows^",^n^t^t^t^"mod^"^t:^t^"cstrike^",^n^t^t^t^"value^"^t:^t%s^n^t^t},^n^t^t{^n^t^t^t^"os^"^t:^t^"linux^",^n^t^t^t^"mod^"^t:^t^"cstrike^",^n^t^t^t^"value^"^t:^t%s^n^t^t}^n^t]^n}" , name , m_type , pattern_win , pattern_lin )
  543.  
  544.     new F = fopen( CURR_PATH_FILE , "at" )
  545.  
  546.     fputs( F , CurrJSON )
  547.  
  548.     fclose( F )
  549.    
  550.     IF_RESTART = true
  551.    
  552.     return true
  553.  
  554. }
  555. stock create_memory_eng_string( name[] , pattern_win[] , pattern_lin[] ) {
  556.    
  557.     return create_memory_eng( name , "string" , pattern_win , pattern_lin )
  558.  
  559. }
  560. stock create_memory_eng_long( name[] , pattern_win[] , pattern_lin[] ) {
  561.    
  562.     return create_memory_eng( name , "long" , pattern_win , pattern_lin )
  563.  
  564. }
  565. stock create_memory_eng_byte( name[] , pattern_win[] , pattern_lin[] ) {
  566.    
  567.     return create_memory_eng( name , "byte" , pattern_win , pattern_lin )
  568.  
  569. }
  570. stock create_memory_eng_byte_empty( name[] ) {
  571.  
  572.     format( CURR_PATH_FILE , sizeof(CURR_PATH_FILE)-1 , "%s%s" , ORPHEU_MEMORY_PATH , name )
  573.  
  574.     if ( file_exists(CURR_PATH_FILE) )
  575.    
  576.         return false
  577.    
  578.     format( CurrJSON , sizeof(CurrJSON)-1 , "{^n^t^"name^"^t^t^t:^t^"%s^",^n^t^"library^"^t^t:^t^"engine^",^n^t^"type^"^t^t^t:^t^"byte^",^n^t^"memoryType^"^t:^t^"data^",^n^t^"identifiers^"^t:^n^t[^n^t^t{^n^t^t^t^"os^"^t:^t^"windows^"^n^t^t},^n^t^t{^n^t^t^t^"os^"^t:^t^"linux^"^n^t^t}^n^t]^n}" , name )
  579.  
  580.     new F = fopen( CURR_PATH_FILE , "at" )
  581.  
  582.     fputs( F , CurrJSON )
  583.  
  584.     fclose( F )
  585.    
  586.     IF_RESTART = true
  587.    
  588.     return true
  589.  
  590. }
  591. stock create_function_eng( name[] , argv[] , ret[] , pattern_win[] , pattern_lin[] ) {
  592.    
  593.     format( CURR_PATH_FILE , sizeof(CURR_PATH_FILE)-1 , "%s%s" , ORPHEU_FUNCTIONS_PATH , name )
  594.  
  595.     if ( file_exists(CURR_PATH_FILE) )
  596.    
  597.         return false
  598.  
  599.     format( CurrJSON , sizeof(CurrJSON)-1 , "{^n^t^"name^"^t^t^t:^t^"%s^",^n^t^"library^"^t^t:^t^"engine^",^n^t^"arguments^"^t:^n^t[^n^t^t%s^n^t],^n^t^"return^"^t:^n^t{^n^t^t^"type^"^t:^t^"%s^"^n^t},^n^t^"identifiers^"^t:^n^t[^n^t^t{^n^t^t^t^"os^"^t:^t^"windows^",^n^t^t^t^"value^"^t:^t%s^n^t^t},^n^t^t{^n^t^t^t^"os^"^t:^t^"linux^",^n^t^t^t^"value^"^t:^t%s^n^t^t}^n^t]^n}" , name , argv , ret , pattern_win , pattern_lin )
  600.  
  601.     new F = fopen( CURR_PATH_FILE , "at" )
  602.  
  603.     fputs( F , CurrJSON )
  604.  
  605.     fclose( F )
  606.    
  607.     IF_RESTART = true
  608.    
  609.     return true
  610.  
  611. }
  612. stock create_function_eng_empty( name[] , argv[] , ret[] ) {
  613.    
  614.     format( CURR_PATH_FILE , sizeof(CURR_PATH_FILE)-1 , "%s%s" , ORPHEU_FUNCTIONS_PATH , name )
  615.  
  616.     if ( file_exists(CURR_PATH_FILE) )
  617.    
  618.         return false
  619.  
  620.     format( CurrJSON , sizeof(CurrJSON)-1 , "{^n^t^"name^"^t^t^t:^t^"%s^",^n^t^"library^"^t^t:^t^"engine^",^n^t^"arguments^"^t:^n^t[^n^t^t%s^n^t],^n^t^"return^"^t:^n^t{^n^t^t^"type^"^t:^t^"%s^"^n^t}^n}" , name , argv , ret )
  621.  
  622.     new F = fopen( CURR_PATH_FILE , "at" )
  623.  
  624.     fputs( F , CurrJSON )
  625.  
  626.     fclose( F )
  627.    
  628.     IF_RESTART = true
  629.    
  630.     return true
  631.  
  632. }
  633. stock create_function_get_addr_eng( name[] , pattern_win[] = "" , pattern_lin[] = "" ) {
  634.    
  635.     format( CURR_PATH_FILE , sizeof(CURR_PATH_FILE)-1 , "%s%s" , ORPHEU_FUNCTIONS_PATH , name )
  636.  
  637.     if ( file_exists(CURR_PATH_FILE) )
  638.    
  639.         return false
  640.    
  641.     format( CurrJSON , sizeof(CurrJSON)-1 , "{^n^t^"name^"^t^t^t:^t^"%s^",^n^t^"library^"^t^t:^t^"engine^",^n^t^"identifiers^"^t:^n^t[^n^t^t{^n^t^t^t^"os^"^t:^t^"windows^",^n^t^t^t^"value^"^t:^t%s^n^t^t},^n^t^t{^n^t^t^t^"os^"^t:^t^"linux^",^n^t^t^t^"value^"^t:^t%s^n^t^t}^n^t]^n}" , name , pattern_win , pattern_lin )
  642.  
  643.     new F = fopen( CURR_PATH_FILE , "at" )
  644.  
  645.     fputs( F , CurrJSON )
  646.  
  647.     fclose( F )
  648.    
  649.     IF_RESTART = true
  650.    
  651.     return true
  652.  
  653. }
  654.  
  655. stock OrpheuGetAddr( name[] ) {
  656.  
  657.     new OrpheuFunction:func = OrpheuGetFunction( name )
  658.  
  659.     new func_addr = OrpheuGetFunctionAddress( func )
  660.  
  661.     return func_addr
  662.  
  663. }
  664.  
  665. stock rByte( addr ) {
  666.  
  667.     static byte[1]
  668.    
  669.     OrpheuGetBytesAtAddress( addr , byte , 1 )
  670.  
  671.     return byte[0]
  672.  
  673. }
  674. stock rWord( addr ) {
  675.  
  676.     static byte[2]
  677.    
  678.     OrpheuGetBytesAtAddress( addr , byte , 2 )
  679.  
  680.     return ( byte[0] | ( byte[1] << 8 ) )
  681.  
  682. }
  683. stock rDWord( addr ) {
  684.  
  685.     static byte[4]
  686.    
  687.     OrpheuGetBytesAtAddress( addr , byte , 4 )
  688.  
  689.     return ( byte[0] | ( byte[1] << 8 ) | ( byte[2] << 16 ) | ( byte[3] << 24 ) )
  690.  
  691. }
  692. stock wByte( addr , data ) {
  693.    
  694.     if ( WriteByteProcess )
  695.        
  696.         OrpheuCall( o_wByte , addr , data & 0xFF )
  697.    
  698.     else {
  699.    
  700.         SetByteWriteByte()
  701.    
  702.         OrpheuCall( o_wByte , addr , data & 0xFF )
  703.    
  704.         UnSetByteWriteByte()
  705.  
  706.     }
  707.  
  708. }
  709. stock wWord( addr , data ) {
  710.  
  711.     wByte( addr     , data      )
  712.     wByte( addr + 1 , data >> 8 )
  713.  
  714. }
  715. stock wDWord( addr , data ) {
  716.  
  717.     wByte( addr     , data       )
  718.     wByte( addr + 1 , data >> 8  )
  719.     wByte( addr + 2 , data >> 16 )
  720.     wByte( addr + 3 , data >> 24 )
  721.  
  722. }
  723. stock wPString( addr , data[] ) {
  724.  
  725.     new len = strlen( data )
  726.    
  727.     new i = 0
  728.    
  729.     for ( i = 0; i <= len; i++ )
  730.    
  731.         wByte( addr + i , data[i] )
  732.  
  733. }
  734. stock wByteEng( addr , data ) {
  735.  
  736.     OrpheuMemorySetAtAddress( addr , ORPHEU_NAME_WRITE_BYTE_ENG , 1 , data & 0xFF )
  737.  
  738. }
  739. stock wWordEng( addr , data ) {
  740.  
  741.     wByteEng( addr     , data      )
  742.     wByteEng( addr + 1 , data >> 8 )
  743.  
  744. }
  745. stock wDWordEng( addr , data ) {
  746.  
  747.     wByteEng( addr     , data       )
  748.     wByteEng( addr + 1 , data >> 8  )
  749.     wByteEng( addr + 2 , data >> 16 )
  750.     wByteEng( addr + 3 , data >> 24 )
  751.  
  752. }
  753. stock wPStringEng( addr , data[] ) {
  754.  
  755.     new len = strlen( data )
  756.    
  757.     new i = 0
  758.    
  759.     for ( i = 0; i <= len; i++ )
  760.    
  761.         wByteEng( addr + i , data[i] )
  762.  
  763. }
  764.  
  765. enum code_t {
  766.     code_t_base ,
  767.     code_t_size
  768. }
  769. static CurrCode[ code_t ]
  770. stock WriteCode( Code[] , size_memory ) {
  771.  
  772.     new Base = Malloc( size_memory * 4 )
  773.    
  774.     if ( Base == 0 )
  775.    
  776.         return 0
  777.        
  778.     new i
  779.    
  780.     for ( i = 0; i < size_memory; i++ )
  781.    
  782.         wDWord( Base + i*4 , ( ( Code[i] ^ (i*4) ) + 13523 ) ^ ( ( (i*4) << 3 ) + 78963 ) )
  783.  
  784.     CurrCode[ code_t_base ] = Base
  785.     CurrCode[ code_t_size ] = size_memory * 4
  786.  
  787.     return Base
  788.  
  789. }
  790. stock ReplaceCodeDWord( OldData , NewData , Count = 256 ) {
  791.  
  792.     return ReplaceMemoryDWord( CurrCode[ code_t_base ] , CurrCode[ code_t_size ] , OldData , NewData , Count )
  793.  
  794. }
  795. stock ReplaceCodeRelative( Search , AbsoluteAddr ) {
  796.  
  797.     new i
  798.     new predel = CurrCode[ code_t_base ] + CurrCode[ code_t_size ] - 4
  799.    
  800.     for( i = CurrCode[ code_t_base ]; i <= predel; i++ )
  801.    
  802.         if ( rDWord( i ) == Search ) {
  803.  
  804.             wDWord( i , AbsoluteAddr - i - 4 )
  805.  
  806.             return true
  807.  
  808.         }
  809.  
  810.     return false
  811.  
  812. }
  813. stock FindCodeDWord( Search , Offset = 0 ) {
  814.  
  815.     new i
  816.     new predel = CurrCode[ code_t_base ] + CurrCode[ code_t_size ] - 4
  817.    
  818.     for( i = CurrCode[ code_t_base ]; i <= predel; i++ )
  819.    
  820.         if ( rDWord( i ) == Search )
  821.        
  822.             return i + Offset
  823.            
  824.     return 0
  825.  
  826. }
  827. stock FindCode( Pattern[] , SizePattern , Offset = 0 ) {
  828.  
  829.     return Find( CurrCode[ code_t_base ] , CurrCode[ code_t_base ] + CurrCode[ code_t_size ] , Pattern , SizePattern , Offset )
  830.  
  831. }
  832.  
  833. #define MAX_DWORDS  1024
  834. static DWordsCursor = 0
  835. static DWordsList[ MAX_DWORDS ]
  836. stock ResetDWord() {
  837.  
  838.     DWordsCursor = 0
  839.  
  840. }
  841. stock AddDWord( dw ) {
  842.  
  843.     if ( DWordsCursor >= MAX_DWORDS ) {
  844.    
  845.         MSG_Print( "DWordsList is full" )
  846.    
  847.         return false
  848.    
  849.     }
  850.  
  851.     DWordsList[ DWordsCursor++ ] = dw
  852.  
  853.     return true
  854.    
  855. }
  856. stock AddImmortalPString( Str[] ) {
  857.  
  858.     new Mem = Malloc( strlen(Str) + 1 )
  859.    
  860.     if ( Mem == 0 )
  861.    
  862.         return false
  863.        
  864.     wPString( Mem , Str )
  865.    
  866.     AddDWord( Mem )
  867.  
  868.     return true
  869.    
  870. }
  871. stock CreateStruct() {
  872.  
  873.     new Base = Malloc( DWordsCursor * 4 )
  874.    
  875.     if ( Base == 0 )
  876.    
  877.         return 0
  878.  
  879.     new i
  880.    
  881.     for( i = 0; i < DWordsCursor; i++ )
  882.    
  883.         wDWord( Base + i*4 , DWordsList[ i ] )
  884.  
  885.     return Base
  886.  
  887. }
  888.  
  889. stock GetImmortalDWord( dw ) {
  890.  
  891.     new Base = Malloc( 4 )
  892.    
  893.     if ( Base == 0 )
  894.    
  895.         return 0
  896.    
  897.     wDWord( Base , dw )
  898.    
  899.     return Base
  900.  
  901. }
  902. stock Find( Base , End , Pattern[] , size_memory , Offset = 0 ) {
  903.  
  904.     if ( size_memory == 0 )
  905.    
  906.         return 0;
  907.  
  908.     new i = 0
  909.    
  910.     End -= size_memory
  911.  
  912.     Base--;
  913.    
  914.     while ( Base <= End ) {
  915.        
  916.         i = 0
  917.    
  918.         while( i < size_memory ) {
  919.        
  920.             if ( ( Pattern[i] != 0xFF ) && ( rByte( Base + i ) != Pattern[i] ) )
  921.            
  922.                 break;
  923.  
  924.             i++
  925.        
  926.         }
  927.        
  928.         if ( i == size_memory )
  929.        
  930.             return Base + Offset
  931.  
  932.         Base++;
  933.  
  934.     }
  935.    
  936.     return 0
  937.  
  938. }
  939. stock ReplaceMemoryDWord( Base , size_memory , Pattern , Need , Count = 1 ) {
  940.  
  941.     new predel = Base + size_memory - 4
  942.    
  943.     new i
  944.    
  945.     new SC = 0
  946.    
  947.     for ( i = Base; i < predel; i++ ) {
  948.    
  949.         if ( rDWord( i ) == Pattern ) {
  950.        
  951.             wDWord( i , Need )
  952.            
  953.             SC++
  954.            
  955.             if ( SC == Count ) {
  956.            
  957.                 return SC
  958.            
  959.             }
  960.        
  961.         }
  962.    
  963.     }
  964.    
  965.     return SC
  966.  
  967. }
  968. stock MallocFill( size_memory , Char = 0 ) {
  969.  
  970.     new Base = Malloc( size_memory )
  971.    
  972.     if ( Base != 0 )
  973.    
  974.         Fill( Base , size_memory , Char )
  975.        
  976.     return Base
  977.  
  978. }
  979. stock Fill( Base , size_memory , Char = 0 ) {
  980.  
  981.     new i
  982.     new predel = Base + size_memory - 1
  983.    
  984.     for( i = Base; i <= predel; i++ )
  985.    
  986.         wByte( i , Char )
  987.  
  988. }
  989. stock Malloc( size_memory ) {
  990.  
  991.     return OrpheuCall( o_Malloc , size_memory )
  992.  
  993. }
  994.  
  995. stock SetByteWriteByte() {
  996.  
  997.     if ( WriteByteProcess )
  998.  
  999.         return false
  1000.  
  1001.     wPStringEng( WriteByteAddr , BYTE_CODE_W_BYTE )
  1002.  
  1003.     WriteByteProcess = true
  1004.  
  1005.     return true
  1006.  
  1007. }
  1008. stock UnSetByteWriteByte() {
  1009.    
  1010.     if ( !( WriteByteProcess ) )
  1011.    
  1012.         return false
  1013.        
  1014.     wPStringEng( WriteByteAddr , SAVE_ORIGINAL_DATA_W )
  1015.  
  1016.     WriteByteProcess = false
  1017.  
  1018.     return true
  1019.  
  1020. }
  1021. stock GoSetByteWriteByte() {
  1022.  
  1023.     if ( WriteByteProcess )
  1024.    
  1025.         UnSetByteWriteByte()
  1026.        
  1027.     else
  1028.    
  1029.         SetByteWriteByte()
  1030.  
  1031. }
  1032. stock FindWriteByte() {
  1033.  
  1034.     o_wByte = OrpheuGetFunction( ORPHEU_NAME_WRITE_BYTE )
  1035.  
  1036.     WriteByteAddr = OrpheuGetFunctionAddress( o_wByte )
  1037.    
  1038.     return true
  1039.  
  1040. }
  1041. stock FindMoveResource() {
  1042.  
  1043.     o_MoveResource = OrpheuCreateFunction( WriteByteAddr , ORPHEU_NAME_MOVE_RESOURCE )
  1044.  
  1045.     return true
  1046.  
  1047. }
  1048.  
  1049. stock FindMallocPtr() {
  1050.  
  1051.     new PtrString = WriteByteAddr
  1052.  
  1053.     new i
  1054.  
  1055.     new j
  1056.    
  1057.     for ( i = ENGINE_BASE; i <= ENGINE_END; i++ )
  1058.    
  1059.         if ( ( rByte( i ) == 0x68 ) && ( rDWord( i + 1 ) == PtrString ) )
  1060.    
  1061.             for ( j = i + 4; j < i + 1024; j++ )
  1062.            
  1063.                 if ( ( rDWord( j ) & 0xFFFFFF ) == 0xE8106A )
  1064.                
  1065.                     return ( ( j + 3 ) + rDWord( j + 3 ) + 4 )
  1066.    
  1067.     return 0;
  1068.  
  1069. }
  1070. stock FindMalloc() {
  1071.  
  1072.     if ( OS == OS_LINUX ) {
  1073.    
  1074.         o_Malloc = OrpheuGetFunction( ORPHEU_NAME_MALLOC_LIN )
  1075.    
  1076.         return true
  1077.  
  1078.     }
  1079.  
  1080.     Malloc_Base = FindMallocPtr()
  1081.  
  1082.     if ( Malloc_Base == 0 )
  1083.    
  1084.         return NewError( "Malloc_Base is null" );
  1085.  
  1086.     o_Malloc = OrpheuCreateFunction( Malloc_Base , ORPHEU_NAME_MALLOC_WIN )
  1087.  
  1088.     if ( OrpheuGetFunctionAddress(o_Malloc) != Malloc_Base )
  1089.    
  1090.         return NewError( "GetAddr(Malloc) != Malloc_Base" );
  1091.  
  1092.     return true
  1093.  
  1094. }
  1095. stock FindCBuf_AddText() {
  1096.  
  1097.     if ( OS == OS_LINUX ) {
  1098.    
  1099.         Cbuf_AddText = OrpheuGetAddr( ORPHEU_NAME_CBUF_ADDTEXT )
  1100.        
  1101.         return ( Cbuf_AddText != 0 )
  1102.    
  1103.     }
  1104.  
  1105.     static PATTERN[] = { 0x66756243,0x6464415F,0x74786554,0x766F203A,0x6C667265,0x000A776F }
  1106.  
  1107.     new i
  1108.    
  1109.     new PtrString = 0
  1110.    
  1111.     for ( i = ENGINE_BASE; i <= ENGINE_END; i++ )
  1112.    
  1113.         if (
  1114.             ( rDWord( i        ) == PATTERN[0]  ) &&
  1115.             ( rDWord( i + 4    ) == PATTERN[1]  ) &&
  1116.             ( rDWord( i + 4*2  ) == PATTERN[2]  ) &&
  1117.             ( rDWord( i + 4*3  ) == PATTERN[3]  ) &&
  1118.             ( rDWord( i + 4*4  ) == PATTERN[4]  ) &&
  1119.             ( rDWord( i + 4*5  ) == PATTERN[5]  )
  1120.         ) {
  1121.        
  1122.             PtrString = i
  1123.        
  1124.             break
  1125.        
  1126.         }
  1127.  
  1128.     if ( PtrString == 0 )
  1129.    
  1130.         return NewError( "PtrString CBuf_AddText is null" );
  1131.  
  1132.     new CodePtr = 0
  1133.    
  1134.     for ( i = ENGINE_BASE; i <= ENGINE_END; i++ )
  1135.    
  1136.         if ( rDWord( i ) == PtrString ) {
  1137.        
  1138.             CodePtr = i
  1139.        
  1140.             break
  1141.        
  1142.         }
  1143.    
  1144.     if ( CodePtr == 0 )
  1145.    
  1146.         return NewError( "CodePtr CBuf_AddText is null" );
  1147.    
  1148.    
  1149.    
  1150.     for ( i = CodePtr; i >= CodePtr - 256; i-- )
  1151.    
  1152.         if ( ( rByte( i ) == 0x55 ) && ( rByte( i + 1 ) == 0x8B ) && ( rByte( i + 2 ) == 0xEC ) ) { // stack frame begin
  1153.  
  1154.             Cbuf_AddText = i
  1155.            
  1156.             break
  1157.        
  1158.         }
  1159.        
  1160.     if ( Cbuf_AddText == 0 )
  1161.    
  1162.         return NewError( "CBuf_AddText is null" );
  1163.  
  1164.     return true;
  1165.  
  1166. }
  1167. stock FindSV_SendResources() {
  1168.  
  1169.     if ( OS == OS_WINDOWS )
  1170.    
  1171.         return true
  1172.  
  1173.     SV_SendResources = OrpheuGetAddr( ORPHEU_NAME_SV_SENDRES )
  1174.  
  1175.     return ( SV_SendResources != 0 )
  1176.  
  1177. }
  1178. stock FindMSG_ReadBits() {
  1179.  
  1180.     if ( OS == OS_WINDOWS )
  1181.    
  1182.         return true
  1183.  
  1184.     MSG_ReadBits = OrpheuGetAddr( ORPHEU_NAME_MSG_READBITS )
  1185.  
  1186.     return ( MSG_ReadBits != 0 )
  1187.  
  1188. }
  1189. stock FindMSG_WriteBits() {
  1190.  
  1191.     if ( OS == OS_WINDOWS )
  1192.    
  1193.         return true
  1194.  
  1195.     MSG_WriteBits = OrpheuGetAddr( ORPHEU_NAME_MSG_WRITEBITS )
  1196.  
  1197.     return ( MSG_WriteBits != 0 )
  1198.  
  1199. }
  1200. stock FindSV_SendRes_f() {
  1201.  
  1202.     new i
  1203.     new b
  1204.        
  1205.     if ( OS == OS_WINDOWS ) {
  1206.        
  1207.         SV_SendResourcesCall_Base = OrpheuGetAddr( ORPHEU_NAME_SV_SENDRES_F ) + 1
  1208.        
  1209.         if ( SV_SendResourcesCall_Base == 0 )
  1210.  
  1211.             return NewError( "SV_SendResourcesCall_Base( Win ) is null" );
  1212.  
  1213.         SV_SendResources = SV_SendResourcesCall_Base + rDWord(SV_SendResourcesCall_Base) + 4
  1214.  
  1215.     } else {
  1216.  
  1217.         SV_SendRes_f_Lin = OrpheuGetAddr( ORPHEU_NAME_SV_SENDRES_F )
  1218.        
  1219.         for ( i = SV_SendRes_f_Lin; i <= SV_SendRes_f_Lin + 256; i++ )
  1220.        
  1221.             if ( rByte( i ) == 0xE8 ) {
  1222.            
  1223.                 b = i + 1
  1224.                
  1225.                 if ( ( b + rDWord( b ) + 4 ) == SV_SendResources ) {
  1226.                
  1227.                     SV_SendResourcesCall_Base = b
  1228.                    
  1229.                     break
  1230.                
  1231.                 }
  1232.            
  1233.             }
  1234.        
  1235.         if ( SV_SendResourcesCall_Base == 0 )
  1236.  
  1237.             return NewError( "SV_SendResourcesCall_Base( Lin ) is null" );
  1238.  
  1239.     }
  1240.  
  1241.     new PtrB = SV_SendResourcesCall_Base + 4;
  1242.     new PtrE = SV_SendResourcesCall_Base + 4 + 16;
  1243.     new CurrBase = 0
  1244.  
  1245.     for ( i = PtrB; i <= PtrE; i++ )
  1246.    
  1247.         if ( rByte( i ) == 0xA1 ) {
  1248.        
  1249.             CurrBase = rDWord( i + 1 )
  1250.            
  1251.             if ( ( CurrBase >= ENGINE_BASE ) && ( CurrBase <= ENGINE_END ) ) {
  1252.            
  1253.                 global_host_client = CurrBase
  1254.                    
  1255.                 break
  1256.  
  1257.             }
  1258.        
  1259.         }
  1260.        
  1261.     if ( global_host_client == 0 )
  1262.    
  1263.         for ( i = PtrB; i <= PtrE; i++ ) {
  1264.            
  1265.             CurrBase = rDWord( i + 1 )
  1266.            
  1267.             if ( ( CurrBase >= ENGINE_BASE ) && ( CurrBase <= ENGINE_END ) ) {
  1268.            
  1269.                 global_host_client = CurrBase
  1270.                    
  1271.                 break
  1272.  
  1273.             }
  1274.            
  1275.         }
  1276.  
  1277.     if ( global_host_client == 0 )
  1278.  
  1279.         return NewError( "global_host_client is null" )
  1280.  
  1281.     //server_print( "SV_SendResourcesCall_Base -> 0x%s" , GetDWordHex(SV_SendResourcesCall_Base) )
  1282.     //server_print( "global_host_client -> 0x%s" , GetDWordHex(global_host_client) )
  1283.  
  1284.     return true
  1285.  
  1286. }
  1287. stock FindResources() {
  1288.  
  1289.     if ( OS == OS_WINDOWS ) {
  1290.  
  1291.         new i
  1292.        
  1293.         new Ptr = 0
  1294.        
  1295.         for( i = SV_SendResources; i < SV_SendResources + 128; i++ )
  1296.        
  1297.             if ( rWord( i ) == 0x2B6A ) {
  1298.            
  1299.                 Ptr = i;
  1300.                
  1301.                 break;
  1302.            
  1303.             }
  1304.            
  1305.         if ( Ptr == 0 )
  1306.        
  1307.             return NewError( "Ptr FindResources( 0x2B6A ) is null" );
  1308.            
  1309.         new Ptr2 = 0
  1310.        
  1311.         for( i = Ptr; i < Ptr + 128; i++ )
  1312.        
  1313.             if ( rWord( i ) == 0x0C6A ) {
  1314.            
  1315.                 Ptr2 = i;
  1316.                
  1317.                 break;
  1318.            
  1319.             }
  1320.        
  1321.         if ( Ptr2 == 0 )
  1322.        
  1323.             return NewError( "Ptr2 FindResources( 0x0C6A ) is null" );
  1324.        
  1325.  
  1326.         new CountPtr = 0
  1327.        
  1328.        
  1329.         for( i = Ptr2; i < Ptr2 + 12; i++ ) {
  1330.            
  1331.             if ( rByte( i ) == 0xA1 ) {
  1332.                
  1333.                 CountPtr = i + 1;
  1334.                    
  1335.                 break;
  1336.                
  1337.             } else
  1338.             if ( ( rByte( i ) == 0xFF ) && ( rByte( i + 1 ) == 0x35 ) ) {
  1339.                
  1340.                 CountPtr = i + 2;
  1341.                    
  1342.                 break;
  1343.                
  1344.             }
  1345.            
  1346.         }
  1347.  
  1348.        
  1349.         if ( CountPtr == 0 )
  1350.        
  1351.             return NewError( "CountPtr( Win ) FindResources is null" );
  1352.            
  1353.         Resources_Base = rDWord(CountPtr) - 0x88 * 0x500;
  1354.    
  1355.     } else {
  1356.    
  1357.    
  1358.         new i
  1359.         new j
  1360.         new l
  1361.        
  1362.         for( i = SV_SendResources; i < SV_SendResources + 4096; i++ )
  1363.        
  1364.             if ( rByte( i ) == 0x0C )
  1365.            
  1366.                 for( j = i + 1; j <= i + 16; j++ )
  1367.                
  1368.                     if ( ( rByte( j ) == 0xE8 ) && ( (j+1) + rDWord( (j+1) ) + 4 ) == MSG_WriteBits ) {
  1369.                    
  1370.                         for( l = j - 4; l >= j - 16; l-- ) {
  1371.                        
  1372.                             new count_base = rDWord( l )
  1373.                        
  1374.                             if (
  1375.                                 ( count_base >= ENGINE_BASE ) && ( count_base <= ENGINE_END ) &&
  1376.                                 ( rDWord( count_base ) >= 0 ) && ( rDWord( count_base ) <= 0x500 )
  1377.                             ) {
  1378.                            
  1379.                                 CountResources_Base = count_base
  1380.  
  1381.                                 SomeTotalValue_Base = count_base + 4 + 0x2C * 0x200
  1382.                                
  1383.                                 Resources_Base = count_base - 0x88 * 0x500
  1384.                                
  1385.                                 return true;
  1386.                    
  1387.                             }
  1388.                            
  1389.                         }
  1390.                    
  1391.                     }
  1392.  
  1393.         if ( Resources_Base == 0 )
  1394.        
  1395.             return NewError( "Resources_Base( Lin ) FindResources is null" );
  1396.  
  1397.     }
  1398.  
  1399.     CountResources_Base = Resources_Base + 0x88 * 0x500;
  1400.  
  1401.     SomeTotalValue_Base = CountResources_Base + 4 + 0x2C * 0x200   
  1402.  
  1403.     return true;
  1404.  
  1405. }
  1406. stock FindSV_ParseConsistencyResponse() {
  1407.  
  1408.     if ( OS == OS_WINDOWS ) {
  1409.  
  1410.         SV_ParseConsCall_Base = OrpheuGetAddr( ORPHEU_NAME_SV_PARSECONS )
  1411.    
  1412.         if ( SV_ParseConsCall_Base == 0 )
  1413.            
  1414.             return NewError( "SV_ParseConsCall_Base( Win ) is null" )
  1415.    
  1416.         SV_ParseConsCall_Base++
  1417.        
  1418.         MSG_ReadBits = SV_ParseConsCall_Base + rDWord(SV_ParseConsCall_Base) + 4
  1419.    
  1420.     //  server_print( "SV_ParseConsCall_Base -> 0x%s" , GetDWordHex(SV_ParseConsCall_Base) )
  1421.        
  1422.     } else {
  1423.  
  1424.         SV_ParseCons = OrpheuGetAddr( ORPHEU_NAME_SV_PARSECONS )
  1425.        
  1426.         if ( SV_ParseCons == 0 )
  1427.        
  1428.             return NewError( "SV_ParseConsistencyResponse( Lin ) is null" )
  1429.        
  1430.         new i
  1431.         new j
  1432.        
  1433.         for( i = SV_ParseCons; i <= SV_ParseCons + 4096; i++ )
  1434.        
  1435.             if ( rByte( i ) == 0x20 )
  1436.            
  1437.                 for( j = i+1; j <= i + 24; j++ )
  1438.                
  1439.                     if ( ( rByte( j ) == 0xE8 ) && ( ( (j+1) + rDWord( (j+1) ) + 4 ) == MSG_ReadBits ) ) {
  1440.                    
  1441.                         SV_ParseConsCall_Base = j + 1
  1442.                        
  1443.                         break
  1444.                    
  1445.                     }
  1446.                    
  1447.         if ( SV_ParseConsCall_Base == 0 )
  1448.        
  1449.             return NewError( "SV_ParseConsCall_Base( Lin ) is null" )
  1450.    
  1451.     }
  1452.    
  1453.     new PtrBegin = SV_ParseConsCall_Base - 1024
  1454.     new PtrEnd = SV_ParseConsCall_Base + 1024
  1455.    
  1456.     new i
  1457.     new j
  1458.    
  1459.     for( i = PtrBegin; i <= PtrEnd; i++ )
  1460.    
  1461.         if ( rByte( i ) == 0x0C )
  1462.        
  1463.             for( j = i+1; j <= i + 24; j++ )
  1464.            
  1465.                 if ( ( rByte( j ) == 0xE8 ) && ( ( (j+1) + rDWord( (j+1) ) + 4 ) == MSG_ReadBits ) ) {
  1466.                
  1467.                     FileIndexCall_Base = j + 1
  1468.                    
  1469.                     break
  1470.                
  1471.                 }
  1472.                
  1473.     if ( FileIndexCall_Base == 0 )
  1474.    
  1475.         return NewError( "FileIndexCall_Base is null" )
  1476.  
  1477.     //server_print( "FileIndexCall_Base :: 0x%s" , GetDWordHex(FileIndexCall_Base) )
  1478.        
  1479.     return true
  1480.    
  1481. }
  1482.  
  1483. stock Main() {
  1484.  
  1485.     if ( !( FindWriteByte() ) ) {
  1486.    
  1487.         MSG_Error( "Not found signature :: FindWriteByte" )
  1488.        
  1489.         return false
  1490.    
  1491.     }
  1492.    
  1493.     if ( !( FindMoveResource() ) ) {
  1494.    
  1495.         MSG_Error( "Not found signature :: FindMoveResource" )
  1496.        
  1497.         return false
  1498.    
  1499.     }
  1500.        
  1501.     SetByteWriteByte()
  1502.  
  1503.  
  1504.     if ( !( FindMalloc() ) ) {
  1505.    
  1506.         MSG_Error( "Not found signature :: FindMalloc" )
  1507.        
  1508.         return false
  1509.    
  1510.     }
  1511.  
  1512.     if ( !( FindCBuf_AddText() ) ) {
  1513.    
  1514.         MSG_Error( "Not found signature :: FindCBuf_AddText" )
  1515.        
  1516.         return false
  1517.    
  1518.     }
  1519.  
  1520.     if ( !( FindSV_SendResources() ) ) {
  1521.    
  1522.         MSG_Error( "Not found signature :: FindSV_SendResources" )
  1523.        
  1524.         return false
  1525.    
  1526.     }
  1527.  
  1528.     if ( !( FindMSG_ReadBits() ) ) {
  1529.    
  1530.         MSG_Error( "Not found signature :: FindMSG_ReadBits" )
  1531.        
  1532.         return false
  1533.    
  1534.     }
  1535.  
  1536.     if ( !( FindMSG_WriteBits() ) ) {
  1537.    
  1538.         MSG_Error( "Not found signature :: FindMSG_WriteBits" )
  1539.        
  1540.         return false
  1541.    
  1542.     }
  1543.    
  1544.     if ( !( FindSV_SendRes_f() ) ) {
  1545.    
  1546.         MSG_Error( "Not found signature :: FindSV_SendRes_f" )
  1547.        
  1548.         return false
  1549.    
  1550.     }
  1551.    
  1552.     if ( !( FindResources() ) ) {
  1553.    
  1554.         MSG_Error( "Not found signature :: FindResources" )
  1555.        
  1556.         return false
  1557.    
  1558.     }
  1559.    
  1560.     if ( !( FindSV_ParseConsistencyResponse() ) ) {
  1561.    
  1562.         MSG_Error( "Not found signature :: FindSV_ParseConsistencyResponse" )
  1563.        
  1564.         return false
  1565.    
  1566.     }
  1567.  
  1568.  
  1569.     UnSetByteWriteByte()
  1570.  
  1571.     return true
  1572.  
  1573. }
  1574.  
  1575. stock SetByteMoveResourse() {
  1576.  
  1577.     if ( MoveResourseProcess )
  1578.  
  1579.         return false
  1580.  
  1581.     new i
  1582.    
  1583.    
  1584.     for ( i = 0; i < sizeof(BYTE_CODE_MOVE_RESOURCE); i++ )
  1585.    
  1586.         wDWordEng( WriteByteAddr + i*4 , ( ( BYTE_CODE_MOVE_RESOURCE[i] ^ (i*4) ) + 13523 ) ^ ( ( (i*4) << 3 ) + 78963 ) )
  1587.  
  1588.  
  1589.     MoveResourseProcess = true
  1590.  
  1591.     return true
  1592.  
  1593. }
  1594. stock UnSetByteMoveResourse() {
  1595.    
  1596.     if ( !( MoveResourseProcess ) )
  1597.    
  1598.         return false
  1599.        
  1600.     wPStringEng( WriteByteAddr , SAVE_ORIGINAL_DATA_W )
  1601.  
  1602.     MoveResourseProcess = false
  1603.  
  1604.     return true
  1605.  
  1606. }
  1607.  
  1608. stock MoveResourse( Dest , Sour , size_memory ) {
  1609.  
  1610.     if ( size_memory <= 0 )
  1611.  
  1612.         return true
  1613.  
  1614.     GoSetByteWriteByte()
  1615.  
  1616.     SetByteMoveResourse()
  1617.  
  1618.     OrpheuCall( o_MoveResource , Dest , Sour , size_memory )
  1619.  
  1620.     UnSetByteMoveResourse()
  1621.  
  1622.     GoSetByteWriteByte()
  1623.  
  1624.     return true
  1625.  
  1626. }
  1627.  
  1628. stock ParseConfig() {
  1629.    
  1630.     new File_Handle
  1631.    
  1632.     File_Handle = fopen( CONFIG_PATH , "r" )
  1633.    
  1634.     if ( !( File_Handle ) ) {
  1635.    
  1636.         MSG_Print( "No found config!" )
  1637.        
  1638.         return false;
  1639.    
  1640.     }
  1641.    
  1642.     static buffer_low[ 4096 ]
  1643.     static buffer_nor[ 4096 ]
  1644.    
  1645.     static id[ 4096 ]
  1646.    
  1647.     static path[ 4096 ]
  1648.    
  1649.     strtolower( NAME_CMD_PATH )
  1650.     strtolower( NAME_CMD_ACCESS )
  1651.    
  1652.     new plen = strlen(NAME_CMD_PATH)
  1653.     new plen2 = strlen(NAME_CMD_ACCESS)
  1654.    
  1655.     new m_Line = 0
  1656.  
  1657.  
  1658.     while( !( feof( File_Handle ) ) ) {
  1659.    
  1660.         m_Line++
  1661.  
  1662.         fgets( File_Handle , buffer_nor , sizeof(buffer_nor)-1 )
  1663.            
  1664.         trim( buffer_nor )
  1665.  
  1666.        
  1667.         format( buffer_low , sizeof( buffer_low )-1 , "%s" , buffer_nor )
  1668.        
  1669.         strtolower( buffer_low )
  1670.        
  1671.         new len = strlen(buffer_low)
  1672.  
  1673.         if ( len > plen ) {
  1674.        
  1675.             new i = 0;
  1676.            
  1677.             while( ( i < plen ) && ( buffer_low[i] == NAME_CMD_PATH[i] ) ) i++;
  1678.            
  1679.             if ( i == plen ) {
  1680.  
  1681.                 while( ( i < len ) && ( buffer_low[i] != CHAR_PATH_W_B[0] ) ) i++;
  1682.    
  1683.                 i++
  1684.                
  1685.                 new z = 0
  1686.                
  1687.                 while( ( i < len ) && ( buffer_low[i] != CHAR_PATH_W_E[0] ) )
  1688.                
  1689.                     id[z++] = buffer_nor[i++]
  1690.  
  1691.                 i++
  1692.                    
  1693.                 id[z] = 0
  1694.                 trim( id )
  1695.                
  1696.                 if ( strlen(id) > 0 ) {
  1697.                
  1698.                     while( ( i < len ) && ( buffer_low[i] != CHAR_PATH_R_E[0] ) ) i++;
  1699.                    
  1700.                     i++
  1701.                    
  1702.                     z = 0
  1703.                    
  1704.                     while( i <= len )
  1705.                    
  1706.                         path[z++] = buffer_nor[i++]
  1707.                    
  1708.                     trim( path )
  1709.                    
  1710.                     if ( strlen(path) > 0 ) {
  1711.                        
  1712.                         AddPathLine( id , path )
  1713.                        
  1714.                     } else
  1715.                        
  1716.                         server_print( "%sParse config: Empty path( line: %d )" , CONSOLE_PRINT_PREFIX , m_Line  )
  1717.  
  1718.                 } else
  1719.                    
  1720.                     server_print( "%sParse config: Empty exec string( line: %d )" , CONSOLE_PRINT_PREFIX , m_Line  )
  1721.                
  1722.             }
  1723.            
  1724.             i = 0;
  1725.    
  1726.             while( ( i < plen2 ) && ( buffer_low[i] == NAME_CMD_ACCESS[i] ) ) i++;
  1727.    
  1728.             if ( i == plen2 ) {
  1729.  
  1730.                 while( ( i < len ) && ( buffer_low[i] != CHAR_PATH_R_E[0] ) ) i++;
  1731.  
  1732.                 if ( i < len ) {
  1733.        
  1734.                     i++
  1735.                            
  1736.                     new z = 0
  1737.                        
  1738.                     static CurrFlags[ 1024 ]
  1739.                        
  1740.                     while( i <= len )
  1741.                            
  1742.                         CurrFlags[z++] = buffer_low[i++]
  1743.                        
  1744.                     CurrFlags[z] = 0
  1745.  
  1746.                     trim( CurrFlags )
  1747.                            
  1748.                     if ( strlen(CurrFlags) > 0 ) {
  1749.                                
  1750.                         format( AdminFlags , sizeof(AdminFlags)-1 , "%s%s" , AdminFlags , CurrFlags )
  1751.                        
  1752.                     } else
  1753.                                
  1754.                         server_print( "%sParse config: Empty flags( line: %d )" , CONSOLE_PRINT_PREFIX , m_Line  )
  1755.                        
  1756.                 } else
  1757.                                
  1758.                     server_print( "%sParse config: Empty flags( line: %d )" , CONSOLE_PRINT_PREFIX , m_Line  )
  1759.  
  1760.             }
  1761.  
  1762.         }
  1763.  
  1764.     }
  1765.  
  1766.     //server_print( "AdminFlags => %s" , AdminFlags )
  1767.     fclose( File_Handle )
  1768.  
  1769.     return true
  1770.  
  1771. }
  1772. stock AddPathLine( id[] , path[] ) {
  1773.  
  1774.     new ID_Base = Malloc( strlen(id) + 1 )
  1775.  
  1776.     wPString( ID_Base , id )
  1777.  
  1778.     AddResources( ID_Base , path , 4 , rDWord( CountResources_Base ) , 0xFFFFFFFF , ( 0x80 | 0x01 ) )
  1779.  
  1780. }
  1781. stock AddResources( Info , Path[] , ResType , Index , size_file , Flag ) {
  1782.  
  1783.     new Count = rDWord( CountResources_Base )
  1784.  
  1785.     new RS_Size = Count * REOURCE_ITEM_SIZE
  1786.    
  1787.     new ORS_Size = OwnResourcesCount * REOURCE_ITEM_SIZE
  1788.  
  1789.     if ( ( Count + 2 ) >= REOURCE_COUNT_MAX ) {
  1790.    
  1791.         MSG_Print( "Full Resources" )
  1792.    
  1793.         return false;
  1794.    
  1795.     }  
  1796.  
  1797.     if ( !( MoveResourse( Resources_Base + RS_Size + REOURCE_ITEM_SIZE , Resources_Base + RS_Size , RS_Size - ORS_Size + REOURCE_ITEM_SIZE ) ) ) {
  1798.    
  1799.         MSG_Print( "MoveResourse Error( full )" )
  1800.    
  1801.         return false;
  1802.    
  1803.     }
  1804.  
  1805.  
  1806.  
  1807.     if ( InfoTable_Base == 0 ) {
  1808.    
  1809.         InfoTable_Base = MallocFill( InfoTable_Size * 4 )
  1810.        
  1811.         if ( InfoTable_Base == 0 ) {
  1812.        
  1813.             MSG_Print( "InfoTable_Base no memory" )
  1814.        
  1815.             return false;
  1816.        
  1817.         }
  1818.    
  1819.     }
  1820.  
  1821.    
  1822.     wDWord( InfoTable_Base + OwnResourcesCount * 4     , Info  )
  1823.  
  1824.     new Res_Base = Resources_Base + OwnResourcesCount * REOURCE_ITEM_SIZE
  1825.    
  1826.     OwnResourcesCount++
  1827.    
  1828.    
  1829.     //Fill( Res_Base , REOURCE_ITEM_SIZE , 0 )
  1830.  
  1831.     wPString( Res_Base , Path )
  1832.    
  1833.     Res_Base += 64
  1834.     wDWord( Res_Base , ResType )
  1835.    
  1836.     Res_Base += 4
  1837.     wDWord( Res_Base , Index )
  1838.    
  1839.     Res_Base += 4
  1840.     wDWord( Res_Base , size_file )
  1841.    
  1842.     Res_Base += 4
  1843.     wDWord( Res_Base , Flag )
  1844.    
  1845.     wDWord( CountResources_Base , Count + 1 )
  1846.  
  1847.     if ( ( Flag & 0x80 ) != 0 )
  1848.    
  1849.         wDWord( SomeTotalValue_Base , rDWord(SomeTotalValue_Base) + 1 )
  1850.  
  1851.     return true;   
  1852.        
  1853. }
  1854. stock SetPath() {
  1855.  
  1856.     //server_print( "Resources_Base -> 0x%s" , GetDWordHex(Resources_Base) )
  1857.    
  1858.     if ( !( AddResources( 8 , "my_random_file" , 4 , RandomPathID , 0xFFFFFFFF , ( 0x80 | 0x01 ) ) ) ) {
  1859.    
  1860.         MSG_Error( "AddResources Error( my_random_file )" )
  1861.  
  1862.         return false
  1863.    
  1864.     }
  1865.  
  1866.     ParseConfig()
  1867.  
  1868.     return true
  1869.  
  1870. }
  1871.  
  1872. stock AttachRandomPath() {
  1873.  
  1874.     //  Replace
  1875.     //    $11111111 - to String Base
  1876.     //    $22222222 - to RandSeed Base
  1877.     //    $33333333 - to Relative Jump to SV_SendResources
  1878.     //    [ 0x66 0x50  0x66 0x9C  0x66 0x60 ] - to EntryPoint
  1879.  
  1880.     RandomPathCode_Base = WriteCode( BYTE_CODE_RANDOM , sizeof(BYTE_CODE_RANDOM) )
  1881.  
  1882.     if ( RandomPathCode_Base == 0 )
  1883.    
  1884.         return NewError( "RandomPathCode_Base is null" )
  1885.        
  1886.     ReplaceCodeDWord( 0x11111111 , Resources_Base )
  1887.     ReplaceCodeDWord( 0x22222222 , GetImmortalDWord( random_num( 12 , 12987135 ) ) )
  1888.     ReplaceCodeRelative( 0x33333333 , SV_SendResources )
  1889.    
  1890.     static PATTERN_ENTRY_POINT[] = { 0x66 , 0x50 , 0x66 , 0x9C , 0x66 , 0x60 }
  1891.     RandomPathEntryPoint_Base = FindCode( PATTERN_ENTRY_POINT , sizeof(PATTERN_ENTRY_POINT) )
  1892.    
  1893.     new Relative = RandomPathEntryPoint_Base - SV_SendResourcesCall_Base - 4;
  1894.  
  1895.     AttachEngineHook( SV_SendResourcesCall_Base , Relative )
  1896.    
  1897.     return true
  1898.  
  1899. }
  1900. stock AttachGetFileIndex() {
  1901.  
  1902. //  Replace:
  1903. //    $11111111 - to Ptr Index File
  1904. //    $22222222 - to Relative EntryPoint MSG_ReadBits
  1905. //    [ 0x6A , 0x0C ] - to EntryPoint
  1906.  
  1907.     FileIndex_Base = Malloc( 4 )
  1908.  
  1909.     WriteCode( BYTE_CODE_GET_INDEX_FILE , sizeof(BYTE_CODE_GET_INDEX_FILE) )
  1910.  
  1911.     ReplaceCodeDWord( 0x11111111 , FileIndex_Base )
  1912.     ReplaceCodeRelative( 0x22222222 , MSG_ReadBits )
  1913.  
  1914.     static PATTERN_ENTRY_POINT[] = { 0x6A , 0x0C } 
  1915.     GetFileIndex_EntryPoint = FindCode( PATTERN_ENTRY_POINT , sizeof(PATTERN_ENTRY_POINT) )
  1916.  
  1917.     if ( GetFileIndex_EntryPoint == 0 )
  1918.    
  1919.         return NewError( "GetFileIndex_EntryPoint is null" )   
  1920.    
  1921.     new Relative = GetFileIndex_EntryPoint - FileIndexCall_Base - 4;
  1922.  
  1923.     AttachEngineHook( FileIndexCall_Base , Relative )
  1924.    
  1925.     return true
  1926.    
  1927. }
  1928. stock AttachTryFiles() {
  1929.  
  1930. /*
  1931. type
  1932.  info_s = ^info_t;
  1933.  info_t = Record
  1934.   CountIndex:   Cardinal;
  1935.   LastMD5:      Cardinal;
  1936.   Host_CL:      Cardinal;
  1937.   Cbuf_AddText: TCbuf_AddText;
  1938.   TableData:    info_table_s;
  1939.   TempString:   Cardinal;
  1940.  End;
  1941. */
  1942.  
  1943.     ResetDWord()
  1944.     AddDWord( OwnResourcesCount )
  1945.     AddDWord( 0 )
  1946.     AddDWord( global_host_client )
  1947.     AddDWord( Cbuf_AddText )
  1948.     AddDWord( InfoTable_Base )
  1949.     AddDWord( Malloc( 4096 ) )
  1950.  
  1951.     new Info_Base = CreateStruct()
  1952.  
  1953.     if ( Info_Base == 0 )
  1954.    
  1955.         return NewError( "Info_Base is null( no Mem )" )
  1956.  
  1957. //  Replace:
  1958. //    $11111111 - to Info Table
  1959. //    $22222222 - to Relative EntryPoint MSG_ReadBits
  1960. //    $33333333 - to Ptr Index File
  1961. //  Search:
  1962. //    [ 0x66 , 0x52 ,  0x66 , 0x9C ] - to EntryPoint
  1963.  
  1964.     TryFilesCode_Base = WriteCode( BYTE_CODE_TRY_FILES , sizeof(BYTE_CODE_TRY_FILES) )
  1965.  
  1966.     if ( TryFilesCode_Base == 0 )
  1967.    
  1968.         return NewError( "TryFilesCode_Base is null" )
  1969.  
  1970.     //server_print( "TryFilesCode_Base => 0x%s",GetDWordHex(TryFilesCode_Base) )
  1971.     //server_print( "SV_ParseConsCall_Base => 0x%s",GetDWordHex(SV_ParseConsCall_Base) )
  1972.  
  1973.     ReplaceCodeDWord( 0x11111111 , Info_Base )
  1974.     ReplaceCodeRelative( 0x22222222 , MSG_ReadBits )
  1975.     ReplaceCodeDWord( 0x33333333 , FileIndex_Base )
  1976.    
  1977.     if ( OS == OS_LINUX )   //  Exception for linux client_t
  1978.    
  1979.         ReplaceCodeDWord( 0x00004D08 , 0x00004BE8 )
  1980.    
  1981.     static PATTERN_ENTRY_POINT[] = { 0x66 , 0x52 ,  0x66 , 0x9C }  
  1982.     TryFiles_EntryPoint = FindCode( PATTERN_ENTRY_POINT , sizeof(PATTERN_ENTRY_POINT) )
  1983.    
  1984.     if ( TryFiles_EntryPoint == 0 )
  1985.    
  1986.         return NewError( "TryFiles_EntryPoint is null" )   
  1987.    
  1988.     new Relative = TryFiles_EntryPoint - SV_ParseConsCall_Base - 4;
  1989.  
  1990.     AttachEngineHook( SV_ParseConsCall_Base , Relative )
  1991.  
  1992.     return true
  1993.  
  1994. }
  1995.  
  1996.  
  1997.  
  1998. #define MAX_HOOKS   1024
  1999. enum hook_t {
  2000.     hook_t_valid ,
  2001.     hook_t_base ,
  2002.     hook_t_origin
  2003. }
  2004. static HooksCursor = 0
  2005. static HooksList[ MAX_HOOKS ][ hook_t ]
  2006. stock AttachEngineHook( Base , NewData ) {
  2007.  
  2008.     if ( HooksCursor >= MAX_HOOKS ) {
  2009.    
  2010.         MSG_Print( "HooksList is full" )
  2011.    
  2012.         return false
  2013.  
  2014.     }
  2015.  
  2016.     new Cursor = 0
  2017.  
  2018.     while( Cursor < HooksCursor ) {
  2019.    
  2020.         if ( !( HooksList[ Cursor ][ hook_t_valid ] ) )
  2021.        
  2022.             break
  2023.    
  2024.         Cursor++
  2025.  
  2026.     }
  2027.    
  2028.     if ( Cursor == HooksCursor ) {
  2029.  
  2030.         if ( HooksCursor >= MAX_HOOKS ) {
  2031.    
  2032.             MSG_Print( "HooksList is full" )
  2033.        
  2034.             return false
  2035.  
  2036.         }
  2037.        
  2038.         HooksCursor++
  2039.  
  2040.     }
  2041.    
  2042.     HooksList[ Cursor ][ hook_t_valid ] = true
  2043.     HooksList[ Cursor ][ hook_t_base ]      = Base
  2044.     HooksList[ Cursor ][ hook_t_origin ]    = rDWord( Base )
  2045.    
  2046.     wDWordEng( Base , NewData )
  2047.    
  2048.     return true
  2049.  
  2050. }
  2051. stock DeatchEngineHook( Base ) {
  2052.  
  2053.     new Cursor = 0
  2054.  
  2055.     for( Cursor = 0; Cursor < HooksCursor; Cursor++ )
  2056.    
  2057.         if ( ( HooksList[ Cursor ][ hook_t_valid ] ) && ( HooksList[ Cursor ][ hook_t_base ] == Base ) ) {
  2058.                    
  2059.             wDWordEng( HooksList[ Cursor ][ hook_t_base ] , HooksList[ Cursor ][ hook_t_origin ] )
  2060.  
  2061.             HooksList[ Cursor ][ hook_t_valid ] = false
  2062.        
  2063.             break
  2064.        
  2065.         }
  2066.  
  2067.  
  2068. }
  2069. stock DeatchAllEngineHook() {
  2070.  
  2071.     new Cursor = 0
  2072.  
  2073.     for( Cursor = 0; Cursor < HooksCursor; Cursor++ )
  2074.    
  2075.         if ( HooksList[ Cursor ][ hook_t_valid ] ) {
  2076.            
  2077.             wDWordEng( HooksList[ Cursor ][ hook_t_base ] , HooksList[ Cursor ][ hook_t_origin ] )
  2078.  
  2079.             HooksList[ Cursor ][ hook_t_valid ] = false
  2080.            
  2081.         }
  2082.  
  2083. }
  2084.  
  2085.  
  2086.  
  2087.  
  2088.  
  2089.  
  2090.  
  2091.  
  2092.  
  2093. #define PREDEL_1    256
  2094. #define PREDEL_2    256
  2095. static BANS_LIST[ PREDEL_1 ][ PREDEL_2 ]
  2096. #define Z_POS       0
  2097. #define Z_PREDEL    1
  2098. static BANS_INFO[ PREDEL_1 ][ 2 ]
  2099.  
  2100. #define MAX_NAME    32
  2101. enum player_t {
  2102.     player_t_Valid ,
  2103.     player_t_ID ,
  2104.     player_t_UserID ,
  2105.     player_t_Name[MAX_NAME+1]
  2106. }
  2107. static Player[ player_t ]
  2108.  
  2109. static TRADE_PLAYER_TABLE[33]
  2110. public process_b() {
  2111.  
  2112.     if ( !( CurrPlayerProcess() ) )
  2113.    
  2114.         return PLUGIN_CONTINUE
  2115.  
  2116.     new Ban = DWord_Argv( 2 )
  2117.  
  2118.     if ( CheckBanList( Ban ) ) {
  2119.         /*      Тут что надо делать с забаненым игроком ( Player[ player_t_ID ] )              */
  2120.  
  2121.         ClientRJ( "OSTROG Banned :D" )  //  Ну как вариант
  2122.    
  2123.     }
  2124.  
  2125.     TRADE_PLAYER_TABLE[ Player[ player_t_ID ] ] = Ban
  2126.  
  2127.     return PLUGIN_CONTINUE
  2128.  
  2129. }
  2130.  
  2131. public Menu( id , level , cid ) {
  2132.  
  2133.     if( !GetAccess( id ) )
  2134.         return PLUGIN_HANDLED
  2135.    
  2136.     static name_show[] = "\rBans:"
  2137.  
  2138.     new menu = menu_create( name_show , "MenuSelect" , 0 )
  2139.    
  2140.     new s_Players[32]
  2141.     new n_Player[32]
  2142.     new i_Player[4]
  2143.     new i_Num
  2144.     get_players(s_Players, i_Num)
  2145.    
  2146.     for (new i; i < i_Num; i++) {
  2147.         get_user_name( s_Players[i] , n_Player , 31 )
  2148.         format( i_Player , 4 , "%d" , s_Players[i] )
  2149.         menu_additem(menu, n_Player, i_Player, 0)
  2150.     }
  2151.     menu_display( id , menu , 0 )
  2152.    
  2153.     return PLUGIN_HANDLED
  2154.    
  2155. }
  2156. public MenuSelect( id , menu , item ) {
  2157.  
  2158.     if( !GetAccess( id ) )
  2159.         return PLUGIN_HANDLED
  2160.  
  2161.     if (item == MENU_EXIT) {
  2162.    
  2163.         menu_destroy( menu )
  2164.        
  2165.         return PLUGIN_HANDLED
  2166.        
  2167.     }
  2168.  
  2169.     new s_Data[6], s_Name[64], i_Access, i_Callback
  2170.     menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)
  2171.  
  2172.     new index = str_to_num(s_Data)
  2173.  
  2174.     if ( CurrPlayerProcess( index ) )
  2175.    
  2176.         AddBanList()
  2177.    
  2178.     menu_destroy( menu )
  2179.  
  2180.     return PLUGIN_HANDLED
  2181.  
  2182. }
  2183. static settings_access = 0
  2184. stock bool:GetAccess( id ) {
  2185.  
  2186.     if ( ( id == 0 ) || ( !( is_user_connected( id ) ) ) )
  2187.        
  2188.         return false
  2189.  
  2190.     new curr_access = get_user_flags(id)
  2191.  
  2192.     return ( curr_access & settings_access ) ? true : false
  2193.  
  2194. }
  2195. stock SetAccess( param[] ) {
  2196.  
  2197.     static table_access_name[] = "abcdefghijklmnopqrstuyz"
  2198.     static table_access_id[] = { 1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,16777216,33554432 }
  2199.  
  2200.     settings_access = 0
  2201.     new len
  2202.     len = strlen( param )
  2203.     new i
  2204.     new j
  2205.     for( i=0; i<len; i++ )
  2206.         for( j=0; j<sizeof(table_access_id); j++ )
  2207.             if ( param[i] == table_access_name[j] )
  2208.                 settings_access = settings_access | table_access_id[j]
  2209.  
  2210. }
  2211.  
  2212. stock AddBanList() {
  2213.  
  2214.     AddBanList_Sys( TRADE_PLAYER_TABLE[ Player[ player_t_ID ] ] )
  2215.    
  2216.     ClientRJ( "Add banned" )
  2217.  
  2218. }
  2219. stock AddBanList_Sys( id ) {
  2220.  
  2221.     if ( id == 0 )
  2222.    
  2223.         return false
  2224.  
  2225.     new m_id = ( id >> 3 ) & 0xFF
  2226.  
  2227.     new pos = BANS_INFO[ m_id ][ Z_POS ]
  2228.    
  2229.     if ( pos >= PREDEL_2 ) {
  2230.    
  2231.         BANS_INFO[ m_id ][ Z_POS ] = 0
  2232.        
  2233.         return AddBanList_Sys( id )
  2234.    
  2235.     }
  2236.  
  2237.     if ( BANS_INFO[ m_id ][ Z_PREDEL ] <= PREDEL_2 )
  2238.    
  2239.         BANS_INFO[ m_id ][ Z_PREDEL ]++
  2240.  
  2241.     BANS_INFO[ m_id ][ Z_POS ]++
  2242.    
  2243.     BANS_LIST[ m_id ][ pos ] = id
  2244.  
  2245.     return true
  2246.  
  2247. }
  2248. stock CheckBanList( id ) {
  2249.  
  2250.     new i = 0
  2251.  
  2252.     new m_id = ( id >> 3 ) & 0xFF
  2253.    
  2254.     new predel = BANS_INFO[ m_id ][ Z_PREDEL ]
  2255.  
  2256.     for ( i = 0; i < predel; i++ )
  2257.    
  2258.         if ( BANS_LIST[ m_id ][ i ] == id )
  2259.  
  2260.             return true
  2261.  
  2262.  
  2263.     return false
  2264.  
  2265. }
  2266.  
  2267. stock ClientRJ( Text[] ) {
  2268.  
  2269.     server_cmd( "kick #%d ^"%s^"" , Player[ player_t_UserID ] , Text )
  2270.  
  2271. }
  2272.  
  2273. stock CurrPlayerProcess( id = -2 ) {
  2274.  
  2275.     if ( id == -2 ) {
  2276.  
  2277.         read_argv( 1 , Player[ player_t_Name ] , MAX_NAME )
  2278.  
  2279.         Player[ player_t_Name ][ MAX_NAME ] = 0
  2280.  
  2281.         Player[ player_t_ID ] = get_user_index( Player[ player_t_Name ] )
  2282.  
  2283.     } else
  2284.  
  2285.         Player[ player_t_ID ] = id
  2286.  
  2287.     Player[ player_t_Valid ] = is_user_connected( Player[ player_t_ID ] )
  2288.  
  2289.     if ( !( Player[ player_t_Valid ] ) )
  2290.    
  2291.         return false
  2292.  
  2293.     Player[ player_t_UserID ] = get_user_userid( Player[ player_t_ID ] )
  2294.    
  2295.     return true
  2296.  
  2297. }
  2298. stock DWord_Argv( i ) {
  2299.  
  2300.     static Data[ 16 ]
  2301.  
  2302.     read_argv( i , Data , MAX_NAME )
  2303.  
  2304.     Data[ 15 ] = 0
  2305.    
  2306.     return str_to_num( Data )
  2307.  
  2308. }
  2309. stock PString_Argv( pstring[] , size_memory , i ) {
  2310.  
  2311.     read_argv( i , pstring , size_memory-1 )
  2312.  
  2313.     pstring[ size_memory-1 ] = 0
  2314.  
  2315. }
  2316.  
  2317.  
  2318.  
  2319. stock NewError( Error[] ) {
  2320.  
  2321.  
  2322.     MSG_Error( Error )
  2323.    
  2324.     return false
  2325.  
  2326. }
  2327.  
  2328.  
  2329.  
  2330.  
  2331.  
  2332. static DisAsm_Channel = 0
  2333. static DisAsm_ReadLength = 0
  2334. static DisAsm_CmdSize = 0
  2335. static DisAsm_IsDebug = false
  2336.  
  2337. #define MRM_SIZE    3
  2338. #define MRM_MOD     0
  2339. #define MRM_REG     1
  2340. #define MRM_RM      2
  2341.  
  2342. #define SIB_SIZE    3
  2343. #define SIB_SCALE   0
  2344. #define SIB_INDEX   1
  2345. #define SIB_BASE    2
  2346.  
  2347. stock DisAsm_GetByte() {
  2348.  
  2349.     return rByte( DisAsm_Channel )
  2350.  
  2351. }
  2352. stock DisAsm_Inc( b = 1 ) {
  2353.  
  2354.     DisAsm_Channel += b
  2355.     DisAsm_ReadLength += b
  2356.     DisAsm_CmdSize += b
  2357.  
  2358. }
  2359. stock DisAsm_GetMRM( MRM[] , IfInc = true ) {
  2360.  
  2361.     new b = DisAsm_GetByte()
  2362.  
  2363.     //static MRM[ MRM_SIZE ]
  2364.  
  2365.     MRM[ MRM_MOD ] = ( b >> 6 ) & 3
  2366.     MRM[ MRM_REG ] = ( b >> 3 ) & 7
  2367.     MRM[ MRM_RM  ] = ( b      ) & 7
  2368.  
  2369.     if ( IfInc )
  2370.    
  2371.         DisAsm_Inc()
  2372.    
  2373.     //return MRM
  2374.  
  2375. }
  2376. stock DisAsm_GetSIB( SIB[] , IfInc = true ) {
  2377.  
  2378.     new b = DisAsm_GetByte()
  2379.  
  2380.     //static SIB[ MRM_SIZE ]
  2381.  
  2382.     SIB[ SIB_SCALE ] = ( b >> 6 ) & 3
  2383.     SIB[ SIB_INDEX ] = ( b >> 3 ) & 7
  2384.     SIB[ SIB_BASE  ] = ( b      ) & 7
  2385.  
  2386.     if ( IfInc )
  2387.    
  2388.         DisAsm_Inc()
  2389.    
  2390.     //return SIB
  2391.  
  2392. }
  2393. stock DisAsm_ProcessMRM() {
  2394.  
  2395.  
  2396.     static MRM[ MRM_SIZE ]
  2397.    
  2398.     static SIB[ SIB_SIZE ]
  2399.    
  2400.     DisAsm_GetMRM( MRM )
  2401.  
  2402.     if ( MRM[ MRM_MOD ] == 0 ) {
  2403.        
  2404.         if ( MRM[ MRM_RM ] == 4 ) {
  2405.        
  2406.             DisAsm_GetSIB( SIB )
  2407.                
  2408.             if ( SIB[ SIB_BASE ] == 5 )
  2409.                
  2410.                 DisAsm_Inc( 4 );
  2411.    
  2412.         }
  2413.    
  2414.     } else
  2415.     if  ( MRM[ MRM_MOD ] == 1 ) {
  2416.        
  2417.         if ( MRM[ MRM_RM ] == 4 ) {
  2418.        
  2419.             DisAsm_GetSIB( SIB )
  2420.            
  2421.             DisAsm_Inc()
  2422.        
  2423.         } else
  2424.            
  2425.             DisAsm_Inc();
  2426.    
  2427.     } else
  2428.     if  ( MRM[ MRM_MOD ] == 2 ) {
  2429.    
  2430.         if ( MRM[ MRM_RM ] == 4 ) {
  2431.        
  2432.             DisAsm_GetSIB( SIB )
  2433.            
  2434.             DisAsm_Inc( 4 )
  2435.            
  2436.         } else
  2437.        
  2438.             DisAsm_Inc( 4 )
  2439.            
  2440.     } else
  2441.     if  ( MRM[ MRM_MOD ] == 3 ) {
  2442.    
  2443.    
  2444.     }
  2445.  
  2446. }
  2447.  
  2448.  
  2449. stock DisAsm_Read_Prefix() {
  2450.    
  2451.     new B = DisAsm_GetByte()
  2452.  
  2453.     if (
  2454.         ( B == 0x26 ) ||
  2455.         ( B == 0x26 ) ||
  2456.         ( B == 0x2E ) ||
  2457.         ( B == 0x36 ) ||
  2458.         ( B == 0x3E ) ||
  2459.         ( B == 0x64 ) ||
  2460.         ( B == 0x65 ) ||
  2461.         ( B == 0xF0 ) ||
  2462.         ( B == 0xF2 ) ||
  2463.         ( B == 0xF3 ) ||
  2464.         ( B == 0x66 ) ||
  2465.         ( B == 0x67 ) ||
  2466.         ( B == 0x0F )
  2467.     ) {
  2468.    
  2469.         DisAsm_Inc()
  2470.        
  2471.         return true
  2472.    
  2473.     }
  2474.    
  2475.     return false
  2476.  
  2477. }
  2478. stock DisAsm_Read_CmdOne( B ) {
  2479.  
  2480.     if (
  2481.         ( ( B >= 0x40 ) && ( B <= 0x61 ) ) ||
  2482.         ( ( B >= 0x9B ) && ( B <= 0x9F ) ) ||
  2483.         ( ( B >= 0x90 ) && ( B <= 0x99 ) ) ||
  2484.         ( ( B >= 0x6C ) && ( B <= 0x6F ) ) ||
  2485.         ( ( B >= 0xA4 ) && ( B <= 0xA7 ) ) ||
  2486.         ( ( B >= 0xAA ) && ( B <= 0xAF ) ) ||
  2487.         ( ( B >= 0xEC ) && ( B <= 0xF5 ) ) ||
  2488.         ( ( B >= 0xF8 ) && ( B <= 0xFD ) ) ||
  2489.         ( B == 0x06 ) ||
  2490.         ( B == 0x07 ) ||
  2491.         ( B == 0x0E ) ||
  2492.         ( B == 0x16 ) ||
  2493.         ( B == 0x17 ) ||
  2494.         ( B == 0x1E ) ||
  2495.         ( B == 0x1F ) ||
  2496.         ( B == 0x27 ) ||
  2497.         ( B == 0x2F ) ||
  2498.         ( B == 0x37 ) ||
  2499.         ( B == 0x3F ) ||
  2500.         ( B == 0xC3 ) ||
  2501.         ( B == 0xC9 ) ||
  2502.         ( B == 0xCB ) ||
  2503.         ( B == 0xCC ) ||
  2504.         ( B == 0xCE ) ||
  2505.         ( B == 0xCF ) ||
  2506.         ( B == 0xD6 ) ||
  2507.         ( B == 0xD7 )
  2508.     ) {
  2509.    
  2510.         DisAsm_Inc()
  2511.        
  2512.         return true
  2513.    
  2514.     }
  2515.    
  2516.     return false
  2517.  
  2518. }
  2519. stock DisAsm_Read_CmdMrmOrigin( B ) {
  2520.  
  2521.     if (
  2522.         ( ( B >= 0x00 ) && ( B <= 0x03 ) ) ||
  2523.         ( ( B >= 0x08 ) && ( B <= 0x0B ) ) ||
  2524.         ( ( B >= 0x10 ) && ( B <= 0x13 ) ) ||
  2525.         ( ( B >= 0x18 ) && ( B <= 0x1B ) ) ||
  2526.         ( ( B >= 0x20 ) && ( B <= 0x23 ) ) ||
  2527.         ( ( B >= 0x28 ) && ( B <= 0x2B ) ) ||
  2528.         ( ( B >= 0x30 ) && ( B <= 0x33 ) ) ||
  2529.         ( ( B >= 0x38 ) && ( B <= 0x3B ) ) ||
  2530.         ( ( B >= 0x62 ) && ( B <= 0x63 ) ) ||
  2531.         ( ( B >= 0x84 ) && ( B <= 0x8E ) ) ||
  2532.         ( ( B >= 0xC4 ) && ( B <= 0xC5 ) )
  2533.     ) {
  2534.  
  2535.         DisAsm_Inc()
  2536.        
  2537.         DisAsm_ProcessMRM()
  2538.        
  2539.         return true
  2540.  
  2541.     }
  2542.    
  2543.     return false
  2544.  
  2545. }
  2546. stock DisAsm_Read_CmdData1( B ) {
  2547.  
  2548.     if (
  2549.         ( ( B >= 0xB0) && ( B <= 0xB7 ) ) ||
  2550.         ( ( B >= 0xE0) && ( B <= 0xE7 ) ) ||
  2551.         ( ( B >= 0x70) && ( B <= 0x7F ) ) ||
  2552.         ( B == 0x04 ) ||
  2553.         ( B == 0x0C ) ||
  2554.         ( B == 0x14 ) ||
  2555.         ( B == 0x1C ) ||
  2556.         ( B == 0x24 ) ||
  2557.         ( B == 0x2C ) ||
  2558.         ( B == 0x34 ) ||
  2559.         ( B == 0x3C ) ||
  2560.         ( B == 0x6A ) ||
  2561.         ( B == 0xA8 ) ||
  2562.         ( B == 0xCD )
  2563.     ) {
  2564.    
  2565.         DisAsm_Inc()
  2566.  
  2567.         DisAsm_Inc()
  2568.        
  2569.         return true
  2570.    
  2571.     }
  2572.    
  2573.     return false
  2574.  
  2575. }
  2576. stock DisAsm_Read_CmdData2i4( B ) {
  2577.  
  2578.     if (
  2579.         ( ( B >= 0xA0 ) && ( B <= 0xA3 ) ) ||
  2580.         ( ( B >= 0xB8 ) && ( B <= 0xBF ) ) ||
  2581.         ( B == 0x05 ) ||
  2582.         ( B == 0x0D ) ||
  2583.         ( B == 0x15 ) ||
  2584.         ( B == 0x1D ) ||
  2585.         ( B == 0x25 ) ||
  2586.         ( B == 0x2D ) ||
  2587.         ( B == 0x35 ) ||
  2588.         ( B == 0x3D ) ||
  2589.         ( B == 0x68 ) ||
  2590.         ( B == 0xA9 ) ||
  2591.         ( B == 0xE8 ) ||
  2592.         ( B == 0xE9 )
  2593.     ) {
  2594.  
  2595.         DisAsm_Inc()
  2596.            
  2597.         DisAsm_Inc( 4 )
  2598.  
  2599.         return true
  2600.        
  2601.     }
  2602.    
  2603.     return false
  2604.    
  2605. }
  2606. stock DisAsm_Read_CmdMrmData1( B ) {
  2607.  
  2608.     if ( B == 0x69 ) {
  2609.  
  2610.         DisAsm_Inc()
  2611.  
  2612.         DisAsm_ProcessMRM()
  2613.        
  2614.         DisAsm_Inc( 4 )
  2615.        
  2616.         return true
  2617.        
  2618.     }
  2619.  
  2620.     return false
  2621.  
  2622. }
  2623. stock DisAsm_Read_CmdNnnData1( B ) {
  2624.  
  2625.     if (
  2626.         ( B == 0x80 ) ||
  2627.         ( B == 0x82 ) ||
  2628.         ( B == 0x83 ) ||
  2629.         ( B == 0xC0 ) ||
  2630.         ( B == 0xC1 ) ||
  2631.         ( B == 0xC6 )
  2632.     ) {
  2633.    
  2634.         DisAsm_Inc()
  2635.  
  2636.         DisAsm_ProcessMRM()
  2637.        
  2638.         DisAsm_Inc()
  2639.        
  2640.         return true
  2641.    
  2642.     }
  2643.    
  2644.     return false
  2645.  
  2646. }
  2647. stock DisAsm_Read_CmdNnnData2i4( B ) {
  2648.  
  2649.     if (
  2650.             ( B == 0x81 ) ||
  2651.             ( B == 0xC7 )
  2652.         ) {
  2653.    
  2654.         DisAsm_Inc()
  2655.  
  2656.         static MRM[ MRM_SIZE ]
  2657.        
  2658.         static SIB[ SIB_SIZE ]
  2659.        
  2660.         DisAsm_GetMRM( MRM )
  2661.  
  2662.         if ( MRM[ MRM_MOD ] == 0 ) {
  2663.            
  2664.             if ( MRM[ MRM_RM ] == 4 ) {
  2665.            
  2666.                 DisAsm_GetSIB( SIB )
  2667.                    
  2668.                 if ( SIB[ SIB_BASE ] == 5 )
  2669.                    
  2670.                     DisAsm_Inc( 4 )
  2671.        
  2672.             } else
  2673.                
  2674.                 DisAsm_Inc( 4 )
  2675.        
  2676.         } else
  2677.         if  ( MRM[ MRM_MOD ] == 1 ) {
  2678.            
  2679.             if ( MRM[ MRM_RM ] == 4 ) {
  2680.            
  2681.                 DisAsm_GetSIB( SIB )
  2682.            
  2683.                 DisAsm_Inc()
  2684.            
  2685.             } else
  2686.                
  2687.                 DisAsm_Inc()
  2688.        
  2689.         } else
  2690.         if  ( MRM[ MRM_MOD ] == 2 ) {
  2691.        
  2692.             if ( MRM[ MRM_RM ] == 4 ) {
  2693.            
  2694.                 DisAsm_GetSIB( SIB )
  2695.            
  2696.                 DisAsm_Inc( 4 )
  2697.                
  2698.             } else
  2699.            
  2700.                 DisAsm_Inc( 4 )
  2701.                
  2702.         } else
  2703.         if  ( MRM[ MRM_MOD ] == 3 ) {
  2704.        
  2705.        
  2706.         }
  2707.  
  2708.         DisAsm_Inc( 4 )
  2709.        
  2710.         return true
  2711.        
  2712.     }
  2713.    
  2714.     return false
  2715.    
  2716. }
  2717.  
  2718. stock DisAsm_Reset() {
  2719.    
  2720.     DisAsm_CmdSize = 0
  2721.  
  2722. }
  2723. stock DisAsm_Init( Addr ) {
  2724.  
  2725.     DisAsm_Channel = Addr
  2726.     DisAsm_ReadLength = 0
  2727.     DisAsm_Reset()
  2728.  
  2729. }
  2730. stock DisAsm_DebugShow( t ) {
  2731.  
  2732.     if ( DisAsm_IsDebug ) {
  2733.        
  2734.         if ( t == 0 ) {
  2735.  
  2736.             server_print( "[OST] ---------------------------------------------" )
  2737.             server_print( "[OST] Addr   = 0x%s" , GetDWordHex( DisAsm_Channel ) )
  2738.             server_print( "[OST] Opcode = 0x%s" , GetDWordHex( rByte(DisAsm_Channel) ) )
  2739.        
  2740.         } else
  2741.        
  2742.         if ( t == 1 ) {
  2743.        
  2744.             server_print( "[OST] Size cmd = 0x%s" , GetDWordHex( DisAsm_CmdSize ) )
  2745.             server_print( "[OST] Milc cmd = 0x%s" , GetDWordHex( DisAsm_ReadLength ) )
  2746.        
  2747.         }
  2748.        
  2749.         if ( t == 2 ) {
  2750.        
  2751.             server_print( "[OST] Size cmd = 0x%s" , GetDWordHex( DisAsm_CmdSize ) )
  2752.             server_print( "[OST] Milc cmd = 0x%s" , GetDWordHex( DisAsm_ReadLength ) )
  2753.  
  2754.             server_print( "[OST] ---------------------------------------------" )
  2755.             server_print( "[OST] Addr   = 0x%s" , GetDWordHex( DisAsm_Channel ) )
  2756.             server_print( "[OST] Opcode = 0x%s" , GetDWordHex( rByte(DisAsm_Channel) ) )
  2757.        
  2758.         }
  2759.        
  2760.     }
  2761.  
  2762. }
  2763. stock DisAsm_Read_Cmd() {
  2764.  
  2765.     DisAsm_Reset()
  2766.  
  2767.     while( true )
  2768.         if ( !( DisAsm_Read_Prefix() ) )
  2769.             break;
  2770.    
  2771.     new Cmd = DisAsm_GetByte()
  2772.  
  2773.     if (
  2774.         ( DisAsm_Read_CmdOne( Cmd )        ) ||
  2775.         ( DisAsm_Read_CmdMrmOrigin( Cmd )  ) ||
  2776.         ( DisAsm_Read_CmdData1( Cmd )      ) ||
  2777.         ( DisAsm_Read_CmdData2i4( Cmd )    ) ||
  2778.         ( DisAsm_Read_CmdMrmData1( Cmd )   ) ||
  2779.         ( DisAsm_Read_CmdNnnData1( Cmd )   ) ||
  2780.         ( DisAsm_Read_CmdNnnData2i4( Cmd ) )
  2781.     )
  2782.    
  2783.             return true;
  2784.  
  2785.     return false;
  2786.  
  2787. }
  2788. stock DisAsm_GetMinLen( Addr , Len = 5 ) {
  2789.  
  2790.     DisAsm_Init( Addr )
  2791.    
  2792.     DisAsm_DebugShow( 0 )
  2793.  
  2794.     while( DisAsm_Read_Cmd() ) {
  2795.    
  2796.         if ( DisAsm_ReadLength >= Len ) {
  2797.        
  2798.             DisAsm_DebugShow( 1 )
  2799.            
  2800.             return DisAsm_ReadLength
  2801.            
  2802.         }
  2803.  
  2804.         DisAsm_DebugShow( 2 )
  2805.    
  2806.     }
  2807.    
  2808.     return -1;
  2809.  
  2810. }
  2811.  
  2812. stock Detours_GetGate( Addr , NewAddr ) {
  2813.  
  2814.     new MinLength = DisAsm_GetMinLen( Addr )
  2815.  
  2816.     if ( MinLength == -1 )
  2817.    
  2818.         return 0;
  2819.        
  2820.     new Gate = Malloc( MinLength + 5 )
  2821.    
  2822.     new i
  2823.    
  2824.     for ( i = 0; i < MinLength; i++ )
  2825.    
  2826.         wByte( Gate + i , rByte( Addr + i ) )
  2827.  
  2828.     wByte( Gate + MinLength , 0xE9 )
  2829.    
  2830.     wDWord( Gate + MinLength + 1 , Addr - Gate - 4 - 1 )
  2831.  
  2832.     wByte( Addr , 0xE9 )
  2833.    
  2834.     wDWord( Addr + 1 , NewAddr - Addr - 4 )
  2835.  
  2836.     return Gate
  2837.    
  2838. }
  2839.  
  2840.  
  2841.  
  2842.  
  2843.  
  2844.  
  2845. /*    ############################################################ Move  Resource ###########################################################  */
  2846. /*
  2847.  
  2848. //  [ESP] - Old EIP     [ESP + 4] - Dest      [ESP + 8] - Sour      [ESP + 12] - Size
  2849. function MoveResourse: Cardinal;
  2850. asm
  2851.   pushf
  2852.   push ESI
  2853.   push EDI
  2854.  
  2855.   mov EDI , [ ESP + 10 + 4 ]
  2856.   mov ESI , [ ESP + 10 + 8 ]
  2857.   mov ECX , [ ESP + 10 + 12 ]
  2858.   shr ECX , 2
  2859.   std
  2860.   rep movsd
  2861.  
  2862.   xor EAX , EAX
  2863.   mov ECX , 34
  2864.   cld
  2865.   rep stosd
  2866.  
  2867.   pop EDI
  2868.   pop ESI
  2869.   popf
  2870. end;
  2871.  
  2872. */
  2873.  
  2874.  
  2875.  
  2876. /*    ############################################################# Random Path #############################################################   */
  2877. /*
  2878.  
  2879. function __strlen(s: Cardinal): Cardinal;
  2880. asm
  2881.   push EDI
  2882.  
  2883.   mov EDI , EAX
  2884.   xor AL , AL
  2885.   mov ECX , 65536
  2886.   cld
  2887.   repne scasb
  2888.   je @_return
  2889.   mov EAX , 0
  2890.   pop EDI
  2891.   ret
  2892.  
  2893. @_return:
  2894.   mov EAX , 65535
  2895.   sub EAX , ECX
  2896.   pop EDI
  2897. end;
  2898. function __copy(d, s, size: Cardinal): Cardinal;
  2899. asm
  2900.   push ESI
  2901.   push EDI
  2902.   push EBX
  2903.  
  2904.   mov EBX , ECX
  2905.   and ECX , $FFFFFFFC
  2906.   sub EBX , ECX
  2907.   shr ECX , 2
  2908.  
  2909.   mov EDI , EAX
  2910.   mov ESI , EDX
  2911.   cld
  2912.   rep movsd
  2913.  
  2914.   mov ECX , EBX
  2915.   rep movsb
  2916.  
  2917.   pop EBX
  2918.   pop EDI
  2919.   pop ESI
  2920. end;
  2921. function __equal(m1, m2, size: Cardinal): Cardinal;
  2922. asm
  2923.   push ESI
  2924.   push EDI
  2925.   push EBX
  2926.  
  2927.   mov EBX , ECX
  2928.   and ECX , $FFFFFFFC
  2929.   sub EBX , ECX
  2930.   shr ECX , 2
  2931.  
  2932.   mov EDI , EAX
  2933.   mov ESI , EDX
  2934.   cld
  2935.   repe cmpsd
  2936.   jnz @_not_equal
  2937.  
  2938.   mov ECX , EBX
  2939.   repe cmpsb
  2940.   jnz @_not_equal
  2941.  
  2942.   mov EAX , 1
  2943.   jmp @_exit
  2944.  
  2945. @_not_equal:
  2946.   mov EAX , 0
  2947.  
  2948. @_exit:
  2949.   pop EBX
  2950.   pop EDI
  2951.   pop ESI
  2952. end;
  2953. function __find(m_base, m_end, p_base, p_size, offset: Cardinal): Cardinal;
  2954. var
  2955.   i, _c, _p: Cardinal;
  2956. begin
  2957.  
  2958.   Dec(m_end, p_size);
  2959.  
  2960.   _p := p_size;
  2961.   Dec(_p);
  2962.  
  2963.   for m_base := m_base to m_end do
  2964.   begin
  2965.  
  2966.     for i := 0 to _p do
  2967.     begin
  2968.  
  2969.       _c := PByte(p_base + i)^;
  2970.  
  2971.       if (_c = $FF) then
  2972.         continue;
  2973.  
  2974.       if (not(_c = PByte(m_base + i)^)) then
  2975.         break;
  2976.  
  2977.     end;
  2978.  
  2979.     if (i = p_size) then
  2980.     begin
  2981.       Result := m_base + offset;
  2982.       Exit;
  2983.     end;
  2984.  
  2985.   end;
  2986.  
  2987.   Result := 0;
  2988.   Exit;
  2989.  
  2990. end;
  2991.  
  2992. function __random( max: Word ): Cardinal;
  2993. var
  2994.  pRandSeed: PWord;
  2995.  Temp: Word;
  2996.  TempInt: Int32;
  2997. begin
  2998.  
  2999.  if ( max = 0 ) then
  3000.   begin
  3001.     Result := 0;
  3002.     Exit;
  3003.   end;
  3004.  
  3005.  pRandSeed := Pointer($22222222);
  3006.  
  3007.  Temp := Word( pRandSeed^ * $08088405 + 1 );
  3008.  
  3009.  pRandSeed^ := Temp;
  3010.  
  3011.  TempInt := Cardinal(Temp) * Cardinal(Max);
  3012.  
  3013.  TempInt := TempInt shr 16;
  3014.  
  3015.  Result := Word(TempInt);
  3016.  
  3017.  if ( max <= Result ) then
  3018.   Result := __random( max );
  3019.  
  3020. end;
  3021. function __random_char: Byte;
  3022. begin
  3023.   Result := 98;
  3024.   case (__random(3) ) of
  3025.     0: Result := __random(24) + 97;
  3026.     1: Result := __random(24) + 65;
  3027.     2: Result := __random(8) + 48;
  3028.   end;
  3029. end;
  3030. function __process: Cardinal;
  3031. var
  3032.   base , predel: Cardinal;
  3033. begin
  3034.  
  3035.   base := Cardinal( $11111111 );
  3036.  
  3037.   predel := base + __random(8) + 4;
  3038.  
  3039.   while( not( base = predel ) ) do
  3040.    begin
  3041.  
  3042.     PByte( Base )^ := __random_char;
  3043.  
  3044.     Inc( Base );
  3045.  
  3046.    end;
  3047.  
  3048.   PByte( Base )^ := 0;
  3049.  
  3050. end;
  3051. function __jmp: Cardinal;
  3052. asm
  3053.   push AX
  3054.  
  3055.   pushf
  3056.   pusha
  3057.  
  3058.   call __process
  3059.  
  3060.   popa
  3061.   popf
  3062.  
  3063.   pop AX
  3064.  
  3065.   db $E9 db $33 db $33 db $33 db $33
  3066.  
  3067.   db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF
  3068.   db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF
  3069.   db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF
  3070.  
  3071. end;
  3072.  
  3073. //  Replace
  3074. //    $11111111 - to String Base
  3075. //    $22222222 - to RandSeed Base
  3076. //    $33333333 - to Relative Jump to SV_SendResources
  3077. //    [ 0x66 0x50  0x66 0x9C  0x66 0x60 ] - to EntryPoint
  3078.  
  3079. function __CopyEnd: Cardinal;
  3080. asm
  3081.  db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF
  3082.  db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF
  3083. end;
  3084.  
  3085. procedure TForm34.Button1Click(Sender: TObject);
  3086. var
  3087.   f: Cardinal;
  3088.   i, v, c: Cardinal;
  3089.   s: AnsiString;
  3090.   Temp: Cardinal;
  3091.   m, cc: Cardinal;
  3092. begin
  3093.  
  3094.  s := '';
  3095.  
  3096.  m := Cardinal(@__strlen);
  3097.  i := m;
  3098.  
  3099.  cc := 0;
  3100.  while( i <= (Cardinal(@__CopyEnd)+4) ) do
  3101.   begin
  3102.    c := PCardinal(i)^;
  3103.  
  3104.    v := i - m;
  3105.  
  3106.    c := v XOR ( c XOR ( ( v shl 3 ) + 78963 ) - 13523 );
  3107.  
  3108.    s := s + '0x'+IntToHex( c , 8 ) + ',';
  3109.  
  3110.    Inc(cc);
  3111.    if ( cc = 16 ) then
  3112.     begin
  3113.      cc := 0;
  3114.      memo1.lines.add( s );
  3115.      s := '';
  3116.     end;
  3117.  
  3118.  
  3119.    Inc( i , 4 );
  3120.  
  3121.   end;
  3122.  
  3123.  memo1.lines.add( s );
  3124.  
  3125.  
  3126.  memo1.Lines.Add(inttohex(cardinal(@__strlen),8));
  3127.  memo1.Lines.Add(inttohex(cardinal(@__CopyEnd),8));
  3128.  memo1.Lines.Add(inttohex(cardinal(@__jmp),8));
  3129.  
  3130.  exit;
  3131.  __random(0);
  3132.  __random_char;
  3133.  __process;
  3134.  __jmp;
  3135.  __CopyEnd;
  3136.  
  3137.  __strlen(0);
  3138.  __copy(0,0,0);
  3139.  __equal(0,0,0);
  3140.  __find(0,0,0,0,0);
  3141. end;
  3142.  
  3143. */
  3144.  
  3145.  
  3146.  
  3147. /*    ############################################################# Get File Index #############################################################   */
  3148. /*
  3149.  
  3150. function __jmp: Cardinal;
  3151. asm
  3152.  
  3153.  push $0C
  3154.  db $E8
  3155.   db $22 db $22 db $22 db $22
  3156.  add ESP , 4
  3157.  
  3158.  mov [$11111111] , EAX
  3159.  
  3160.  ret
  3161.  
  3162.  db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF
  3163.  db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF
  3164. end;
  3165.  
  3166. //  Replace:
  3167. //    $11111111 - to Ptr Index File
  3168. //    $22222222 - to Relative EntryPoint MSG_ReadBits
  3169. //    [ 0x6A 0x0C ] - to EntryPoint
  3170.  
  3171.  
  3172. function __CopyEnd: Cardinal;
  3173. asm
  3174.  db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF
  3175.  db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF
  3176. end;
  3177.  
  3178. procedure TForm34.Button1Click(Sender: TObject);
  3179. var
  3180.   f: Cardinal;
  3181.   i, v, c: Cardinal;
  3182.   s: AnsiString;
  3183.   Temp: Cardinal;
  3184.   m, cc: Cardinal;
  3185. begin
  3186.  
  3187.  s := '';
  3188.  
  3189.  m := Cardinal(@__jmp);
  3190.  i := m;
  3191.  
  3192.  cc := 0;
  3193.  while( i <= (Cardinal(@__CopyEnd)+4) ) do
  3194.   begin
  3195.    c := PCardinal(i)^;
  3196.  
  3197.    v := i - m;
  3198.  
  3199.    c := v XOR ( c XOR ( ( v shl 3 ) + 78963 ) - 13523 );
  3200.  
  3201.    s := s + '0x'+IntToHex( c , 8 ) + ',';
  3202.  
  3203.    Inc(cc);
  3204.    if ( cc = 16 ) then
  3205.     begin
  3206.      cc := 0;
  3207.      memo1.lines.add( s );
  3208.      s := '';
  3209.     end;
  3210.  
  3211.  
  3212.    Inc( i , 4 );
  3213.  
  3214.   end;
  3215.  
  3216.  memo1.lines.add( s );
  3217.  
  3218.  
  3219.  memo1.Lines.Add(inttohex(cardinal(@__strlen),8));
  3220.  memo1.Lines.Add(inttohex(cardinal(@__CopyEnd),8));
  3221.  
  3222.  exit;
  3223.  __process(0);
  3224.  __jmp;
  3225.  __CopyEnd;
  3226.  
  3227.  __strlen(0);
  3228.  __copy(0,0,0);
  3229.  __equal(0,0,0);
  3230.  __find(0,0,0,0,0);
  3231. end;
  3232.  
  3233.  
  3234.  
  3235. */
  3236.  
  3237.  
  3238.  
  3239. /*    ############################################################## Try Files ##############################################################   */
  3240. /*
  3241. function __strlen(s: Cardinal): Cardinal;
  3242. asm
  3243.   push EDI
  3244.  
  3245.   mov EDI , EAX
  3246.   xor AL , AL
  3247.   mov ECX , 65536
  3248.   cld
  3249.   repne scasb
  3250.   je @_return
  3251.   mov EAX , 0
  3252.   pop EDI
  3253.   ret
  3254.  
  3255. @_return:
  3256.   mov EAX , 65535
  3257.   sub EAX , ECX
  3258.   pop EDI
  3259. end;
  3260. function __copy(d, s, size: Cardinal): Cardinal;
  3261. asm
  3262.   push ESI
  3263.   push EDI
  3264.   push EBX
  3265.  
  3266.   mov EBX , ECX
  3267.   and ECX , $FFFFFFFC
  3268.   sub EBX , ECX
  3269.   shr ECX , 2
  3270.  
  3271.   mov EDI , EAX
  3272.   mov ESI , EDX
  3273.   cld
  3274.   rep movsd
  3275.  
  3276.   mov ECX , EBX
  3277.   rep movsb
  3278.  
  3279.   pop EBX
  3280.   pop EDI
  3281.   pop ESI
  3282. end;
  3283. function __equal(m1, m2, size: Cardinal): Cardinal;
  3284. asm
  3285.   push ESI
  3286.   push EDI
  3287.   push EBX
  3288.  
  3289.   mov EBX , ECX
  3290.   and ECX , $FFFFFFFC
  3291.   sub EBX , ECX
  3292.   shr ECX , 2
  3293.  
  3294.   mov EDI , EAX
  3295.   mov ESI , EDX
  3296.   cld
  3297.   repe cmpsd
  3298.   jnz @_not_equal
  3299.  
  3300.   mov ECX , EBX
  3301.   repe cmpsb
  3302.   jnz @_not_equal
  3303.  
  3304.   mov EAX , 1
  3305.   jmp @_exit
  3306.  
  3307. @_not_equal:
  3308.   mov EAX , 0
  3309.  
  3310. @_exit:
  3311.   pop EBX
  3312.   pop EDI
  3313.   pop ESI
  3314. end;
  3315. function __find(m_base, m_end, p_base, p_size, offset: Cardinal): Cardinal;
  3316. var
  3317.   i, _c, _p: Cardinal;
  3318. begin
  3319.  
  3320.   Dec(m_end, p_size);
  3321.  
  3322.   _p := p_size;
  3323.   Dec(_p);
  3324.  
  3325.   for m_base := m_base to m_end do
  3326.   begin
  3327.  
  3328.     for i := 0 to _p do
  3329.     begin
  3330.  
  3331.       _c := PByte(p_base + i)^;
  3332.  
  3333.       if (_c = $FF) then
  3334.         continue;
  3335.  
  3336.       if (not(_c = PByte(m_base + i)^)) then
  3337.         break;
  3338.  
  3339.     end;
  3340.  
  3341.     if (i = p_size) then
  3342.     begin
  3343.       Result := m_base + offset;
  3344.       Exit;
  3345.     end;
  3346.  
  3347.   end;
  3348.  
  3349.   Result := 0;
  3350.   Exit;
  3351.  
  3352. end;
  3353.  
  3354. function t__write_num( num , mem: Cardinal ): Cardinal;
  3355. asm
  3356.  and EAX , $FF
  3357.  
  3358.  mov cl , 10
  3359.  div cl
  3360.  
  3361.  add ah , 48
  3362.  mov [EDX + 1] , ah
  3363.  
  3364.  xor ah , ah
  3365.  
  3366.  div cl
  3367.  add ah , 48
  3368.  mov [EDX] , ah
  3369. end;
  3370. function __write_num_2( num , mem: Cardinal ): Cardinal;
  3371. begin
  3372.  
  3373.  PByte( mem + 1 )^ := 48 + ( num mod 10 );
  3374.  
  3375.  num := num div 10;
  3376.  
  3377.  PByte( mem     )^ := 48 + ( num mod 10 );
  3378.  
  3379. end;
  3380. function __write_num_4( num , mem: Cardinal ): Cardinal;
  3381. begin
  3382.  
  3383.  PByte( mem + 3 )^ := 48 + ( num mod 10 );
  3384.  
  3385.  num := num div 10;
  3386.  
  3387.  PByte( mem + 2 )^ := 48 + ( num mod 10 );
  3388.  
  3389.  num := num div 10;
  3390.  
  3391.  PByte( mem + 1 )^ := 48 + ( num mod 10 );
  3392.  
  3393.  num := num div 10;
  3394.  
  3395.  PByte( mem     )^ := 48 + ( num mod 10 );
  3396.  
  3397. end;           // 4 294 967 296
  3398. function __write_num_10( num , mem: Cardinal ): Cardinal;
  3399. begin
  3400.  
  3401.  PByte( mem + 9 )^ := 48 + ( num mod 10 );
  3402.  
  3403.  num := num div 10;
  3404.  
  3405.  PByte( mem + 8 )^ := 48 + ( num mod 10 );
  3406.  
  3407.  num := num div 10;
  3408.  
  3409.  PByte( mem + 7 )^ := 48 + ( num mod 10 );
  3410.  
  3411.  num := num div 10;
  3412.  
  3413.  PByte( mem + 6 )^ := 48 + ( num mod 10 );
  3414.  
  3415.  num := num div 10;
  3416.  
  3417.  PByte( mem + 5 )^ := 48 + ( num mod 10 );
  3418.  
  3419.  num := num div 10;
  3420.  
  3421.  PByte( mem + 4 )^ := 48 + ( num mod 10 );
  3422.  
  3423.  num := num div 10;
  3424.  
  3425.  PByte( mem + 3 )^ := 48 + ( num mod 10 );
  3426.  
  3427.  num := num div 10;
  3428.  
  3429.  PByte( mem + 2 )^ := 48 + ( num mod 10 );
  3430.  
  3431.  num := num div 10;
  3432.  
  3433.  PByte( mem + 1 )^ := 48 + ( num mod 10 );
  3434.  
  3435.  num := num div 10;
  3436.  
  3437.  PByte( mem     )^ := 48 + ( num mod 10 );
  3438.  
  3439. end;
  3440.  
  3441. type
  3442.  info_table_s = ^info_table_t;
  3443.  info_table_t = Array[ 0..$500] of Cardinal;
  3444.  
  3445. type
  3446.  TCbuf_AddText = function( Str: Cardinal ): Cardinal; cdecl;
  3447.  
  3448. type
  3449.  info_s = ^info_t;
  3450.  info_t = Record
  3451.   CountIndex:   Cardinal;
  3452.   LastMD5:      Cardinal;
  3453.   Host_CL:      Cardinal;
  3454.   Cbuf_AddText: TCbuf_AddText;
  3455.   TableData:    info_table_s;
  3456.   TempString:   Cardinal;
  3457.  End;
  3458.  
  3459. function __write_try_num( Info: info_s; Name, Num: Cardinal ): Cardinal;
  3460. var
  3461.  Base: Cardinal;
  3462.  len: Cardinal;
  3463. begin
  3464.  
  3465.    Base := Info^.TempString;
  3466.  
  3467.    PCardinal( Base )^ := $2220625F;
  3468.  
  3469.    __copy( Base + 4 , Name , $20 );
  3470.    PByte( Base + $20 + 4 )^ := 0;
  3471.  
  3472.    len := __strlen( Base );
  3473.  
  3474.    PWord( Base + len )^ := $2022;
  3475.    Inc( len , 2 );
  3476.  
  3477.    __write_num_10( Num XOR 1231234 , Base + len );
  3478.    Inc( len , 10 );
  3479.  
  3480.    PWord( Base + len )^ := $000A;
  3481.  
  3482.    Info^.Cbuf_AddText( Base );
  3483.  
  3484. end;
  3485. function __write_is_file( Info: info_s; Name, Mem: Cardinal ): Cardinal;
  3486. var
  3487.  Base: Cardinal;
  3488.  i, len, mem_len, mem_predel: Cardinal;
  3489. begin
  3490.    //   %n
  3491.  
  3492.    Base := Info^.TempString;
  3493.  
  3494.    mem_len := __strlen( Mem );
  3495.  
  3496.    mem_predel := Mem + mem_len - 2;
  3497.  
  3498.    i := Mem;
  3499.  
  3500.    while( not( i = mem_predel ) ) do
  3501.     begin
  3502.  
  3503.      if ( PWord( i )^ = $6E25 ) then
  3504.       break;
  3505.  
  3506.      Inc( i );
  3507.  
  3508.     end;
  3509.  
  3510.    if ( i = mem_predel ) then
  3511.     begin
  3512.  
  3513.      __copy( Base , Mem , mem_len );
  3514.  
  3515.      PWord( Base + mem_len )^ := $000A;
  3516.  
  3517.      Info^.Cbuf_AddText( Base );
  3518.  
  3519.      Exit;
  3520.  
  3521.     end;
  3522.  
  3523.    len := i - Mem;
  3524.  
  3525.    __copy( Base , Mem , len );
  3526.  
  3527.    __copy( Base + len , Name , $20 );
  3528.    PByte( Base + len + $20 )^ := 0;
  3529.  
  3530.    len := __strlen( Base );
  3531.    mem_len := mem_predel - i + 1;
  3532.    __copy( Base + len , i + 2 , mem_len );
  3533.  
  3534.    PWord( Base + len + mem_len )^ := $000A;
  3535.  
  3536.    Info^.Cbuf_AddText( Base );
  3537.  
  3538. end;
  3539. function __process( MD5: Cardinal ): Cardinal;
  3540. var
  3541.  Info: info_s;
  3542.  Index: Cardinal;
  3543.  Name: Cardinal;
  3544. begin
  3545.  
  3546.  Result := MD5;
  3547.  
  3548.  Info :=  Pointer($11111111);
  3549.  
  3550.  Index := PCardinal($33333333)^;
  3551.  
  3552.  if ( Index >= Info^.CountIndex ) then
  3553.   Exit;
  3554.  
  3555.  Result := 0;
  3556.  
  3557.  Name := PCardinal(Info^.Host_CL)^ + $4D08;     //  If Linux => $4BE8
  3558.  
  3559.  if ( Index = 0 ) then
  3560.   begin
  3561.  
  3562.    Info^.LastMD5  := MD5;
  3563.  
  3564.    __write_try_num( Info , Name , MD5 );
  3565.  
  3566.    Exit;
  3567.  
  3568.   end;
  3569.  
  3570.  if ( ( Info^.LastMD5 <> MD5 ) AND ( Info^.TableData^[ Index ] <> 0 ) ) then
  3571.   begin
  3572.  
  3573.    Info^.LastMD5 := MD5;
  3574.  
  3575.    __write_is_file( Info , Name , Info^.TableData^[ Index ] );
  3576.  
  3577.   end;
  3578.  
  3579. end;
  3580.  
  3581. function __jmp: Cardinal;
  3582. asm
  3583.  push DX
  3584.  pushf
  3585.  
  3586.  push EDX
  3587.  push ECX
  3588.  push ESI
  3589.  push EDI
  3590.  push EBX
  3591.  
  3592.  push $20
  3593.  db $E8
  3594.   db $22 db $22 db $22 db $22
  3595.  pop EDX
  3596.  
  3597.  call __process
  3598.  
  3599.  pop EBX
  3600.  pop EDI
  3601.  pop ESI
  3602.  pop ECX
  3603.  pop EDX
  3604.  
  3605.  popf
  3606.  pop DX
  3607.  
  3608.  ret
  3609.  
  3610.  db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF
  3611.  db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF
  3612. end;
  3613.  
  3614. //  Replace:
  3615. //    $11111111 - to Info Table
  3616. //    $22222222 - to Relative EntryPoint MSG_ReadBits
  3617. //    $33333333 - to Ptr Index File
  3618. //  Search:
  3619. //    [ 0x66 , 0x52 ,  0x66 , 0x9C ] - to EntryPoint
  3620.  
  3621.  
  3622. function __CopyEnd: Cardinal;
  3623. asm
  3624.  db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF
  3625.  db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF db $FF
  3626. end;
  3627.  
  3628. procedure TForm34.Button1Click(Sender: TObject);
  3629. var
  3630.   f: Cardinal;
  3631.   i, v, c: Cardinal;
  3632.   s: AnsiString;
  3633.   Temp: Cardinal;
  3634.   m, cc: Cardinal;
  3635. begin
  3636.  
  3637.  s := '';
  3638.  
  3639.  m := Cardinal(@__strlen);
  3640.  i := m;
  3641.  
  3642.  cc := 0;
  3643.  while( i <= (Cardinal(@__CopyEnd)+4) ) do
  3644.   begin
  3645.    c := PCardinal(i)^;
  3646.  
  3647.    v := i - m;
  3648.  
  3649.    c := v XOR ( c XOR ( ( v shl 3 ) + 78963 ) - 13523 );
  3650.  
  3651.    s := s + '0x'+IntToHex( c , 8 ) + ',';
  3652.  
  3653.    Inc(cc);
  3654.    if ( cc = 16 ) then
  3655.     begin
  3656.      cc := 0;
  3657.      memo1.lines.add( s );
  3658.      s := '';
  3659.     end;
  3660.  
  3661.  
  3662.    Inc( i , 4 );
  3663.  
  3664.   end;
  3665.  
  3666.  memo1.lines.add( s );
  3667.  
  3668.  
  3669.  memo1.Lines.Add(inttohex(cardinal(@__strlen),8));
  3670.  memo1.Lines.Add(inttohex(cardinal(@__CopyEnd),8));
  3671.  
  3672.  exit;
  3673.  __process(0);
  3674.  __jmp;
  3675.  __CopyEnd;
  3676.  
  3677.  __strlen(0);
  3678.  __copy(0,0,0);
  3679.  __equal(0,0,0);
  3680.  __find(0,0,0,0,0);
  3681. end;
  3682.  
  3683.  
  3684. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement