天天看点

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