二进制分析逆向crackme_crypto
foresta.yang目标是解析flag,为一个序列号
查看PE文件,可见是一个win32程序,32位exe,并且加壳了,加壳工具是tElock,首先脱壳得到脱壳后的文件。
用IDA反编译:
分析DialogFunc,获取最终的flag;

此处应该是获取了两个输入,用户名和序列号。
DialogFunc中可分析出由一个子函数控制着序列号正确与否,接着去分析sub_401610,该函数接受的参数是lpString,也是输入的序列号,尝试去找到该序列号的正确匹配结果;
查看sub_401610函数的伪代码,其中又调用了其他函数过程,挨个分析吧;
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
| int __cdecl sub_401610(int a1, LPCSTR lpString) { int v2; __int16 v3; char *v4; char *v5; unsigned __int16 v6; signed int v7; char v8; int result; int v10; char *v11; char *v12; signed int v13; bool v14; bool v15; signed int v16; char v17; char v18; char v19; char v20; char v21; char v22; char v23; char v24; char v25; char v26; char v27; char v28; char v29; int v30; int v31; int v32; int v33; char v34; int v35; char *v36; int v37;
v36 = &v17; sub_401000(&v17); v37 = 0; v2 = lstrlenA(lpString); v3 = v2; v4 = (char *)operator new(v2); v5 = v4; v6 = sub_401020(lpString, v4, v3); if ( (signed int)v6 < 8 ) { sub_4092DC(v5); v37 = -1; nullsub_1(&v17); result = 0; } else { v5[v6] = 0; v7 = 8; if ( (signed int)v6 <= 8 ) { LABEL_8: sub_408310(&v18); v10 = lstrlenA(String); sub_408340(&v18, String, v10); sub_4085F0(&v18); v21 = 41; v22 = 71; v23 = 7; v24 = -123; v25 = -121; v26 = 51; v27 = 37; v28 = 68; sub_408FF0(&v21, 8, &v29); sub_4090F0(v5, 8, &v29); v11 = &v19; v12 = v5; v13 = 8; v16 = 0; v14 = 0; v15 = 1; do { if ( !v13 ) break; v14 = (unsigned __int8)*v11 < (unsigned __int8)*v12; v15 = *v11++ == *v12++; --v13; } while ( v15 ); if ( !v15 ) { if ( v14 ) v16 = -2; ++v16; } if ( v16 ) { sub_4092DC(v5); v37 = -1; nullsub_1(&v17); result = 0; } else { v30 = 0; v31 = 0; v32 = 0; v33 = 0; sub_4071D0(v5 + 8, (int)&v30); sub_4092DC(v5); sub_4071D0(a65537, (int)&v31); sub_406ED0(aB80a90bf53c6c9, (int)&v32); sub_405E40(v30, v31, v32, &v33); sub_4014F0(&v20, 8, &v34); v35 = 0; sub_406ED0(&v34, (int)&v35); if ( sub_402290(v35, v33) ) { v37 = -1; nullsub_1(&v17); result = 0; } else { v37 = -1; nullsub_1(&v17); result = 1; } } } else { while ( 1 ) { v8 = v5[v7]; if ( v8 < 48 || v8 > 57 ) break; if ( ++v7 >= v6 ) goto LABEL_8; } sub_4092DC(v5); v37 = -1; nullsub_1(&v17); result = 0; } } return result; }
|
追踪lpString的长度,