├── code ├── ADE32.cpp ├── ADE32.h ├── CDetour.cpp ├── CDetour.h ├── dllmain.cpp ├── input_proxy.cpp ├── patches.cpp └── ut3proxy.def ├── ut3proxy.sln ├── ut3proxy.vcxproj └── ut3proxy.vcxproj.filters /code/ADE32.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | PROJECT: m0d_s0beit_sa 4 | LICENSE: See LICENSE in the top level directory 5 | COPYRIGHT: Copyright 2007, 2008, 2009, 2010 we_sux 6 | 7 | m0d_s0beit_sa is available from http://code.google.com/p/m0d-s0beit-sa/ 8 | 9 | m0d_s0beit_sa is free software: you can redistribute it and/or modify 10 | it under the terms of the GNU General Public License as published by 11 | the Free Software Foundation, either version 3 of the License, or 12 | (at your option) any later version. 13 | 14 | m0d_s0beit_sa is distributed in the hope that it will be useful, 15 | but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | GNU General Public License for more details. 18 | 19 | You should have received a copy of the GNU General Public License 20 | along with m0d_s0beit_sa. If not, see . 21 | 22 | */ 23 | 24 | #include 25 | #include "ADE32.h" 26 | // ADE32 version 2.02c -- C edition 27 | 28 | #define WIN32_LEAN_AND_MEAN 29 | #define WIN32_EXTRA_LEAN 30 | 31 | DWORD ade32_table[512] = { 32 | /* 00 */ C_MODRM, 33 | /* 01 */ C_MODRM, 34 | /* 02 */ C_MODRM, 35 | /* 03 */ C_MODRM, 36 | /* 04 */ C_DATA1, 37 | /* 05 */ C_DATA66, 38 | /* 06 */ C_BAD, 39 | /* 07 */ C_BAD, 40 | /* 08 */ C_MODRM, 41 | /* 09 */ C_MODRM, 42 | /* 0A */ C_MODRM, 43 | /* 0B */ C_MODRM, 44 | /* 0C */ C_DATA1, 45 | /* 0D */ C_DATA66, 46 | /* 0E */ C_BAD, 47 | /* 0F */ C_OPCODE2, 48 | /* 10 */ C_MODRM+C_BAD, 49 | /* 11 */ C_MODRM, 50 | /* 12 */ C_MODRM+C_BAD, 51 | /* 13 */ C_MODRM, 52 | /* 14 */ C_DATA1+C_BAD, 53 | /* 15 */ C_DATA66+C_BAD, 54 | /* 16 */ C_BAD, 55 | /* 17 */ C_BAD, 56 | /* 18 */ C_MODRM+C_BAD, 57 | /* 19 */ C_MODRM, 58 | /* 1A */ C_MODRM, 59 | /* 1B */ C_MODRM, 60 | /* 1C */ C_DATA1+C_BAD, 61 | /* 1D */ C_DATA66+C_BAD, 62 | /* 1E */ C_BAD, 63 | /* 1F */ C_BAD, 64 | /* 20 */ C_MODRM, 65 | /* 21 */ C_MODRM, 66 | /* 22 */ C_MODRM, 67 | /* 23 */ C_MODRM, 68 | /* 24 */ C_DATA1, 69 | /* 25 */ C_DATA66, 70 | /* 26 */ C_SEG+C_BAD, 71 | /* 27 */ C_BAD, 72 | /* 28 */ C_MODRM, 73 | /* 29 */ C_MODRM, 74 | /* 2A */ C_MODRM, 75 | /* 2B */ C_MODRM, 76 | /* 2C */ C_DATA1, 77 | /* 2D */ C_DATA66, 78 | /* 2E */ C_SEG+C_BAD, 79 | /* 2F */ C_BAD, 80 | /* 30 */ C_MODRM, 81 | /* 31 */ C_MODRM, 82 | /* 32 */ C_MODRM, 83 | /* 33 */ C_MODRM, 84 | /* 34 */ C_DATA1, 85 | /* 35 */ C_DATA66, 86 | /* 36 */ C_SEG+C_BAD, 87 | /* 37 */ C_BAD, 88 | /* 38 */ C_MODRM, 89 | /* 39 */ C_MODRM, 90 | /* 3A */ C_MODRM, 91 | /* 3B */ C_MODRM, 92 | /* 3C */ C_DATA1, 93 | /* 3D */ C_DATA66, 94 | /* 3E */ C_SEG+C_BAD, 95 | /* 3F */ C_BAD, 96 | /* 40 */ 0, 97 | /* 41 */ 0, 98 | /* 42 */ 0, 99 | /* 43 */ 0, 100 | /* 44 */ C_BAD, 101 | /* 45 */ 0, 102 | /* 46 */ 0, 103 | /* 47 */ 0, 104 | /* 48 */ 0, 105 | /* 49 */ 0, 106 | /* 4A */ 0, 107 | /* 4B */ 0, 108 | /* 4C */ C_BAD, 109 | /* 4D */ 0, 110 | /* 4E */ 0, 111 | /* 4F */ 0, 112 | /* 50 */ 0, 113 | /* 51 */ 0, 114 | /* 52 */ 0, 115 | /* 53 */ 0, 116 | /* 54 */ 0, 117 | /* 55 */ 0, 118 | /* 56 */ 0, 119 | /* 57 */ 0, 120 | /* 58 */ 0, 121 | /* 59 */ 0, 122 | /* 5A */ 0, 123 | /* 5B */ 0, 124 | /* 5C */ C_BAD, 125 | /* 5D */ 0, 126 | /* 5E */ 0, 127 | /* 5F */ 0, 128 | /* 60 */ C_BAD, 129 | /* 61 */ C_BAD, 130 | /* 62 */ C_MODRM+C_BAD, 131 | /* 63 */ C_MODRM+C_BAD, 132 | /* 64 */ C_SEG, 133 | /* 65 */ C_SEG+C_BAD, 134 | /* 66 */ C_66, 135 | /* 67 */ C_67, 136 | /* 68 */ C_DATA66, 137 | /* 69 */ C_MODRM+C_DATA66, 138 | /* 6A */ C_DATA1, 139 | /* 6B */ C_MODRM+C_DATA1, 140 | /* 6C */ C_BAD, 141 | /* 6D */ C_BAD, 142 | /* 6E */ C_BAD, 143 | /* 6F */ C_BAD, 144 | /* 70 */ C_DATA1+C_REL+C_BAD, 145 | /* 71 */ C_DATA1+C_REL+C_BAD, 146 | /* 72 */ C_DATA1+C_REL, 147 | /* 73 */ C_DATA1+C_REL, 148 | /* 74 */ C_DATA1+C_REL, 149 | /* 75 */ C_DATA1+C_REL, 150 | /* 76 */ C_DATA1+C_REL, 151 | /* 77 */ C_DATA1+C_REL, 152 | /* 78 */ C_DATA1+C_REL, 153 | /* 79 */ C_DATA1+C_REL, 154 | /* 7A */ C_DATA1+C_REL+C_BAD, 155 | /* 7B */ C_DATA1+C_REL+C_BAD, 156 | /* 7C */ C_DATA1+C_REL, 157 | /* 7D */ C_DATA1+C_REL, 158 | /* 7E */ C_DATA1+C_REL, 159 | /* 7F */ C_DATA1+C_REL, 160 | /* 80 */ C_MODRM+C_DATA1, 161 | /* 81 */ C_MODRM+C_DATA66, 162 | /* 82 */ C_MODRM+C_DATA1+C_BAD, 163 | /* 83 */ C_MODRM+C_DATA1, 164 | /* 84 */ C_MODRM, 165 | /* 85 */ C_MODRM, 166 | /* 86 */ C_MODRM, 167 | /* 87 */ C_MODRM, 168 | /* 88 */ C_MODRM, 169 | /* 89 */ C_MODRM, 170 | /* 8A */ C_MODRM, 171 | /* 8B */ C_MODRM, 172 | /* 8C */ C_MODRM+C_BAD, 173 | /* 8D */ C_MODRM, 174 | /* 8E */ C_MODRM+C_BAD, 175 | /* 8F */ C_MODRM, 176 | /* 90 */ 0, 177 | /* 91 */ 0, 178 | /* 92 */ 0, 179 | /* 93 */ C_BAD, 180 | /* 94 */ C_BAD, 181 | /* 95 */ C_BAD, 182 | /* 96 */ C_BAD, 183 | /* 97 */ C_BAD, 184 | /* 98 */ C_BAD, 185 | /* 99 */ 0, 186 | /* 9A */ C_DATA66+C_DATA2+C_BAD, 187 | /* 9B */ 0, 188 | /* 9C */ C_BAD, 189 | /* 9D */ C_BAD, 190 | /* 9E */ C_BAD, 191 | /* 9F */ C_BAD, 192 | /* A0 */ C_ADDR67, 193 | /* A1 */ C_ADDR67, 194 | /* A2 */ C_ADDR67, 195 | /* A3 */ C_ADDR67, 196 | /* A4 */ 0, 197 | /* A5 */ 0, 198 | /* A6 */ 0, 199 | /* A7 */ 0, 200 | /* A8 */ C_DATA1, 201 | /* A9 */ C_DATA66, 202 | /* AA */ 0, 203 | /* AB */ 0, 204 | /* AC */ 0, 205 | /* AD */ C_BAD, 206 | /* AE */ 0, 207 | /* AF */ C_BAD, 208 | /* B0 */ C_DATA1, 209 | /* B1 */ C_DATA1, 210 | /* B2 */ C_DATA1, 211 | /* B3 */ C_DATA1, 212 | /* B4 */ C_DATA1, 213 | /* B5 */ C_DATA1, 214 | /* B6 */ C_DATA1+C_BAD, 215 | /* B7 */ C_DATA1+C_BAD, 216 | /* B8 */ C_DATA66, 217 | /* B9 */ C_DATA66, 218 | /* BA */ C_DATA66, 219 | /* BB */ C_DATA66, 220 | /* BC */ C_DATA66+C_BAD, 221 | /* BD */ C_DATA66, 222 | /* BE */ C_DATA66, 223 | /* BF */ C_DATA66, 224 | /* C0 */ C_MODRM+C_DATA1, 225 | /* C1 */ C_MODRM+C_DATA1, 226 | /* C2 */ C_DATA2+C_STOP, 227 | /* C3 */ C_STOP, 228 | /* C4 */ C_MODRM+C_BAD, 229 | /* C5 */ C_MODRM+C_BAD, 230 | /* C6 */ C_MODRM+C_DATA1, 231 | /* C7 */ C_MODRM+C_DATA66, 232 | /* C8 */ C_DATA2+C_DATA1, 233 | /* C9 */ 0, 234 | /* CA */ C_DATA2+C_STOP+C_BAD, 235 | /* CB */ C_STOP+C_BAD, 236 | /* CC */ C_BAD, 237 | /* CD */ C_BAD, 238 | /* CE */ C_BAD, 239 | /* CF */ C_STOP+C_BAD, 240 | /* D0 */ C_MODRM, 241 | /* D1 */ C_MODRM, 242 | /* D2 */ C_MODRM, 243 | /* D3 */ C_MODRM, 244 | /* D4 */ C_DATA1+C_BAD, 245 | /* D5 */ C_DATA1+C_BAD, 246 | /* D6 */ C_BAD, 247 | /* D7 */ C_BAD, 248 | /* D8 */ C_MODRM, 249 | /* D9 */ C_MODRM, 250 | /* DA */ C_MODRM, 251 | /* DB */ C_MODRM, 252 | /* DC */ C_MODRM, 253 | /* DD */ C_MODRM, 254 | /* DE */ C_MODRM, 255 | /* DF */ C_MODRM, 256 | /* E0 */ C_DATA1+C_REL+C_BAD, 257 | /* E1 */ C_DATA1+C_REL+C_BAD, 258 | /* E2 */ C_DATA1+C_REL, 259 | /* E3 */ C_DATA1+C_REL, 260 | /* E4 */ C_DATA1+C_BAD, 261 | /* E5 */ C_DATA1+C_BAD, 262 | /* E6 */ C_DATA1+C_BAD, 263 | /* E7 */ C_DATA1+C_BAD, 264 | /* E8 */ C_DATA66+C_REL, 265 | /* E9 */ C_DATA66+C_REL+C_STOP, 266 | /* EA */ C_DATA66+C_DATA2+C_BAD, 267 | /* EB */ C_DATA1+C_REL+C_STOP, 268 | /* EC */ C_BAD, 269 | /* ED */ C_BAD, 270 | /* EE */ C_BAD, 271 | /* EF */ C_BAD, 272 | /* F0 */ C_LOCK+C_BAD, 273 | /* F1 */ C_BAD, 274 | /* F2 */ C_REP, 275 | /* F3 */ C_REP, 276 | /* F4 */ C_BAD, 277 | /* F5 */ C_BAD, 278 | /* F6 */ C_MODRM, 279 | /* F7 */ C_MODRM, 280 | /* F8 */ 0, 281 | /* F9 */ 0, 282 | /* FA */ C_BAD, 283 | /* FB */ C_BAD, 284 | /* FC */ 0, 285 | /* FD */ 0, 286 | /* FE */ C_MODRM, 287 | /* FF */ C_MODRM, 288 | /* 00 */ C_MODRM, 289 | /* 01 */ C_MODRM, 290 | /* 02 */ C_MODRM, 291 | /* 03 */ C_MODRM, 292 | /* 04 */ C_ERROR, 293 | /* 05 */ C_ERROR, 294 | /* 06 */ 0, 295 | /* 07 */ C_ERROR, 296 | /* 08 */ 0, 297 | /* 09 */ 0, 298 | /* 0A */ 0, 299 | /* 0B */ 0, 300 | /* 0C */ C_ERROR, 301 | /* 0D */ C_ERROR, 302 | /* 0E */ C_ERROR, 303 | /* 0F */ C_ERROR, 304 | /* 10 */ C_ERROR, 305 | /* 11 */ C_ERROR, 306 | /* 12 */ C_ERROR, 307 | /* 13 */ C_ERROR, 308 | /* 14 */ C_ERROR, 309 | /* 15 */ C_ERROR, 310 | /* 16 */ C_ERROR, 311 | /* 17 */ C_ERROR, 312 | /* 18 */ C_ERROR, 313 | /* 19 */ C_ERROR, 314 | /* 1A */ C_ERROR, 315 | /* 1B */ C_ERROR, 316 | /* 1C */ C_ERROR, 317 | /* 1D */ C_ERROR, 318 | /* 1E */ C_ERROR, 319 | /* 1F */ C_ERROR, 320 | /* 20 */ C_ERROR, 321 | /* 21 */ C_ERROR, 322 | /* 22 */ C_ERROR, 323 | /* 23 */ C_ERROR, 324 | /* 24 */ C_ERROR, 325 | /* 25 */ C_ERROR, 326 | /* 26 */ C_ERROR, 327 | /* 27 */ C_ERROR, 328 | /* 28 */ C_ERROR, 329 | /* 29 */ C_ERROR, 330 | /* 2A */ C_ERROR, 331 | /* 2B */ C_ERROR, 332 | /* 2C */ C_ERROR, 333 | /* 2D */ C_ERROR, 334 | /* 2E */ C_ERROR, 335 | /* 2F */ C_ERROR, 336 | /* 30 */ C_ERROR, 337 | /* 31 */ C_ERROR, 338 | /* 32 */ C_ERROR, 339 | /* 33 */ C_ERROR, 340 | /* 34 */ C_ERROR, 341 | /* 35 */ C_ERROR, 342 | /* 36 */ C_ERROR, 343 | /* 37 */ C_ERROR, 344 | /* 38 */ C_ERROR, 345 | /* 39 */ C_ERROR, 346 | /* 3A */ C_ERROR, 347 | /* 3B */ C_ERROR, 348 | /* 3C */ C_ERROR, 349 | /* 3D */ C_ERROR, 350 | /* 3E */ C_ERROR, 351 | /* 3F */ C_ERROR, 352 | /* 40 */ C_ERROR, 353 | /* 41 */ C_ERROR, 354 | /* 42 */ C_ERROR, 355 | /* 43 */ C_ERROR, 356 | /* 44 */ C_ERROR, 357 | /* 45 */ C_ERROR, 358 | /* 46 */ C_ERROR, 359 | /* 47 */ C_ERROR, 360 | /* 48 */ C_ERROR, 361 | /* 49 */ C_ERROR, 362 | /* 4A */ C_ERROR, 363 | /* 4B */ C_ERROR, 364 | /* 4C */ C_ERROR, 365 | /* 4D */ C_ERROR, 366 | /* 4E */ C_ERROR, 367 | /* 4F */ C_ERROR, 368 | /* 50 */ C_ERROR, 369 | /* 51 */ C_ERROR, 370 | /* 52 */ C_ERROR, 371 | /* 53 */ C_ERROR, 372 | /* 54 */ C_ERROR, 373 | /* 55 */ C_ERROR, 374 | /* 56 */ C_ERROR, 375 | /* 57 */ C_ERROR, 376 | /* 58 */ C_ERROR, 377 | /* 59 */ C_ERROR, 378 | /* 5A */ C_ERROR, 379 | /* 5B */ C_ERROR, 380 | /* 5C */ C_ERROR, 381 | /* 5D */ C_ERROR, 382 | /* 5E */ C_ERROR, 383 | /* 5F */ C_ERROR, 384 | /* 60 */ C_ERROR, 385 | /* 61 */ C_ERROR, 386 | /* 62 */ C_ERROR, 387 | /* 63 */ C_ERROR, 388 | /* 64 */ C_ERROR, 389 | /* 65 */ C_ERROR, 390 | /* 66 */ C_ERROR, 391 | /* 67 */ C_ERROR, 392 | /* 68 */ C_ERROR, 393 | /* 69 */ C_ERROR, 394 | /* 6A */ C_ERROR, 395 | /* 6B */ C_ERROR, 396 | /* 6C */ C_ERROR, 397 | /* 6D */ C_ERROR, 398 | /* 6E */ C_ERROR, 399 | /* 6F */ C_ERROR, 400 | /* 70 */ C_ERROR, 401 | /* 71 */ C_ERROR, 402 | /* 72 */ C_ERROR, 403 | /* 73 */ C_ERROR, 404 | /* 74 */ C_ERROR, 405 | /* 75 */ C_ERROR, 406 | /* 76 */ C_ERROR, 407 | /* 77 */ C_ERROR, 408 | /* 78 */ C_ERROR, 409 | /* 79 */ C_ERROR, 410 | /* 7A */ C_ERROR, 411 | /* 7B */ C_ERROR, 412 | /* 7C */ C_ERROR, 413 | /* 7D */ C_ERROR, 414 | /* 7E */ C_ERROR, 415 | /* 7F */ C_ERROR, 416 | /* 80 */ C_DATA66+C_REL, 417 | /* 81 */ C_DATA66+C_REL, 418 | /* 82 */ C_DATA66+C_REL, 419 | /* 83 */ C_DATA66+C_REL, 420 | /* 84 */ C_DATA66+C_REL, 421 | /* 85 */ C_DATA66+C_REL, 422 | /* 86 */ C_DATA66+C_REL, 423 | /* 87 */ C_DATA66+C_REL, 424 | /* 88 */ C_DATA66+C_REL, 425 | /* 89 */ C_DATA66+C_REL, 426 | /* 8A */ C_DATA66+C_REL, 427 | /* 8B */ C_DATA66+C_REL, 428 | /* 8C */ C_DATA66+C_REL, 429 | /* 8D */ C_DATA66+C_REL, 430 | /* 8E */ C_DATA66+C_REL, 431 | /* 8F */ C_DATA66+C_REL, 432 | /* 90 */ C_MODRM, 433 | /* 91 */ C_MODRM, 434 | /* 92 */ C_MODRM, 435 | /* 93 */ C_MODRM, 436 | /* 94 */ C_MODRM, 437 | /* 95 */ C_MODRM, 438 | /* 96 */ C_MODRM, 439 | /* 97 */ C_MODRM, 440 | /* 98 */ C_MODRM, 441 | /* 99 */ C_MODRM, 442 | /* 9A */ C_MODRM, 443 | /* 9B */ C_MODRM, 444 | /* 9C */ C_MODRM, 445 | /* 9D */ C_MODRM, 446 | /* 9E */ C_MODRM, 447 | /* 9F */ C_MODRM, 448 | /* A0 */ 0, 449 | /* A1 */ 0, 450 | /* A2 */ 0, 451 | /* A3 */ C_MODRM, 452 | /* A4 */ C_MODRM+C_DATA1, 453 | /* A5 */ C_MODRM, 454 | /* A6 */ C_ERROR, 455 | /* A7 */ C_ERROR, 456 | /* A8 */ 0, 457 | /* A9 */ 0, 458 | /* AA */ 0, 459 | /* AB */ C_MODRM, 460 | /* AC */ C_MODRM+C_DATA1, 461 | /* AD */ C_MODRM, 462 | /* AE */ C_ERROR, 463 | /* AF */ C_MODRM, 464 | /* B0 */ C_MODRM, 465 | /* B1 */ C_MODRM, 466 | /* B2 */ C_MODRM, 467 | /* B3 */ C_MODRM, 468 | /* B4 */ C_MODRM, 469 | /* B5 */ C_MODRM, 470 | /* B6 */ C_MODRM, 471 | /* B7 */ C_MODRM, 472 | /* B8 */ C_ERROR, 473 | /* B9 */ C_ERROR, 474 | /* BA */ C_MODRM+C_DATA1, 475 | /* BB */ C_MODRM, 476 | /* BC */ C_MODRM, 477 | /* BD */ C_MODRM, 478 | /* BE */ C_MODRM, 479 | /* BF */ C_MODRM, 480 | /* C0 */ C_MODRM, 481 | /* C1 */ C_MODRM, 482 | /* C2 */ C_ERROR, 483 | /* C3 */ C_ERROR, 484 | /* C4 */ C_ERROR, 485 | /* C5 */ C_ERROR, 486 | /* C6 */ C_ERROR, 487 | /* C7 */ C_ERROR, 488 | /* C8 */ 0, 489 | /* C9 */ 0, 490 | /* CA */ 0, 491 | /* CB */ 0, 492 | /* CC */ 0, 493 | /* CD */ C_DATA1, 494 | /* CE */ 0, 495 | /* CF */ 0, 496 | /* D0 */ C_ERROR, 497 | /* D1 */ C_ERROR, 498 | /* D2 */ C_ERROR, 499 | /* D3 */ C_ERROR, 500 | /* D4 */ C_ERROR, 501 | /* D5 */ C_ERROR, 502 | /* D6 */ C_ERROR, 503 | /* D7 */ C_ERROR, 504 | /* D8 */ C_ERROR, 505 | /* D9 */ C_ERROR, 506 | /* DA */ C_ERROR, 507 | /* DB */ C_ERROR, 508 | /* DC */ C_ERROR, 509 | /* DD */ C_ERROR, 510 | /* DE */ C_ERROR, 511 | /* DF */ C_ERROR, 512 | /* E0 */ C_ERROR, 513 | /* E1 */ C_ERROR, 514 | /* E2 */ C_ERROR, 515 | /* E3 */ C_ERROR, 516 | /* E4 */ C_ERROR, 517 | /* E5 */ C_ERROR, 518 | /* E6 */ C_ERROR, 519 | /* E7 */ C_ERROR, 520 | /* E8 */ C_ERROR, 521 | /* E9 */ C_ERROR, 522 | /* EA */ C_ERROR, 523 | /* EB */ C_ERROR, 524 | /* EC */ C_ERROR, 525 | /* ED */ C_ERROR, 526 | /* EE */ C_ERROR, 527 | /* EF */ C_ERROR, 528 | /* F0 */ C_ERROR, 529 | /* F1 */ C_ERROR, 530 | /* F2 */ C_ERROR, 531 | /* F3 */ C_ERROR, 532 | /* F4 */ C_ERROR, 533 | /* F5 */ C_ERROR, 534 | /* F6 */ C_ERROR, 535 | /* F7 */ C_ERROR, 536 | /* F8 */ C_ERROR, 537 | /* F9 */ C_ERROR, 538 | /* FA */ C_ERROR, 539 | /* FB */ C_ERROR, 540 | /* FC */ C_ERROR, 541 | /* FD */ C_ERROR, 542 | /* FE */ C_ERROR, 543 | /* FF */ C_ERROR 544 | }; // ade32_table[] 545 | 546 | 547 | int disasm(BYTE* opcode0, disasm_struct* diza){ 548 | BYTE* opcode = opcode0; 549 | 550 | memset(diza, 0x00, sizeof(disasm_struct)); 551 | diza->disasm_defdata = 4; 552 | diza->disasm_defaddr = 4; 553 | 554 | if(*(WORD*)opcode == 0x0000) 555 | return 0; 556 | if(*(WORD*)opcode == 0xFFFF) 557 | return 0; 558 | 559 | DWORD flag = 0; 560 | 561 | repeat_prefix: 562 | 563 | BYTE c = *opcode++; 564 | DWORD t = ade32_table[ c ]; 565 | 566 | if(t & C_ANYPREFIX){ 567 | if(flag & t) 568 | return 0; 569 | 570 | flag |= t; 571 | 572 | if(t & C_67) 573 | diza->disasm_defaddr ^= 2^4; 574 | else if(t & C_66) 575 | diza->disasm_defdata ^= 2^4; 576 | else if(t & C_SEG) 577 | diza->disasm_seg = c; 578 | else if(t & C_REP) 579 | diza->disasm_rep = c; 580 | // LOCK 581 | 582 | goto repeat_prefix; 583 | } // C_ANYPREFIX 584 | 585 | flag |= t; 586 | diza->disasm_opcode = c; 587 | 588 | if(c == 0x0F){ 589 | c = *opcode++; 590 | diza->disasm_opcode2 = c; 591 | flag |= ade32_table[256+c]; // 2nd flagtable half 592 | 593 | if(flag == C_ERROR) 594 | return 0; 595 | }else if(c == 0xF7){ 596 | if(((*opcode) & 0x38) == 0) 597 | flag |= C_DATA66; 598 | }else if(c == 0xF6){ 599 | if(((*opcode) & 0x38) == 0) 600 | flag |= C_DATA1; 601 | }else if(c == 0xCD){ 602 | if(*opcode == 0x20) 603 | flag |= C_DATA4; 604 | } 605 | 606 | if(flag & C_MODRM){ 607 | c = *opcode++; 608 | diza->disasm_modrm = c; 609 | 610 | if(((c & 0x38) == 0x20) && (diza->disasm_opcode == 0xFF)) 611 | flag |= C_STOP; 612 | 613 | BYTE mod = c & 0xC0; 614 | BYTE rm = c & 0x07; 615 | 616 | if(mod != 0xC0){ 617 | if(diza->disasm_defaddr == 4){ 618 | if(rm == 4){ 619 | flag |= C_SIB; 620 | c = *opcode++; 621 | diza->disasm_sib = c; 622 | rm = c & 0x07; 623 | } 624 | 625 | if(mod == 0x40) 626 | flag |= C_ADDR1; 627 | else if(mod == 0x80) 628 | flag |= C_ADDR4; 629 | else if (rm == 5) 630 | flag |= C_ADDR4; 631 | }else{ // MODRM 16-bit 632 | if(mod == 0x40) 633 | flag |= C_ADDR1; 634 | else if(mod == 0x80) 635 | flag |= C_ADDR2; 636 | else if(rm == 6) 637 | flag |= C_ADDR2; 638 | } 639 | } 640 | } // C_MODRM 641 | 642 | diza->disasm_flag = flag; 643 | 644 | DWORD a = flag & (C_ADDR1 | C_ADDR2 | C_ADDR4); 645 | DWORD d = (flag & (C_DATA1 | C_DATA2 | C_DATA4)) >> 8; 646 | 647 | if(flag & C_ADDR67) 648 | a += diza->disasm_defaddr; 649 | if(flag & C_DATA66) 650 | d += diza->disasm_defdata; 651 | 652 | diza->disasm_addrsize = a; 653 | diza->disasm_datasize = d; 654 | 655 | DWORD i; 656 | for(i = 0; i < a; i++) 657 | diza->disasm_addr_b[i] = *opcode++; 658 | 659 | for(i = 0; i < d; i++) 660 | diza->disasm_data_b[i] = *opcode++; 661 | 662 | diza->disasm_len = opcode - opcode0; 663 | 664 | return diza->disasm_len; 665 | } // disasm() 666 | 667 | int oplen(BYTE *opcode){ 668 | disasm_struct diza; 669 | memset(&diza,0,sizeof(diza)); 670 | 671 | disasm((BYTE*)opcode,&diza); 672 | 673 | if((diza.disasm_flag == C_ERROR) || ((diza.disasm_flag&C_STOP) == C_STOP) || ((diza.disasm_flag&C_REL)==C_REL) || ((diza.disasm_flag&C_BAD)==C_BAD)) 674 | return -1; 675 | 676 | return diza.disasm_len; 677 | } 678 | -------------------------------------------------------------------------------- /code/ADE32.h: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | PROJECT: m0d_s0beit_sa 4 | LICENSE: See LICENSE in the top level directory 5 | COPYRIGHT: Copyright 2007, 2008, 2009, 2010 we_sux 6 | 7 | m0d_s0beit_sa is available from http://code.google.com/p/m0d-s0beit-sa/ 8 | 9 | m0d_s0beit_sa is free software: you can redistribute it and/or modify 10 | it under the terms of the GNU General Public License as published by 11 | the Free Software Foundation, either version 3 of the License, or 12 | (at your option) any later version. 13 | 14 | m0d_s0beit_sa is distributed in the hope that it will be useful, 15 | but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | GNU General Public License for more details. 18 | 19 | You should have received a copy of the GNU General Public License 20 | along with m0d_s0beit_sa. If not, see . 21 | 22 | */ 23 | 24 | // ADE32 v2.02c by z0mbie 25 | 26 | #ifndef __ADE32_H__ 27 | #define __ADE32_H__ 28 | 29 | #define C_ERROR 0xFFFFFFFF 30 | #define C_ADDR1 0x00000001 31 | #define C_ADDR2 0x00000002 32 | #define C_ADDR4 0x00000004 33 | #define C_LOCK 0x00000008 34 | #define C_67 0x00000010 35 | #define C_66 0x00000020 36 | #define C_REP 0x00000040 37 | #define C_SEG 0x00000080 38 | #define C_ANYPREFIX (C_66+C_67+C_LOCK+C_REP+C_SEG) 39 | #define C_DATA1 0x00000100 40 | #define C_DATA2 0x00000200 41 | #define C_DATA4 0x00000400 42 | #define C_SIB 0x00000800 43 | #define C_ADDR67 0x00001000 44 | #define C_DATA66 0x00002000 45 | #define C_MODRM 0x00004000 46 | #define C_BAD 0x00008000 47 | #define C_OPCODE2 0x00010000 48 | #define C_REL 0x00020000 49 | #define C_STOP 0x00040000 50 | 51 | #pragma pack(push) 52 | #pragma pack(1) 53 | 54 | struct disasm_struct { 55 | BYTE disasm_defaddr; // 00 56 | BYTE disasm_defdata; // 01 57 | DWORD disasm_len; // 02 03 04 05 58 | DWORD disasm_flag; // 06 07 08 09 59 | DWORD disasm_addrsize; // 0A 0B 0C 0D 60 | DWORD disasm_datasize; // 0E 0F 10 11 61 | BYTE disasm_rep; // 12 62 | BYTE disasm_seg; // 13 63 | BYTE disasm_opcode; // 14 64 | BYTE disasm_opcode2; // 15 65 | BYTE disasm_modrm; // 16 66 | BYTE disasm_sib; // 17 67 | 68 | union { 69 | BYTE disasm_addr_b[8]; // 18 19 1A 1B 1C 1D 1E 1F 70 | WORD disasm_addr_w[4]; 71 | DWORD disasm_addr_d[2]; 72 | char disasm_addr_c[8]; 73 | short disasm_addr_s[4]; 74 | long disasm_addr_l[2]; 75 | }; 76 | 77 | union { 78 | BYTE disasm_data_b[8]; // 20 21 22 23 24 25 26 27 79 | WORD disasm_data_w[4]; 80 | DWORD disasm_data_d[2]; 81 | char disasm_data_c[8]; 82 | short disasm_data_s[4]; 83 | long disasm_data_l[2]; 84 | }; 85 | }; // disasm_struct 86 | 87 | #pragma pack(pop) 88 | 89 | int disasm(BYTE* opcode0, disasm_struct* diza); 90 | int oplen(BYTE* opcode); 91 | 92 | #endif // __ADE32_H__ 93 | 94 | -------------------------------------------------------------------------------- /code/CDetour.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | PROJECT: m0d_s0beit_sa 4 | LICENSE: See LICENSE in the top level directory 5 | COPYRIGHT: Copyright 2007, 2008, 2009, 2010 we_sux 6 | 7 | m0d_s0beit_sa is available from http://code.google.com/p/m0d-s0beit-sa/ 8 | 9 | m0d_s0beit_sa is free software: you can redistribute it and/or modify 10 | it under the terms of the GNU General Public License as published by 11 | the Free Software Foundation, either version 3 of the License, or 12 | (at your option) any later version. 13 | 14 | m0d_s0beit_sa is distributed in the hope that it will be useful, 15 | but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | GNU General Public License for more details. 18 | 19 | You should have received a copy of the GNU General Public License 20 | along with m0d_s0beit_sa. If not, see . 21 | 22 | $LastChangedDate: 2009-12-14 01:12:56 -0600 (Mon, 14 Dec 2009) $ 23 | $LastChangedBy: futnucks $ 24 | $Revision: 31 $ 25 | $HeadURL: https://m0d-s0beit-sa.googlecode.com/svn/trunk/src/CDetour.cpp $ 26 | $Id: CDetour.cpp 31 2009-12-14 07:12:56Z futnucks $ 27 | 28 | */ 29 | 30 | #include 31 | #include "CDetour.h" 32 | 33 | 34 | void* CDetour::memcpy_s( void* pvAddress, const void* pvBuffer, size_t stLen ) 35 | { 36 | MEMORY_BASIC_INFORMATION mbi; 37 | VirtualQuery( pvAddress, &mbi, sizeof( mbi ) ); 38 | VirtualProtect( mbi.BaseAddress, mbi.RegionSize, PAGE_EXECUTE_READWRITE, &mbi.Protect ); 39 | void* pvRetn = memcpy( pvAddress, pvBuffer, stLen ); 40 | VirtualProtect( mbi.BaseAddress, mbi.RegionSize, mbi.Protect, &mbi.Protect ); 41 | FlushInstructionCache( GetCurrentProcess( ), pvAddress, stLen ); 42 | return pvRetn; 43 | } 44 | 45 | void *CDetour::Create(BYTE *orig, const BYTE *det, int iPatchType, int len) 46 | { 47 | BYTE *jmp = NULL; 48 | int iMinLen = 0; 49 | 50 | if(!(iMinLen = GetDetourLen(iPatchType))) 51 | return 0; 52 | 53 | if(len != 0 && len < iMinLen) 54 | return 0; 55 | 56 | // Try and find the end of the instruction automatically 57 | if(len == 0) 58 | { 59 | len = GetDetourLenAuto(orig, iMinLen); 60 | 61 | if(len < iMinLen) 62 | return 0; 63 | } 64 | 65 | if(!Detour(jmp, orig, det, iPatchType, len)) 66 | return 0; 67 | 68 | return (jmp-len); 69 | } 70 | 71 | void *CDetour::Create(char *dllName, char *apiName, const BYTE *det, int iPatchType, int len) 72 | { 73 | BYTE *jmp = NULL; 74 | BYTE *orig = NULL; 75 | int iMinLen = 0; 76 | 77 | if(!(iMinLen = GetDetourLen(iPatchType))) 78 | return 0; 79 | 80 | if(len != 0 && len < iMinLen) 81 | return 0; 82 | 83 | // Get the API address 84 | m_hModule = GetModuleHandle(dllName); 85 | m_dwAddress = (DWORD)GetProcAddress(m_hModule, apiName); 86 | 87 | if(!m_dwAddress || !det) 88 | return 0; 89 | 90 | orig = (BYTE*)m_dwAddress; 91 | 92 | // Try and find the end of the instruction automatically 93 | if(len == 0) 94 | { 95 | len = GetDetourLenAuto(orig, iMinLen); 96 | 97 | if(len < iMinLen) 98 | return 0; 99 | } 100 | 101 | if(!Detour(jmp, orig, det, iPatchType, len)) 102 | return 0; 103 | 104 | return (jmp-len); 105 | } 106 | 107 | bool CDetour::Detour(BYTE *&jmp, BYTE *&orig, const BYTE *&det, int iPatchType, int len) 108 | { 109 | DWORD dwBack = 0; 110 | int i = 0; 111 | BYTE *pPatchBuf = NULL; 112 | 113 | // Allocate space for the jump 114 | jmp = (BYTE*)malloc(len+5); 115 | 116 | // Force page protection flags to read|write 117 | MEMORY_BASIC_INFORMATION mbi; 118 | VirtualQuery( ( void* )orig, &mbi, sizeof( mbi ) ); 119 | VirtualProtect( mbi.BaseAddress, mbi.RegionSize, PAGE_READWRITE, &mbi.Protect ); 120 | 121 | // Copy the overwritten opcodes at the original to the malloced space 122 | memcpy(jmp, orig, len); 123 | 124 | // Increment to the end of the opcodes at the malloced space 125 | jmp += len; 126 | 127 | // Place a jump back to the original at this point 128 | jmp[0] = 0xE9; 129 | *(DWORD*)(jmp+1) = (DWORD)(orig+len - jmp) - 5; 130 | 131 | // Generate a random opcode 132 | int iTmpRnd = (rand() * 0xFF) + rand(); 133 | BYTE bTmpRnd = (BYTE)iTmpRnd; 134 | 135 | // Place a jump at the original to the detour function 136 | pPatchBuf = new BYTE[len]; 137 | 138 | // Pad out the bytes with NOPs so we don't have ends of intructions 139 | memset(pPatchBuf, 0x90, len); 140 | 141 | // Write the opcodes to the buffer according to patch type 142 | switch(iPatchType) 143 | { 144 | case DETOUR_TYPE_JMP: 145 | pPatchBuf[0] = '\xE9'; 146 | *(DWORD*)&pPatchBuf[1] = (DWORD)(det - orig) - 5; 147 | break; 148 | 149 | case DETOUR_TYPE_PUSH_RET: 150 | pPatchBuf[0] = '\x68'; 151 | *(DWORD*)&pPatchBuf[1] = (DWORD)det; 152 | pPatchBuf[5] = '\xC3'; 153 | break; 154 | 155 | case DETOUR_TYPE_PUSH_FUNC: 156 | pPatchBuf[0] = '\x68'; 157 | *(DWORD*)&pPatchBuf[1] = (DWORD)det; 158 | break; 159 | 160 | case DETOUR_TYPE_CALL_FUNC: 161 | pPatchBuf[0] = '\xE8'; 162 | *(DWORD*)&pPatchBuf[1] = (DWORD)(det - orig) - 5; 163 | break; 164 | 165 | default: 166 | return false; 167 | } 168 | 169 | // Write the detour 170 | for(i=0; i. 21 | 22 | $LastChangedDate: 2009-12-14 01:12:56 -0600 (Mon, 14 Dec 2009) $ 23 | $LastChangedBy: futnucks $ 24 | $Revision: 31 $ 25 | $HeadURL: https://m0d-s0beit-sa.googlecode.com/svn/trunk/src/CDetour.h $ 26 | $Id: CDetour.h 31 2009-12-14 07:12:56Z futnucks $ 27 | 28 | */ 29 | 30 | /* 31 | CDetour 2.0 by Sinner, don't forget to credit me! 32 | 33 | Credits: 34 | LanceVorgin (his CDetour class) + z0mbie (ADE32) 35 | */ 36 | 37 | /* 38 | Type: Opcodes needed: 39 | DETOUR_TYPE_JMP: 5 40 | DETOUR_TYPE_PUSH_RET 6 41 | DETOUR_TYPE_NOP_JMP 6 42 | DETOUR_TYPE_NOP_NOP_JMP 7 43 | DETOUR_TYPE_STC_JC 7 44 | DETOUR_TYPE_CLC_JNC 7 45 | DETOUR_TYPE_OBS_ADD 12 46 | DETOUR_TYPE_OBS_STACKADD 13 47 | DETOUR_TYPE_OBS_ROR 13 48 | DETOUR_TYPE_OBS_XOR 14 49 | DETOUR_TYPE_OBS_ADDNOT 14 50 | */ 51 | 52 | #pragma once 53 | 54 | #pragma warning(disable: 4311) 55 | #pragma warning(disable: 4312) 56 | 57 | #include "ADE32.h" 58 | #include 59 | 60 | typedef enum detour_types_s 61 | { 62 | DETOUR_TYPE_NOT_SET = -1, 63 | DETOUR_TYPE_JMP, 64 | DETOUR_TYPE_PUSH_RET, 65 | DETOUR_TYPE_PUSH_FUNC, 66 | DETOUR_TYPE_CALL_FUNC, 67 | 68 | } detour_types_t; 69 | 70 | #define DetourRandTypeLow DETOUR_TYPE_OBS_ADD 71 | #define DetourRandTypeHigh DETOUR_TYPE_OBS_ADDNOT 72 | 73 | class CDetour 74 | { 75 | public: 76 | void* memcpy_s( void* pvAddress, const void* pvBuffer, size_t stLen ); 77 | void *Create(BYTE *orig, const BYTE *det, int iPatchType, int len=0); 78 | void *Create(char *dllName, char *apiName, const BYTE *det, int iPatchType, int len=0); 79 | bool Remove(BYTE *orig, BYTE *jmp, int iPatchType, int len=0); 80 | bool Remove(char *dllName, char *apiName, BYTE *jmp, int iPatchType, int len=0); 81 | bool BackupFunction( BYTE* func, int len ); 82 | bool RestoreFunction( BYTE* func, int len ); 83 | BYTE bBackup[20]; 84 | 85 | private: 86 | bool Detour(BYTE *&jmp, BYTE *&orig, const BYTE *&det, int iPatchType, int len); 87 | int GetDetourLen(int iPatchType); 88 | int GetDetourLenAuto(BYTE *&orig, int iMinLen); 89 | 90 | private: 91 | HMODULE m_hModule; 92 | DWORD m_dwAddress; 93 | }; 94 | 95 | -------------------------------------------------------------------------------- /code/dllmain.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | void perform_ut3_patches(); 3 | BOOL WINAPI DllMain( 4 | HINSTANCE hinstDLL, // handle to DLL module 5 | DWORD fdwReason, // reason for calling function 6 | LPVOID lpReserved) // reserved 7 | { 8 | // Perform actions based on the reason for calling. 9 | switch (fdwReason) 10 | { 11 | case DLL_PROCESS_ATTACH: 12 | // Initialize once for each new process. 13 | 14 | perform_ut3_patches(); 15 | // Return FALSE to fail DLL load. 16 | break; 17 | 18 | case DLL_THREAD_ATTACH: 19 | // Do thread-specific initialization. 20 | break; 21 | 22 | case DLL_THREAD_DETACH: 23 | // Do thread-specific cleanup. 24 | break; 25 | 26 | case DLL_PROCESS_DETACH: 27 | // Perform any necessary cleanup. 28 | break; 29 | } 30 | return TRUE; // Successful DLL_PROCESS_ATTACH. 31 | } 32 | 33 | 34 | -------------------------------------------------------------------------------- /code/input_proxy.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | // global variables 4 | typedef HRESULT (__stdcall *DINPUT8_CREATE_FUNC) (HINSTANCE hinst, DWORD dwVersion, const IID* riidltf, LPVOID* ppvOut, LPUNKNOWN punkOuter); 5 | 6 | #pragma data_seg (".dinput8_shared") 7 | HINSTANCE gl_hOriginalDll; 8 | HINSTANCE gl_hThisInstance; 9 | #pragma data_seg () 10 | 11 | void LoadOriginalDll(void); 12 | 13 | 14 | HRESULT __stdcall DirectInput8Create( 15 | HINSTANCE hinst, DWORD dwVersion, const IID* riidltf, LPVOID* ppvOut, LPUNKNOWN punkOuter 16 | ) { 17 | if (!gl_hOriginalDll) LoadOriginalDll(); 18 | 19 | 20 | DINPUT8_CREATE_FUNC funcAddress_DirectInput8Create = (DINPUT8_CREATE_FUNC)GetProcAddress(gl_hOriginalDll, "DirectInput8Create"); 21 | 22 | 23 | //char dumb_msg[1024]; 24 | //sprintf_s(dumb_msg, sizeof(dumb_msg), "func pointer is: %p, thread: %d\n", funcAddress_DirectInput8Create, GetCurrentThreadId()); 25 | //MessageBoxA(NULL, dumb_msg, "Injected", MB_OK); 26 | 27 | if (!funcAddress_DirectInput8Create) 28 | { 29 | OutputDebugString("PROXYDLL: Pointer to original DirectInput8Create function not received ERROR ****\r\n"); 30 | ::ExitProcess(0); // exit the hard way 31 | } 32 | 33 | return funcAddress_DirectInput8Create(hinst, dwVersion, riidltf, ppvOut, punkOuter); 34 | } 35 | 36 | void LoadOriginalDll(void) 37 | { 38 | char buffer[MAX_PATH]; 39 | 40 | // Getting path to system dir and to d3d8.dll 41 | ::GetSystemDirectory(buffer, MAX_PATH); 42 | 43 | // Append dll name 44 | strcat_s(buffer, sizeof(buffer), "\\dinput8.dll"); 45 | 46 | // try to load the system's d3d9.dll, if pointer empty 47 | if (!gl_hOriginalDll) gl_hOriginalDll = ::LoadLibrary(buffer); 48 | // Debug 49 | if (!gl_hOriginalDll) 50 | { 51 | OutputDebugString("PROXYDLL: Original d3d9.dinput8 not loaded ERROR ****\r\n"); 52 | ::ExitProcess(0); // exit the hard way 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /code/patches.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #include "CDetour.h" 5 | #define EXE_BASE_ADDRESS 0x400000 6 | 7 | void GSMD5Print(unsigned char digest[16], char output[33]) 8 | { 9 | static const char hex_digits[] = "0123456789abcdef"; 10 | unsigned int i; 11 | 12 | for (i = 0; i < 16; i++) 13 | { 14 | output[i * 2] = hex_digits[digest[i] / 16]; 15 | output[i * 2 + 1] = hex_digits[digest[i] % 16]; 16 | } 17 | output[32] = '\0'; 18 | } 19 | 20 | 21 | void write_string_offset(void* address, int string_len, const char* string) { 22 | 23 | void* write_address = (void*)((ptrdiff_t) (ptrdiff_t)address); 24 | DWORD oldProtect; 25 | 26 | BOOL success = VirtualProtect(write_address, string_len, PAGE_READWRITE, &oldProtect); 27 | 28 | 29 | assert(success); 30 | SIZE_T numWritten = 0; 31 | success = WriteProcessMemory(GetCurrentProcess(), write_address, string, string_len, &numWritten); 32 | assert(success); 33 | 34 | DWORD protect; 35 | success = VirtualProtect(write_address, string_len, oldProtect, &protect); 36 | 37 | assert(success); 38 | 39 | } 40 | void perform_ut3_patches() { 41 | write_string_offset((void*)0x01D2AE70, 17, "gpsp.openspy.net"); //updated 42 | 43 | write_string_offset((void*)0x01D2A738, 17, "gpcm.openspy.net"); //updated 44 | write_string_offset((void*)0x01D27DB8, 25, "%s.available.openspy.net"); //updated 45 | write_string_offset((void*)0x01D2E18C, 20, "%s.ms%d.openspy.net"); //updated 46 | 47 | write_string_offset((void*)0x01B3D338, 64, "http://%s.sake.openspy.net/SakeStorageServer/StorageServer.asmx"); //updated 48 | write_string_offset((void*)0x01D27CA0, 64, "http://%s.sake.openspy.net/SakeStorageServer/StorageServer.asmx"); //new 49 | write_string_offset((void*)0x01B3D3E8, 77, "http://%s.comp.pubsvs.openspy.net/CompetitionService/CompetitionService.asmx"); //updated 50 | write_string_offset((void*)0x01D27AD0, 77, "http://%s.comp.pubsvs.openspy.net/CompetitionService/CompetitionService.asmx"); //new 51 | write_string_offset((void*)0x01D29634, 22, "%s.master.openspy.net"); //updated 52 | write_string_offset((void*)0x01D27E90, 22, "http://motd.openspy.net/motd/motd.asp"); //updated 53 | write_string_offset((void*)0x01D27E28, 42, "http://motd.openspy.net/motd/vercheck.asp"); //updated 54 | write_string_offset((void*)0x01D27F08, 42, "http://motd.openspy.net/motd/vercheck.asp"); //new 55 | 56 | write_string_offset((void*)0x01D27380, 64, "http://%s.auth.pubsvs.openspy.net/AuthService/AuthService.asmx\x00"); //updated 57 | 58 | write_string_offset((void*)0x01B47550, 257, "afb5818995b3708d0656a5bdd20760aee76537907625f6d23f40bf17029e56808d36966c0804e1d797e310fedd8c06e6c4121d963863d765811fc9baeb2315c9a6eaeb125fad694d9ea4d4a928f223d9f4514533f18a5432dd0435c5c6ac8e276cf29489cb5ac880f16b0d7832ee927d4e27d622d6a450cd1560d7fa882c6c13"); //updated 59 | 60 | CDetour detour; 61 | 62 | if (detour.Create((BYTE*)0x01243B08, (const BYTE*)GSMD5Print, DETOUR_TYPE_CALL_FUNC, 5) == 0) { 63 | OutputDebugString("Failed to detour GSMD5Print (#1)"); 64 | ::ExitProcess(0); // exit the hard way 65 | } 66 | 67 | if (detour.Create((BYTE*)0x0123E9B2, (const BYTE*)GSMD5Print, DETOUR_TYPE_CALL_FUNC, 5) == 0) { 68 | OutputDebugString("Failed to detour GSMD5Print (#2)"); 69 | ::ExitProcess(0); // exit the hard way 70 | } 71 | 72 | if (detour.Create((BYTE*)0x0123D33A, (const BYTE*)GSMD5Print, DETOUR_TYPE_CALL_FUNC, 5) == 0) { 73 | OutputDebugString("Failed to detour GSMD5Print (#3)"); 74 | ::ExitProcess(0); // exit the hard way 75 | } 76 | } -------------------------------------------------------------------------------- /code/ut3proxy.def: -------------------------------------------------------------------------------- 1 | LIBRARY "dinput8" 2 | EXPORTS 3 | DirectInput8Create @1 4 | ; DllCanUnloadNow @2 5 | ; DllGetClassObject @3 6 | ; DllRegisterServer @4 7 | ; DllUnregisterServer @5 8 | ; GetdfDIJoystick @6 -------------------------------------------------------------------------------- /ut3proxy.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.4.33122.133 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ut3proxy", "ut3proxy.vcxproj", "{664071AC-98F1-482E-98E3-A17B40E5C56C}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|x64 = Debug|x64 11 | Debug|x86 = Debug|x86 12 | Release|x64 = Release|x64 13 | Release|x86 = Release|x86 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {664071AC-98F1-482E-98E3-A17B40E5C56C}.Debug|x64.ActiveCfg = Debug|x64 17 | {664071AC-98F1-482E-98E3-A17B40E5C56C}.Debug|x64.Build.0 = Debug|x64 18 | {664071AC-98F1-482E-98E3-A17B40E5C56C}.Debug|x86.ActiveCfg = Debug|Win32 19 | {664071AC-98F1-482E-98E3-A17B40E5C56C}.Debug|x86.Build.0 = Debug|Win32 20 | {664071AC-98F1-482E-98E3-A17B40E5C56C}.Release|x64.ActiveCfg = Release|x64 21 | {664071AC-98F1-482E-98E3-A17B40E5C56C}.Release|x64.Build.0 = Release|x64 22 | {664071AC-98F1-482E-98E3-A17B40E5C56C}.Release|x86.ActiveCfg = Release|Win32 23 | {664071AC-98F1-482E-98E3-A17B40E5C56C}.Release|x86.Build.0 = Release|Win32 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | GlobalSection(ExtensibilityGlobals) = postSolution 29 | SolutionGuid = {4CC3348F-5911-4D87-85C1-D752F6EDFE74} 30 | EndGlobalSection 31 | EndGlobal 32 | -------------------------------------------------------------------------------- /ut3proxy.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 16.0 23 | Win32Proj 24 | {664071ac-98f1-482e-98e3-a17b40e5c56c} 25 | ut3proxy 26 | 10.0 27 | 28 | 29 | 30 | DynamicLibrary 31 | true 32 | v143 33 | MultiByte 34 | 35 | 36 | DynamicLibrary 37 | false 38 | v143 39 | true 40 | MultiByte 41 | 42 | 43 | DynamicLibrary 44 | true 45 | v143 46 | MultiByte 47 | 48 | 49 | Application 50 | false 51 | v143 52 | true 53 | Unicode 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | Level3 76 | true 77 | WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 78 | true 79 | 80 | 81 | Windows 82 | true 83 | code/ut3proxy.def 84 | $(OutDir)dinput8$(TargetExt) 85 | 86 | 87 | 88 | 89 | Level3 90 | true 91 | true 92 | true 93 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 94 | true 95 | MultiThreaded 96 | 97 | 98 | Console 99 | true 100 | true 101 | false 102 | $(OutDir)dinput8$(TargetExt) 103 | code/ut3proxy.def 104 | 105 | 106 | 107 | 108 | Level3 109 | true 110 | _DEBUG;_CONSOLE;%(PreprocessorDefinitions) 111 | true 112 | 113 | 114 | Console 115 | true 116 | code/ut3proxy.def 117 | 118 | 119 | 120 | 121 | Level3 122 | true 123 | true 124 | true 125 | NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 126 | true 127 | 128 | 129 | Console 130 | true 131 | true 132 | true 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | -------------------------------------------------------------------------------- /ut3proxy.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | Source Files 23 | 24 | 25 | Source Files 26 | 27 | 28 | Source Files 29 | 30 | 31 | Source Files 32 | 33 | 34 | 35 | 36 | Source Files 37 | 38 | 39 | --------------------------------------------------------------------------------