1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
| int __fastcall main(int argc, const char **argv, const char **envp) { __int64 v3; // rax __int64 v5; // rax int choice; // [rsp+4h] [rbp-Ch] BYREF unsigned __int64 v7; // [rsp+8h] [rbp-8h]
v7 = __readfsqword(0x28u); setup(); while ( 1 ) { menu(); std::istream::operator>>(&std::cin, &choice); if ( choice == 4 ) break; if ( choice > 4 ) goto LABEL_12; switch ( choice ) { case 3: show_note(); break; case 1: add_note(); break; case 2: backup_and_delete_note(); break; default: LABEL_12: v5 = std::operator<<<std::char_traits<char>>(&std::cout, "Invalid choice."); std::ostream::operator<<(v5, &std::endl<char,std::char_traits<char>>); break; } } v3 = std::operator<<<std::char_traits<char>>(&std::cout, "Goodbye!"); std::ostream::operator<<(v3, &std::endl<char,std::char_traits<char>>); return 0; }
unsigned __int64 show_note(void) { unsigned __int64 v0; // rbx __int64 v2; // rax void (***v3)(void); // rax __int64 v4; // rbx __int64 v5; // rax unsigned int v7; // [rsp+4h] [rbp-1Ch] BYREF unsigned __int64 v8; // [rsp+8h] [rbp-18h]
v8 = __readfsqword(0x28u); std::operator<<<std::char_traits<char>>(&std::cout, "Enter note index to show: "); std::istream::operator>>(&std::cin, &v7); v0 = v7; if ( v0 >= std::vector<Note *>::size(¬es) || !*(_QWORD *)std::vector<Note *>::operator[](¬es, v7) ) { v2 = std::operator<<<std::char_traits<char>>(&std::cout, "Invalid index or note already deleted."); } else { v3 = (void (***)(void))std::vector<Note *>::operator[](¬es, v7); (**v3)(); v4 = std::operator<<<std::char_traits<char>>(&std::cout, "Content: "); v5 = std::vector<Note *>::operator[](¬es, v7); v2 = std::operator<<<std::char_traits<char>>(v4, *(_QWORD *)(*(_QWORD *)v5 + 8LL)); } std::ostream::operator<<(v2, &std::endl<char,std::char_traits<char>>); return v8 - __readfsqword(0x28u); }
// +0x0 function pointer // +0x8 content_ptr // +0x10 cnotent_chunk_size unsigned __int64 add_note(void) { __int64 v0; // rax __int64 v1; // rax __int64 v2; // rbx __int64 v3; // rax __int64 v4; // rbx __int64 v5; // rax __int64 v6; // rax _DWORD size[3]; // [rsp+Ch] [rbp-24h] BYREF unsigned __int64 v9; // [rsp+18h] [rbp-18h]
v9 = __readfsqword(0x28u); std::operator<<<std::char_traits<char>>(&std::cout, "Enter note size: "); std::istream::operator>>(&std::cin, size); if ( size[0] <= 0x800u ) { *(_QWORD *)&size[1] = malloc(0x18uLL); if ( *(_QWORD *)&size[1] ) { **(_QWORD **)&size[1] = show_content; // function pointer *(_DWORD *)(*(_QWORD *)&size[1] + 0x10LL) = size[0]; v2 = *(_QWORD *)&size[1]; *(_QWORD *)(v2 + 8) = malloc(size[0]); if ( *(_QWORD *)(*(_QWORD *)&size[1] + 8LL) ) { std::operator<<<std::char_traits<char>>(&std::cout, "Enter content: "); read(0, *(void **)(*(_QWORD *)&size[1] + 8LL), size[0]); std::vector<Note *>::push_back(¬es, &size[1]); v4 = std::operator<<<std::char_traits<char>>(&std::cout, "Note added at index "); v5 = std::vector<Note *>::size(¬es); v6 = std::ostream::operator<<(v4, v5 - 1); std::ostream::operator<<(v6, &std::endl<char,std::char_traits<char>>); } else { v3 = std::operator<<<std::char_traits<char>>(&std::cout, "Content allocation failed!"); std::ostream::operator<<(v3, &std::endl<char,std::char_traits<char>>); free(*(void **)&size[1]); } } else { v1 = std::operator<<<std::char_traits<char>>(&std::cout, "Allocation failed!"); std::ostream::operator<<(v1, &std::endl<char,std::char_traits<char>>); } } else { v0 = std::operator<<<std::char_traits<char>>(&std::cout, "Size too large!"); std::ostream::operator<<(v0, &std::endl<char,std::char_traits<char>>); } return v9 - __readfsqword(0x28u); }
unsigned __int64 backup_and_delete_note(void) { unsigned __int64 v0; // rbx __int64 v2; // rax __int64 v3; // rax __int64 v4; // rax __int64 v5; // rax __int64 v6; // rax __int64 v7; // rax __int64 v8; // rax __int64 v9; // rax __int64 v10; // rax unsigned int v12; // [rsp+Ch] [rbp-24h] BYREF void *ptr; // [rsp+10h] [rbp-20h] unsigned __int64 v14; // [rsp+18h] [rbp-18h]
v14 = __readfsqword(0x28u); std::operator<<<std::char_traits<char>>(&std::cout, "Enter note index to backup and delete: "); std::istream::operator>>(&std::cin, &v12); v0 = v12; if ( v0 >= std::vector<Note *>::size(¬es) || !*(_QWORD *)std::vector<Note *>::operator[](¬es, v12) ) { v2 = std::operator<<<std::char_traits<char>>(&std::cout, "Invalid index!"); std::ostream::operator<<(v2, &std::endl<char,std::char_traits<char>>); } else { ptr = *(void **)std::vector<Note *>::operator[](¬es, v12); if ( *((_DWORD *)ptr + 4) <= 0x200u ) { v5 = std::operator<<<std::char_traits<char>>(&std::cout, "Backing up note "); v6 = std::ostream::operator<<(v5, v12); v7 = std::operator<<<std::char_traits<char>>(v6, "..."); std::ostream::operator<<(v7, &std::endl<char,std::char_traits<char>>); v8 = std::operator<<<std::char_traits<char>>(&std::cout, "Backup successful."); std::ostream::operator<<(v8, &std::endl<char,std::char_traits<char>>); free(*((void **)ptr + 1)); free(ptr); *(_QWORD *)std::vector<Note *>::operator[](¬es, v12) = 0LL; v9 = std::operator<<<std::char_traits<char>>(&std::cout, "Note "); v10 = std::ostream::operator<<(v9, v12); v4 = std::operator<<<std::char_traits<char>>(v10, " deleted successfully."); } else { v3 = std::operator<<<std::char_traits<char>>(&std::cout, "Backup failed: Note content is too large to backup."); std::ostream::operator<<(v3, &std::endl<char,std::char_traits<char>>); free(*((void **)ptr + 1)); free(ptr); v4 = std::operator<<<std::char_traits<char>>(&std::cout, "Deletion aborted. Please try again later."); } std::ostream::operator<<(v4, &std::endl<char,std::char_traits<char>>); } return v14 - __readfsqword(0x28u); }
|