ImagePrc

查壳,没有壳。
用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; // ST14_4@1
  int v5; // eax@1
  HWND v6; // eax@1
  int result; // eax@3
  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 = 0; //窗口类无扩展
  WndClass.cbWndExtra = 0; //窗口实例无扩展
  WndClass.hbrBackground = (HBRUSH)GetStockObject(0); //窗口背景
  WndClass.hCursor = LoadCursorA(0, (LPCSTR)0x7F00);// 窗口光标样式
  WndClass.hInstance = hInstance;//当前实例句柄
  WndClass.hIcon = LoadIconA(0, (LPCSTR)0x7F00);//窗口的最小化图标 
  WndClass.lpfnWndProc = (WNDPROC)sub_401130; //窗口消息处理
  WndClass.lpszClassName = lpWindowName; //窗口类名为“窗口”
  WndClass.lpszMenuName = 0;//窗口无菜单
  WndClass.style = 3;
  RegisterClassA(&WndClass);
  v4 = GetSystemMetrics(1) / 2 - 75;
  v5 = GetSystemMetrics(0);
  v6 = CreateWindowExA(0, lpWindowName, lpWindowName, 0xCA0000u, v5 / 2 - 100, v4, 200, 150, 0, 0, hInstance, 0);
  ShowWindow(v6, 5);
  if ( GetMessageA(&Msg, 0, 0, 0) )
  {
    do
    {
      TranslateMessage(&Msg);
      DispatchMessageA(&Msg);
    }
    while ( GetMessageA(&Msg, 0, 0, 0) );
    result = Msg.wParam;
  }
  else
  {
    result = Msg.wParam;
  }
  return result;
}

再看窗口处理函数sub_401130,函数很长,就看有用的

    if ( wParam == 100 )
    {
      GetObjectA(hbm, 24, &pv);
      memset(&bmi, 0, 0x28u);
      bmi.bmiHeader.biHeight = cLines;
      bmi.bmiHeader.biWidth = v16;
      bmi.bmiHeader.biSize = 40;
      bmi.bmiHeader.biPlanes = 1;
      bmi.bmiHeader.biBitCount = 24;
      bmi.bmiHeader.biCompression = 0;
      GetDIBits(hdc, (HBITMAP)hbm, 0, cLines, 0, &bmi, 0);  //GetDIBits函数获取指定兼容位图的位,然后将其作一个DIB—设备无关位图使用的指定格式复制到一个缓冲区中。
      v8 = (void *)sub_40150B(bmi.bmiHeader.biSizeImage); //bmp图像大小
      GetDIBits(hdc, (HBITMAP)hbm, 0, cLines, v8, &bmi, 0);
      v9 = FindResourceA(0, (LPCSTR)0x65, (LPCSTR)0x18);//FindResource是一个计算机函数。该函数确定指定模块中指定类型和名称的资源所在位置
      v10 = LoadResource(0, v9);//装载指定资源到全局存储器
      v11 = LockResource(v10);
      v12 = 0;
      v13 = v8;
      v14 = v11 - (_BYTE *)v8;
      while ( *v13 == v13[v14] )       {
        ++v12;
        ++v13;
        if ( v12 >= 90000 )
        {
          sub_401500(v8);
          return 0;
        }
      }
      MessageBoxA(hWnd, Text, Caption, 0x30u);
      sub_401500(v8);
      return 0;
    }
    //获取的图像和画的图像依次对比,如果总共相同点达到90000个就直接返回而不报错

    return 0;
  }

然后如果能导出获取的图像就可以了。
借鉴了大佬的wp,用exescope导出图片数据,然后用python恢复。
不会python啊啊啊,要将学习python提上日程了。。
然后还是这个大佬的脚本。。

from PIL import Image

width = 200
height = 150

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

猜你喜欢

转载自blog.csdn.net/weixin_42980240/article/details/82056593