查殼,沒有殼。
用ida打開,架構圖
挨個查了查
lpWindowName:lpWindowName指向視窗名。
GetStockObject:索預定義的備用筆、刷子、字型或者調色闆的句柄。
LoadCursor:僅當IpCursorName參數指向一個光标資源時,該函數才傳回一個有效的光标句柄。
LoadIcon:加載一個圖示資源
RegisterClassA:注冊視窗
GetSystemMetrics:是一個計算機函數,該函數隻有一個參數,稱之為「索引」,這個索引有75個辨別符,通過設定不同的辨別符就可以擷取系統分辨率、窗體顯示區域的寬度和高度、滾動條的寬度和高度。
ShowWindow:該函數設定指定視窗的顯示狀态。
GetMessageA:擷取視窗的消息。
TranslateMessage:将虛拟鍵消息轉換為字元消息。
DispatchMessage:該函數分發一個消息給視窗程式。
看main函數
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
int v4; // [email protected]
int v5; // [email protected]
HWND v6; // [email protected]
int result; // [email protected]
struct tagMSG Msg; // [sp+4h] [bp-44h]@1
WNDCLASSA WndClass; // [sp+20h] [bp-28h]@1
//由系統支援的結構,用來儲存某一類視窗的資訊,如ClassStyle,消息處理函數,Icon,Cursor,背景Brush等
dword_4084D8 = (int)hInstance;
WndClass.cbClsExtra = ; //視窗類無擴充
WndClass.cbWndExtra = ; //視窗執行個體無擴充
WndClass.hbrBackground = (HBRUSH)GetStockObject(); //視窗背景
WndClass.hCursor = LoadCursorA(, (LPCSTR));// 視窗光标樣式
WndClass.hInstance = hInstance;//目前執行個體句柄
WndClass.hIcon = LoadIconA(, (LPCSTR));//視窗的最小化圖示
WndClass.lpfnWndProc = (WNDPROC)sub_401130; //視窗消息處理
WndClass.lpszClassName = lpWindowName; //視窗類名為“視窗”
WndClass.lpszMenuName = ;//視窗無菜單
WndClass.style = ;
RegisterClassA(&WndClass);
v4 = GetSystemMetrics() / - ;
v5 = GetSystemMetrics();
v6 = CreateWindowExA(, lpWindowName, lpWindowName, u, v5 / - , v4, , , , , hInstance, );
ShowWindow(v6, );
if ( GetMessageA(&Msg, , , ) )
{
do
{
TranslateMessage(&Msg);
DispatchMessageA(&Msg);
}
while ( GetMessageA(&Msg, , , ) );
result = Msg.wParam;
}
else
{
result = Msg.wParam;
}
return result;
}
再看視窗處理函數sub_401130,函數很長,就看有用的
if ( wParam == )
{
GetObjectA(hbm, , &pv);
memset(&bmi, , u);
bmi.bmiHeader.biHeight = cLines;
bmi.bmiHeader.biWidth = v16;
bmi.bmiHeader.biSize = ;
bmi.bmiHeader.biPlanes = ;
bmi.bmiHeader.biBitCount = ;
bmi.bmiHeader.biCompression = ;
GetDIBits(hdc, (HBITMAP)hbm, , cLines, , &bmi, ); //GetDIBits函數擷取指定相容位圖的位,然後将其作一個DIB—裝置無關位圖使用的指定格式複制到一個緩沖區中。
v8 = (void *)sub_40150B(bmi.bmiHeader.biSizeImage); //bmp圖像大小
GetDIBits(hdc, (HBITMAP)hbm, , cLines, v8, &bmi, );
v9 = FindResourceA(, (LPCSTR), (LPCSTR));//FindResource是一個計算機函數。該函數确定指定子產品中指定類型和名稱的資源所在位置
v10 = LoadResource(, v9);//裝載指定資源到全局存儲器
v11 = LockResource(v10);
v12 = ;
v13 = v8;
v14 = v11 - (_BYTE *)v8;
while ( *v13 == v13[v14] ) {
++v12;
++v13;
if ( v12 >= )
{
sub_401500(v8);
return ;
}
}
MessageBoxA(hWnd, Text, Caption, u);
sub_401500(v8);
return ;
}
//擷取的圖像和畫的圖像依次對比,如果總共相同點達到個就直接傳回而不報錯
return ;
}
然後如果能導出擷取的圖像就可以了。
借鑒了大佬的wp,用exescope導出圖檔資料,然後用python恢複。
不會python啊啊啊,要将學習python提上日程了。。
然後還是這個大佬的腳本。。
from PIL import Image
width =
height =
fp = open('123', 'rb')
data = fp.read()
im = Image.frombytes('RGB', (width, height), data)
im = im.transpose(Image.FLIP_TOP_BOTTOM)
im.show()
im.save('result.bmp')
運作時候出現 No module named PIL,用了下面連結裡的方法解決
Python27 No module named PIL解決方法
答案是個倒着的GOT
試一下GOT,和TOG
GOT正确