1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Почему не запускается пример из книги Криса Касперсого?

Тема в разделе "WASM.BEGINNERS", создана пользователем 2Hard2Forget, 7 дек 2019.

Метки:
  1. 2Hard2Forget

    2Hard2Forget Member

    Публикаций:
    0
    Регистрация:
    27 авг 2018
    Сообщения:
    56
    Для подсчёта и контроля CRC нужного участка кода, я нашёл исходник от Криса Касперского (Неявный самоконтроль как средство создания не ломаемых защит)с тем же примером:
    Код (C):
    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include <stdio.h>
    3. #include<stdlib.h>
    4. #include<string.h>
    5. #define PASSWD "+++"
    6. #define MAX_LEN 1023
    7. #define MAX_CODE_SIZE (0x10*1024)
    8. #define OFFSET_1 0x42
    9. #define OFFSET_2 0x67
    10. #define x_original_1 0xc01b0574
    11. #define x_original_2 0x44681574
    12. #define x_original_all 0x13D4C04B
    13. #define x_crypt 0x66
    14. int check_user()
    15. {
    16.     char passwd[MAX_LEN];
    17.     fprintf(stderr, "enter password:");
    18.     fgets(passwd, MAX_LEN, stdin);
    19.     return ~strcmp(passwd, PASSWD);
    20. }
    21. int my_func()
    22. {
    23.     if (check_user())
    24.     {
    25.         fprintf(stderr, "passwd ok\n");
    26.     }
    27.     else
    28.     {
    29.         fprintf(stderr, "wrong passwd\n");
    30.         exit(-1);
    31.     }
    32.     return 0;
    33. }
    34. int main()
    35. {
    36.     int a, b = 0;
    37. #pragma pack(1)
    38.     union anti_hack
    39.     {
    40.         char buf[MAX_CODE_SIZE];
    41.         struct code_control
    42.         {
    43.             int local_var_1;
    44.             int local_var_2;
    45.             char gag_1[OFFSET_1 - sizeof(int) * 2];
    46.             int x_val_1;
    47.             //char gag_2[OFFSET_2 - OFFSET_1 - sizeof(int)];
    48.             char gag_2[OFFSET_2 - OFFSET_1 - sizeof(int)];
    49.             int x_val_2;
    50.         };
    51.     };
    52.     union anti_hack ZZZ;
    53.     // TITLE
    54.     fprintf(stderr, "crackeme.0xh by Kris Kaspersky\n");
    55.     // расшифровка кода
    56.     // =======================================================================
    57.     // копируем расшифровываемый код в буфер
    58.     memcpy(&ZZZ, &check_user, (int)&main - (int)&check_user);
    59.     // расшифровываем в буфере
    60.     //for (a = 0; a < (int)&main -(int)&check_user; a++)
    61.     for (a = 0; a < (int)&main - (int)&check_user; a++)
    62.     {
    63.         (*(char *)((int)&ZZZ + a)) ^= x_crypt;
    64.     }
    65.     // копируем обратно
    66.  
    67.     //memcpy(&check_user, &ZZZ, (int)&main-(int)&check_user);
    68.     memcpy(&check_user,&ZZZ, (int)&main - (int)&check_user);
    69.     // явная проверка изменения кода
    70.     // =======================================================================
    71.     //for (a = 0; a < (int)&main -(int)&check_user; a++)
    72.     for (a = 0; a < (int)&main - (int)&check_user; a++)
    73.     {
    74.         b += *(int *)((int)&check_user + a);
    75.     }
    76.     if (b != x_original_all)
    77.     {
    78.         fprintf(stderr, "ERR: invalid CRC (%x) hello, hacker\n", b);
    79.         return 0;
    80.     }
    81.     // явная проверка "валидности" пользователя
    82.     // =======================================================================
    83.     my_func();
    84.     // нормальное выполнение программы
    85.     // =======================================================================
    86.     // скрытый контроль
    87.  
    88.     ZZZ.local_var_1 = 2;
    89.     ZZZ.local_var_2 = 2; x_original_2;
    90.     sprintf(ZZZ.gag_1, "%d * %d = %d\n", ZZZ.local_var_1,
    91.         ZZZ.local_var_2,
    92.         ZZZ.local_var_1*ZZZ.local_var_2 + ((x_original_1^ZZZ.x_val_1) + (x_original_2^ZZZ.x_val_2)));
    93.     printf("DEBUG: %x %x\n", ZZZ.x_val_1, ZZZ.x_val_2);
    94.     fprintf(stderr, "%s", ZZZ.gag_1);
    95.  
    96.     return 0;
    97. }
    Однако его код не запускается и выдаёт ошибку на втором memcpy, как можно исправить? Я запускаю на win10 в visual studio 2017 в си файле
     
  2. Prober

    Prober New Member

    Публикаций:
    0
    Регистрация:
    4 дек 2008
    Сообщения:
    26
    Проверьте атрибуты секции кода. Должен быть доступ на запись.
     
  3. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    2.987