天天看點

ImagePrc

查殼,沒有殼。

用ida打開,架構圖

ImagePrc

挨個查了查

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正确