node-yara-rs

git clone git://archive.git.mtrnord.blog/MTRNord/node-yara-rs.git
Log | Files | Refs | README | LICENSE

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 }