json.c (19006B)
1 /* 2 Copyright (c) 2014. The YARA Authors. All Rights Reserved. 3 Redistribution and use in source and binary forms, with or without modification, 4 are permitted provided that the following conditions are met: 5 1. Redistributions of source code must retain the above copyright notice, this 6 list of conditions and the following disclaimer. 7 2. Redistributions in binary form must reproduce the above copyright notice, 8 this list of conditions and the following disclaimer in the documentation and/or 9 other materials provided with the distribution. 10 3. Neither the name of the copyright holder nor the names of its contributors 11 may be used to endorse or promote products derived from this software without 12 specific prior written permission. 13 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 14 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 15 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 16 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 17 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 18 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 19 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 20 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 22 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 */ 24 25 #include <jansson.h> 26 #include <stdio.h> 27 #include <yara/modules.h> 28 #include <yara/globals.h> 29 #include <string.h> 30 31 #define MODULE_NAME json 32 33 // Ensures Key exists in JSON 34 define_function(key_exists) 35 { 36 char *key = strdup(string_argument(1)); 37 38 json_t *json = yr_module()->data; 39 if (json == NULL) 40 { 41 return_integer(0); 42 } 43 44 // Split key into possible subcomponents - separated by '.' 45 json_t *iter = json; 46 char *token = strtok(key, "."); 47 char previousChar = '\0'; 48 char *realToken = strdup(token); 49 while (token != NULL) 50 { 51 previousChar = token[strlen(token)-1]; 52 if (previousChar == '\\') { 53 realToken[strlen(realToken)-1] = '.'; 54 token = strtok(NULL, "."); 55 strcat(realToken, token); 56 } 57 58 iter = json_object_get(iter, realToken); 59 if (iter == NULL) 60 { 61 return_integer(0); 62 } 63 token = strtok(NULL, "."); 64 if (token != NULL) { 65 strcpy(realToken, token); 66 } 67 } 68 69 free(key); 70 free(token); 71 free(realToken); 72 73 return_integer(1); 74 } 75 76 // Assert String value 77 define_function(value_exists_string) 78 { 79 char *key = strdup(string_argument(1)); 80 char *value = strdup(string_argument(2)); 81 82 json_t *json = yr_module()->data; 83 if (json == NULL) 84 { 85 return_integer(0); 86 } 87 88 // Split key into possible subcomponents - separated by '.' 89 json_t *iter = json; 90 char *token = strtok(key, "."); 91 char *prevToken = strdup(token); 92 char previousChar = '\0'; 93 char *realToken = strdup(token); 94 95 while (token != NULL) 96 { 97 previousChar = token[strlen(token)-1]; 98 if (previousChar == '\\') { 99 realToken[strlen(realToken)-1] = '.'; 100 token = strtok(NULL, "."); 101 strcat(realToken, token); 102 } 103 104 iter = json_object_get(iter, realToken); 105 if (iter == NULL) 106 { 107 return_integer(0); 108 } 109 110 strcpy(prevToken, token); 111 token = strtok(NULL, "."); 112 if (token != NULL) { 113 strcpy(realToken, token); 114 } 115 } 116 117 const char *found = json_string_value(iter); 118 if (found == NULL) 119 { 120 printf("no string value could be obtained from value at key\n"); 121 return_integer(0); 122 } 123 124 if (strcmp(found, value) != 0) 125 { 126 return_integer(0); 127 } 128 free(key); 129 free(value); 130 free(prevToken); 131 free(token); 132 free(realToken); 133 134 return_integer(1); 135 } 136 137 // Assert Integer value 138 define_function(value_exists_integer) 139 { 140 char *key = strdup(string_argument(1)); 141 int value = integer_argument(2); 142 143 json_t *json = yr_module()->data; 144 if (json == NULL) 145 { 146 return_integer(0); 147 } 148 149 // Split key into possible subcomponents - separated by '.' 150 json_t *iter = json; 151 char *token = strtok(key, "."); 152 char *prevToken = strdup(token); 153 char previousChar = '\0'; 154 char *realToken = strdup(token); 155 156 while (token != NULL) 157 { 158 previousChar = token[strlen(token)-1]; 159 if (previousChar == '\\') { 160 realToken[strlen(realToken)-1] = '.'; 161 token = strtok(NULL, "."); 162 strcat(realToken, token); 163 } 164 165 iter = json_object_get(iter, realToken); 166 if (iter == NULL) 167 { 168 return_integer(0); 169 } 170 171 strcpy(prevToken, token); 172 token = strtok(NULL, "."); 173 if (token != NULL) { 174 strcpy(realToken, token); 175 } 176 } 177 178 double foundNumber = json_number_value(iter); 179 if (foundNumber == 0.0) 180 { 181 printf("no number value could be obtained from value at key\n"); 182 return_integer(0); 183 } 184 int found = (int)foundNumber; 185 186 if (found != value) 187 { 188 return_integer(0); 189 } 190 free(key); 191 free(prevToken); 192 free(token); 193 free(realToken); 194 195 return_integer(1); 196 } 197 198 // Assert Regex value 199 define_function(value_exists_regex) 200 { 201 YR_SCAN_CONTEXT *context = yr_scan_context(); 202 char *key = strdup(string_argument(1)); 203 RE *value = regexp_argument(2); 204 205 json_t *json = yr_module()->data; 206 if (json == NULL) 207 { 208 return_integer(0); 209 } 210 211 // Split key into possible subcomponents - separated by '.' 212 json_t *iter = json; 213 char *token = strtok(key, "."); 214 char *prevToken = strdup(token); 215 char previousChar = '\0'; 216 char *realToken = strdup(token); 217 218 while (token != NULL) 219 { 220 previousChar = token[strlen(token)-1]; 221 if (previousChar == '\\') { 222 realToken[strlen(realToken)-1] = '.'; 223 token = strtok(NULL, "."); 224 strcat(realToken, token); 225 } 226 227 iter = json_object_get(iter, realToken); 228 if (iter == NULL) 229 { 230 return_integer(0); 231 } 232 233 strcpy(prevToken, token); 234 token = strtok(NULL, "."); 235 if (token != NULL) { 236 strcpy(realToken, token); 237 } 238 } 239 240 const char *found = json_string_value(iter); 241 if (found == NULL) 242 { 243 printf("no string value could be obtained from value at key\n"); 244 return_integer(0); 245 } 246 if (yr_re_match(context, value, found) <= 0) 247 { 248 return_integer(0); 249 } 250 251 free(key); 252 free(prevToken); 253 free(token); 254 free(realToken); 255 256 return_integer(1); 257 } 258 259 // Assert Float value 260 define_function(value_exists_float) 261 { 262 char *key = strdup(string_argument(1)); 263 double value = float_argument(2); 264 265 json_t *json = yr_module()->data; 266 if (json == NULL) 267 { 268 return_integer(0); 269 } 270 271 // Split key into possible subcomponents - separated by '.' 272 json_t *iter = json; 273 char *token = strtok(key, "."); 274 char *prevToken = strdup(token); 275 char previousChar = '\0'; 276 char *realToken = strdup(token); 277 278 while (token != NULL) 279 { 280 previousChar = token[strlen(token)-1]; 281 if (previousChar == '\\') { 282 realToken[strlen(realToken)-1] = '.'; 283 token = strtok(NULL, "."); 284 strcat(realToken, token); 285 } 286 287 iter = json_object_get(iter, realToken); 288 if (iter == NULL) 289 { 290 return_integer(0); 291 } 292 293 strcpy(prevToken, token); 294 token = strtok(NULL, "."); 295 if (token != NULL) { 296 strcpy(realToken, token); 297 } 298 } 299 300 double found = json_number_value(iter); 301 if (found == 0.0) 302 { 303 printf("no number value could be obtained from value at key\n"); 304 return_integer(0); 305 } 306 307 if (found != value) 308 { 309 return_integer(0); 310 } 311 free(key); 312 free(prevToken); 313 free(token); 314 free(realToken); 315 316 return_integer(1); 317 } 318 319 // String Array includes 320 define_function(string_array_includes) 321 { 322 char *key = strdup(string_argument(1)); 323 char *value = strdup(string_argument(2)); 324 325 json_t *json = yr_module()->data; 326 if (json == NULL) 327 { 328 return_integer(0); 329 } 330 331 // Split key into possible subcomponents - separated by '.' 332 json_t *iter = json; 333 char *token = strtok(key, "."); 334 char *prevToken = strdup(token); 335 char previousChar = '\0'; 336 char *realToken = strdup(token); 337 338 while (token != NULL) 339 { 340 previousChar = token[strlen(token)-1]; 341 if (previousChar == '\\') { 342 realToken[strlen(realToken)-1] = '.'; 343 token = strtok(NULL, "."); 344 strcat(realToken, token); 345 } 346 347 iter = json_object_get(iter, realToken); 348 if (iter == NULL) 349 { 350 return_integer(0); 351 } 352 353 strcpy(prevToken, token); 354 token = strtok(NULL, "."); 355 if (token != NULL) { 356 strcpy(realToken, token); 357 } 358 } 359 360 json_t *array = iter; 361 bool isArray = json_is_array(array); 362 if (!isArray) 363 { 364 return_integer(0); 365 } 366 367 size_t index; 368 json_t *val; 369 370 json_array_foreach(array, index, val) 371 { 372 json_t *element = json_array_get(array, index); 373 const char *found = json_string_value(element); 374 if (strcmp(found, value) == 0) 375 { 376 return_integer(1); 377 } 378 } 379 380 free(array); 381 free(key); 382 free(value); 383 free(prevToken); 384 free(token); 385 free(realToken); 386 387 return_integer(0); 388 } 389 390 // Integer Array includes 391 define_function(integer_array_includes) 392 { 393 char *key = strdup(string_argument(1)); 394 int value = integer_argument(2); 395 396 json_t *json = yr_module()->data; 397 if (json == NULL) 398 { 399 return_integer(0); 400 } 401 402 // Split key into possible subcomponents - separated by '.' 403 json_t *iter = json; 404 char *token = strtok(key, "."); 405 char *prevToken = strdup(token); 406 char previousChar = '\0'; 407 char *realToken = strdup(token); 408 409 while (token != NULL) 410 { 411 previousChar = token[strlen(token)-1]; 412 if (previousChar == '\\') { 413 realToken[strlen(realToken)-1] = '.'; 414 token = strtok(NULL, "."); 415 strcat(realToken, token); 416 } 417 418 iter = json_object_get(iter, realToken); 419 if (iter == NULL) 420 { 421 return_integer(0); 422 } 423 424 strcpy(prevToken, token); 425 token = strtok(NULL, "."); 426 if (token != NULL) { 427 strcpy(realToken, token); 428 } 429 } 430 431 json_t *array = iter; 432 bool isArray = json_is_array(array); 433 434 size_t index; 435 json_t *val; 436 437 json_array_foreach(array, index, val) 438 { 439 json_t *element = json_array_get(array, index); 440 double foundNumber = json_number_value(element); 441 if (foundNumber == 0.0) 442 { 443 printf("no number value could be obtained from value at key\n"); 444 return_integer(0); 445 } 446 int found = (int)foundNumber; 447 448 if (found == value) 449 { 450 return_integer(1); 451 } 452 } 453 454 free(array); 455 free(key); 456 free(prevToken); 457 free(token); 458 free(realToken); 459 460 return_integer(0); 461 } 462 463 // Float Array includes 464 define_function(float_array_includes) 465 { 466 char *key = strdup(string_argument(1)); 467 double value = float_argument(2); 468 469 json_t *json = yr_module()->data; 470 if (json == NULL) 471 { 472 return_integer(0); 473 } 474 475 // Split key into possible subcomponents - separated by '.' 476 json_t *iter = json; 477 char *token = strtok(key, "."); 478 char *prevToken = strdup(token); 479 char previousChar = '\0'; 480 char *realToken = strdup(token); 481 482 while (token != NULL) 483 { 484 previousChar = token[strlen(token)-1]; 485 if (previousChar == '\\') { 486 realToken[strlen(realToken)-1] = '.'; 487 token = strtok(NULL, "."); 488 strcat(realToken, token); 489 } 490 491 iter = json_object_get(iter, realToken); 492 if (iter == NULL) 493 { 494 return_integer(0); 495 } 496 497 strcpy(prevToken, token); 498 token = strtok(NULL, "."); 499 if (token != NULL) { 500 strcpy(realToken, token); 501 } 502 } 503 504 json_t *array = iter; 505 bool isArray = json_is_array(array); 506 507 size_t index; 508 json_t *val; 509 510 json_array_foreach(array, index, val) 511 { 512 json_t *element = json_array_get(array, index); 513 double found = json_number_value(element); 514 if (found == 0.0) 515 { 516 printf("no number value could be obtained from value at key\n"); 517 return_integer(0); 518 } 519 520 if (found == value) 521 { 522 return_integer(1); 523 } 524 } 525 526 free(array); 527 free(key); 528 free(prevToken); 529 free(token); 530 free(realToken); 531 532 return_integer(0); 533 } 534 535 // Get String value 536 define_function(string_get_value) 537 { 538 char *key = strdup(string_argument(1)); 539 540 json_t *json = yr_module()->data; 541 if (json == NULL) 542 { 543 return_string(YR_UNDEFINED); 544 } 545 546 // Split key into possible subcomponents - separated by '.' 547 json_t *iter = json; 548 char *token = strtok(key, "."); 549 char *prevToken = strdup(token); 550 char previousChar = '\0'; 551 char *realToken = strdup(token); 552 553 while (token != NULL) 554 { 555 previousChar = token[strlen(token)-1]; 556 if (previousChar == '\\') { 557 realToken[strlen(realToken)-1] = '.'; 558 token = strtok(NULL, "."); 559 strcat(realToken, token); 560 } 561 562 iter = json_object_get(iter, realToken); 563 if (iter == NULL) 564 { 565 return_string(YR_UNDEFINED); 566 } 567 568 strcpy(prevToken, token); 569 token = strtok(NULL, "."); 570 if (token != NULL) { 571 strcpy(realToken, token); 572 } 573 } 574 575 const char *found = json_string_value(iter); 576 if (found == NULL) 577 { 578 printf("no string value could be obtained from value at key\n"); 579 return_string(YR_UNDEFINED); 580 } 581 582 free(key); 583 free(prevToken); 584 free(token); 585 free(realToken); 586 587 return_string(found); 588 } 589 590 // Get integer value 591 define_function(integer_get_value) 592 { 593 char *key = strdup(string_argument(1)); 594 595 json_t *json = yr_module()->data; 596 if (json == NULL) 597 { 598 return_integer(YR_UNDEFINED); 599 } 600 601 // Split key into possible subcomponents - separated by '.' 602 json_t *iter = json; 603 char *token = strtok(key, "."); 604 char *prevToken = strdup(token); 605 char previousChar = '\0'; 606 char *realToken = strdup(token); 607 608 while (token != NULL) 609 { 610 previousChar = token[strlen(token)-1]; 611 if (previousChar == '\\') { 612 realToken[strlen(realToken)-1] = '.'; 613 token = strtok(NULL, "."); 614 strcat(realToken, token); 615 } 616 617 iter = json_object_get(iter, realToken); 618 if (iter == NULL) 619 { 620 return_integer(YR_UNDEFINED); 621 } 622 623 strcpy(prevToken, token); 624 token = strtok(NULL, "."); 625 if (token != NULL) { 626 strcpy(realToken, token); 627 } 628 } 629 630 double foundNumber = json_number_value(iter); 631 if (foundNumber == 0.0) 632 { 633 printf("no integer value could be obtained from value at key\n"); 634 return_integer(YR_UNDEFINED); 635 } 636 int found = (int)foundNumber; 637 638 free(key); 639 free(prevToken); 640 free(token); 641 free(realToken); 642 643 return_integer(found); 644 } 645 646 // Get float value 647 define_function(float_get_value) 648 { 649 char *key = strdup(string_argument(1)); 650 651 json_t *json = yr_module()->data; 652 if (json == NULL) 653 { 654 return_float(YR_UNDEFINED); 655 } 656 657 // Split key into possible subcomponents - separated by '.' 658 json_t *iter = json; 659 char *token = strtok(key, "."); 660 char *prevToken = strdup(token); 661 char previousChar = '\0'; 662 char *realToken = strdup(token); 663 664 while (token != NULL) 665 { 666 previousChar = token[strlen(token)-1]; 667 if (previousChar == '\\') { 668 realToken[strlen(realToken)-1] = '.'; 669 token = strtok(NULL, "."); 670 strcat(realToken, token); 671 } 672 673 iter = json_object_get(iter, realToken); 674 if (iter == NULL) 675 { 676 return_float(YR_UNDEFINED); 677 } 678 679 strcpy(prevToken, token); 680 token = strtok(NULL, "."); 681 if (token != NULL) { 682 strcpy(realToken, token); 683 } 684 } 685 686 double foundNumber = json_number_value(iter); 687 if (foundNumber == 0.0) 688 { 689 printf("no float value could be obtained from value at key\n"); 690 return_float(YR_UNDEFINED); 691 } 692 693 free(key); 694 free(prevToken); 695 free(token); 696 free(realToken); 697 698 return_float(foundNumber); 699 } 700 701 begin_declarations; 702 703 declare_function("key_exists", "s", "i", key_exists); 704 declare_function("value_exists", "ss", "i", value_exists_string); 705 declare_function("value_exists", "si", "i", value_exists_integer); 706 declare_function("value_exists", "sr", "i", value_exists_regex); 707 declare_function("value_exists", "sf", "i", value_exists_float); 708 declare_function("array_includes", "ss", "i", string_array_includes); 709 declare_function("array_includes", "si", "i", integer_array_includes); 710 declare_function("array_includes", "sf", "i", float_array_includes); 711 declare_function("get_string_value", "s", "s", string_get_value); 712 declare_function("get_integer_value", "s", "i", integer_get_value); 713 declare_function("get_float_value", "s", "f", float_get_value); 714 end_declarations; 715 716 int module_initialize(YR_MODULE *module) 717 { 718 return ERROR_SUCCESS; 719 } 720 721 int module_finalize(YR_MODULE *module) 722 { 723 return ERROR_SUCCESS; 724 } 725 726 int module_load( 727 YR_SCAN_CONTEXT *context, 728 YR_OBJECT *module_object, 729 void *module_data, 730 size_t module_data_size) 731 { 732 // Get first Memory Block 733 YR_MEMORY_BLOCK *block = first_memory_block(context); 734 const uint8_t *block_data = block->fetch_data(block); 735 736 // Parse and Save JSON to Module 737 json_error_t json_error; 738 int flags = JSON_DECODE_INT_AS_REAL | JSON_ALLOW_NUL; 739 740 json_t *json = json_loads((const char *)block_data, flags, &json_error); 741 if (!json) 742 { 743 // fprintf(stderr, "most likely not a json file. error on line %d: %s\n", json_error.line, json_error.text); 744 // NOT a JSON file or a VALID JSON FILE 745 // YR_DEBUG_FPRINTF(2, stderr, "most likely not a json file. error on line %d: %s\n", json_error.line, json_error.text); 746 module_object->data = NULL; 747 return ERROR_SUCCESS; 748 } 749 750 // JSON is valid 751 module_object->data = json; 752 753 return ERROR_SUCCESS; 754 } 755 756 int module_unload(YR_OBJECT *module_object) 757 { 758 free(module_object->data); 759 return ERROR_SUCCESS; 760 }