您好,登錄后才能下訂單哦!
題目:見附件
這題開始有些小復雜了。
運行程序,可以看見界面如下
注意看“隱藏信息完畢!”字符串的位置
直接搜索push 40405c,找到代碼位置401a48。
網上翻找到代碼塊的入口地址4017a0。很顯然這是一個非常長的函數,使用IDA進行靜態分析。
v2 = CreateFileA(*((LPCSTR *)v1 + 24), 0x80000000u, 1u, 0, 3u, 0x80u, 0); if ( v2 == (HANDLE)-1 ) { result = CWnd::MessageBoxA(v1, &unk_4040D4, 0, 0); } else { v4 = CreateFileA(*((LPCSTR *)v1 + 26), 0x80000000u, 1u, 0, 3u, 0x80u, 0); hObject = v4; if ( v4 == (HANDLE)-1 ) { result = CWnd::MessageBoxA(v1, &unk_4040BC, 0, 0); } else { v33 = CreateFileA(*((LPCSTR *)v1 + 25), 0x40000000u, 1u, 0, 2u, 0x80u, 0); if ( v33 == (HANDLE)-1 ) { result = CWnd::MessageBoxA(v1, &unk_40409C, 0, 0); } else { SetFilePointer(v2, 2, 0, 0); ReadFile(v2, &Buffer, 4u, &NumberOfBytesWritten, 0); SetFilePointer(v2, 4, 0, 1u); ReadFile(v2, &v35, 4u, &NumberOfBytesWritten, 0); SetFilePointer(v2, 0, 0, 0); v5 = operator new(Buffer); lpBuffer = v5; ReadFile(v2, (LPVOID)v5, Buffer, &NumberOfBytesWritten, 0); v6 = (int)((char *)v5 + v35); v7 = GetFileSize(v4, 0); v31 = v7; v28 = operator new(v7); ReadFile(hObject, v28, v7, &NumberOfBytesWritten, 0); v8 = Buffer - v35 - 32; if ( 8 * v7 <= v8 ) { v24 = v7; v9 = 16; do { LOWORD(v8) = *(_BYTE *)v6 & 1; v10 = v24 & 1; v8 ^= v10; if ( (_WORD)v8 ) { v11 = (rand() & 1) == 0; v12 = *(_BYTE *)v6; if ( v11 ) v13 = v12 - 1; else v13 = v12 + 1; *(_BYTE *)v6 = v13; } v24 >>= 1; ++v6; --v9; } while ( v9 ); v14 = 16; v25 = v7 >> 16; do { LOWORD(v10) = *(_BYTE *)v6 & 1; v10 ^= v25 & 1; if ( (_WORD)v10 ) { v11 = (rand() & 1) == 0; v15 = *(_BYTE *)v6; if ( v11 ) v16 = v15 - 1; else v16 = v15 + 1; *(_BYTE *)v6 = v16; } LOWORD(v25) = (unsigned __int16)v25 >> 1; ++v6; --v14; } while ( v14 ); v17 = 0; v26 = 0; if ( v7 ) { do { v18 = 8; v19 = *((_BYTE *)v28 + v17); do { if ( (v19 ^ *(_BYTE *)v6) & 1 ) { v11 = (rand() & 1) == 0; v20 = *(_BYTE *)v6; if ( v11 ) v21 = v20 - 1; else v21 = v20 + 1; *(_BYTE *)v6 = v21; } v19 >>= 1; ++v6; --v18; } while ( v18 ); v17 = v26++ + 1; } while ( v26 < v31 ); } v22 = lpBuffer; v23 = v33; WriteFile(v33, lpBuffer, Buffer, &NumberOfBytesWritten, 0); operator delete((void *)v22); operator delete(v28); CloseHandle(v2); CloseHandle(hObject); CloseHandle(v23); result = CWnd::MessageBoxA(v30, &unk_40405C, 0, 0); } else { result = CWnd::MessageBoxA(v30, &unk_40406C, "Caption", 0); } } } } return result;
要理解代碼,首先要了解bmp文件的格式,可以參考http://www.cnblogs.com/kingmoon/archive/2011/04/18/2020097.html。
實際上,題目的算法是跳過bmp文件頭和最前面的32字節的像素,然后每8個字節編碼一個所要加密的明文字節。其中用每一個像素字節的最后一位來表示要加密的明文字節的響應位。
代碼中+1、-1實際上就是當像素字節的最后一位與明文字節對應位不一致時,修正到相同。
所以知道了算法就知道如何解密:取出藏有密文的字節的最后一位,拼出相應的明文。
提取源代碼就不貼了。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。