Reversing.kr -ImagePrc_reversing.kr imageprc-程序员宅基地

技术标签: 网安  Reversing  逆向  

打开文件,他是空白的。点两下,可以画上东西,点Check后,会弹窗,“wrong!”
在这里插入图片描述
在这里插入图片描述
可以猜一下,他需要画对某种图形或者点到某个点,就可以变成“correct”
拖进IDA里,找到主函数,F5查看伪代码。
在这里插入图片描述
这里调用了一大堆API,而调用这些API后,用来画了个图,关键函数sub_401130;
点进去看看,

int __stdcall sub_401130(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
  HDC v4; // eax
  int result; // eax
  HGDIOBJ v6; // eax
  HDC v7; // esi
  void *v8; // esi
  HRSRC v9; // eax
  HGLOBAL v10; // eax
  _BYTE *v11; // eax
  signed int v12; // edi
  _BYTE *v13; // ecx
  int v14; // eax
  char pv; // [esp+8h] [ebp-80h]
  LONG v16; // [esp+Ch] [ebp-7Ch]
  UINT cLines; // [esp+10h] [ebp-78h]
  struct tagBITMAPINFO bmi; // [esp+20h] [ebp-68h]

  if ( Msg <= 273 )
  {
    if ( Msg != 273 )
    {
      switch ( Msg )
      {
        case 1u:
          v7 = GetDC(hWnd);
          hbm = CreateCompatibleBitmap(v7, 200, 150);
          hdc = CreateCompatibleDC(v7);
          h = SelectObject(hdc, hbm);
          Rectangle(hdc, -5, -5, 205, 205);
          ReleaseDC(hWnd, v7);
          ::wParam = (WPARAM)CreateFontA(12, 0, 0, 0, 400, 0, 0, 0, 0x81u, 0, 0, 0, 0x12u, pszFaceName);
          dword_4084E0 = (int)CreateWindowExA(
                                0,
                                ClassName,
                                WindowName,
                                0x50000000u,
                                60,
                                85,
                                80,
                                28,
                                hWnd,
                                (HMENU)0x64,
                                hInstance,
                                0);
          SendMessageA((HWND)dword_4084E0, 0x30u, ::wParam, 0);
          return 0;
        case 2u:
          v6 = SelectObject(hdc, h);
          DeleteObject(v6);
          DeleteDC(hdc);
          PostQuitMessage(0);
          return 0;
        case 0xFu:
          v4 = BeginPaint(hWnd, (LPPAINTSTRUCT)bmi.bmiColors);
          BitBlt(v4, 0, 0, 200, 150, hdc, 0, 0, 0xCC0020u);
          EndPaint(hWnd, (const PAINTSTRUCT *)bmi.bmiColors);
          return 0;
      }
      return DefWindowProcA(hWnd, Msg, wParam, lParam);
    }
    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);
      v8 = operator new(bmi.bmiHeader.biSizeImage);
      GetDIBits(hdc, (HBITMAP)hbm, 0, cLines, v8, &bmi, 0);
      v9 = FindResourceA(0, (LPCSTR)0x65, (LPCSTR)0x18);
      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;
    }
    return 0;
  }
  switch ( Msg )
  {
    case 0x200u:
      if ( dword_47D7F8 )
      {
        MoveToEx(hdc, x, y, 0);
        LineTo(hdc, (unsigned __int16)lParam, (unsigned int)lParam >> 16);
        x = (unsigned __int16)lParam;
        y = (unsigned int)lParam >> 16;
        InvalidateRect(hWnd, 0, 0);
      }
      return 0;
    case 0x201u:
      dword_47D7F8 = 1;
      y = (unsigned int)lParam >> 16;
      x = (unsigned __int16)lParam;
      result = 0;
      break;
    case 0x202u:
      dword_47D7F8 = 0;
      result = 0;
      break;
    default:
      return DefWindowProcA(hWnd, Msg, wParam, lParam);
  }
  return result;
}

GetDC指定hWnd为句柄,以后便可在GDI函数中用该句柄上下文环境中绘图,随后CreateCompatibleBitmap创建宽200高150的位图,CreateCompatibleDC创建上下文环境,然后那么一大通API就是用来让你在这个位图里绘图的OTZ;
一通API之后就开始Judge,首先是FindResource,然后是LoadResource,最后开始把Resource里的内容和画上去的内容逐像素点比较(拆成RGB是90000次Judge);
接着就可以使用eXeScope来dump出图片数据,然后用python恢复出图片。
(由于没带笔记本回家,家里台式机python的PIL库没弄好,图片画不了了…)
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')

画出来是个GOT

感谢大佬:
https://blog.csdn.net/yuanyunfeng3/article/details/49791067
https://blog.csdn.net/cossack9989/article/details/79337075

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43360152/article/details/97297535

智能推荐

聊聊蓝牙广播包_蓝牙广播包类型-程序员宅基地

蓝牙广播有四种类型的广播包:(1)可连接、非定向的广播 这种广播,可以接受对方的扫描请求(如果对方是主动扫描),可以接受对方的连接请求。 简单说,只要收到广播包,谁都可以发送扫描请求和连接请求。(2)可连接、定向广播 这种广播,不接受对方的扫描请求,只接受对方的连接请求。通常这种广播包报文仅含广播者的地址和连接发起者的地址,对方收到地址后,可以快速建立连接。 简单说,这种广播只针对特定地址的设备。(3)不可连接、非定向的广播 ..._蓝牙广播包类型

element tree 点击某个节点,获取该节点的所有子节点的id_获取element的子节点_Lccccb的博客-程序员宅基地

html中<el-tree :data="list" :props="defaultProps" @node-click="handleNodeClick"></el-tree>data中注册list: [{ id: 1, label: '一级 1', children: [{ id: 2, label: '二级 1-1', children: [{ _获取element的子节点

python读取fits第三方库_Python中FITS格式文件数据的读取-程序员宅基地

FITS(Flexible Image Transport System)格式文件是天文学数据储存的公用文件格式,在国际的天文数据存储与传输中担任着十分重要的角色。但是这种文件格式在其他科学领域并不常用,造成这方面的文件资料并不多,尤其是基础性入门的指导性说明就更少了。我本人也是初学天文的学生,对于一些特殊情况,可能学生们突然接触这类文件格式,有可能不知所措。如果老师们讲的比较详细的话,学生还能听...

Web程序中应用Gwt-程序员宅基地

Gwt在 Web 项目中的应用,Gwt适用各种Web项目,通过Java代码生成JavaScript代码。通过Eclipse Helios 的 Google Plugin 插件创建 Web 工程:File -&gt; New -&gt; Other.. Next -&gt; Finish -&gt;创建好的Project: 运行 GwtTest:右键工...

---WebCam网络摄像头7 cmos--yuv rgb , Format............:V4L2_PIX_FMT_YUYV-程序员宅基地

颜色系统基本 refer to http://bbs.chinavideo.org/viewthread.php?tid=4143常见的RGB格式有RGB1、RGB4、RGB8、RGB565、RGB555、RGB24、RGB32、ARGB32常见的YUV格式有YUY2、YUYV、YVYU、UYVY、AYUV、Y41P、Y411、Y211、IF09、IYUV、YV12、YVU9、YUV411

springMVC中json转换器的配置_springmvc配置json转换器-程序员宅基地

配置方法一1、导入第三方的jackson包,jackson-mapper-asl-x.x.x.jar和jackson-core-asl-x.x.x.jar。 2、spring配置文件添加** &lt;mvc:annotation-driven/&gt;&lt;!-- 避免IE执行AJAX时,返回JSON出现下载文件 --&gt; &lt;bean id="mappin..._springmvc配置json转换器

随便推点

大数据_04 【Hadoop】_hadoop -d <property=value>-程序员宅基地

大数据_04 【Hadoop】01 Hadoop的介绍以及发展历史02 Hadoop的历史版本介绍04 Hadoop三大公司发型版本介绍05 Hadoop的模块组成06 Hadoop集群安装部署01 Hadoop的介绍以及发展历史1. Hadoop最早起源于lucene下的Nutch。Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取、索引、查询等功能,但随着抓取网页数量的增加,遇到了严重的可扩展性问题——如何解决数十亿网页的存储和索引问题。2. 2003年、2004年谷歌发表的三篇论文_hadoop -d

p2p经典金融模式_jquery p2p-程序员宅基地

P2P网贷平台的债权转让模式究竟有哪些风险?字号 评论 邮件 纠错2016-06-01 17:41:38 来源:和讯网 作者:陈云峰 谭鸿   互联网金融专项整治持续进展,一份名为《互联网金融风险专项整治工作实施方案》在网上流传,该方案涉及到P2P、股权众筹、第三方支付、互联网保险、互联网跨界资管、互联网金融广告等多个领域。其中要求P2P和股权众筹平台,未经批准均不得从..._jquery p2p

UML 基础-程序员宅基地

统一建模语言 (UML) 类图,时序图,案例图,状态图, 类图:显示出类,接口,以及他们之间静态结构和关系图,类图最基本的元素是类与接口 UML 重要功能 :可视化功能,说明功能,建造功能,建文档功能 结构型图:描述系统的静态结构,显示一个系统已有的类及他们之间的静态关系有用 (类图,对象图) 行为型图:描述一个系统的动态性质 (时序图,案例图) ..._uml基础与rose建模实用教程(配套光盘中ppt和实例文件)

【转载】What does MULx operation in SNOW 3G correspond to?_snow 3g mul alpha-程序员宅基地

https://crypto.stackexchange.com/questions/72538/what-does-mulx-operation-in-snow-3g-correspond-toAccording to the spec, MULx operation is defined as -MULx maps 16 bits to 8 bits. Let V and c be 8-bit input values. Then MULx is defined: If the leftmost (_snow 3g mul alpha

matplotlib.imshow() or plt.show()-程序员宅基地

《Python深度学习》2.2——imshow()函数digit = train_data[4]import matplotlib.pyplot as pltplt.imshow(digit, cmap=plt.cm.binary) #plt.imshow()函数负责对图像进行处理,并显示其格式,但是不能显示。其后跟着plt.show()才能显示出来plt.show()cmap:colormaps,图谱matplotlib.cm(plt.cm)是matplotlib库中内置的色彩映射函数

离心泵水力设计——蜗壳设计_蜗壳水力设计-程序员宅基地

2 压水室设计计算2.1 螺旋形涡室设计步骤采用螺旋形涡室,其结构如图所示基圆直径D3D_3D3​D3=(1.03∼1.10)D2=(1.03∼1.10)×255=262.65∼280.5=265mmD_3=(1.03\sim1.10)D_2=(1.03\sim1.10)\times255=262.65\sim280.5=265mmD3​=(1.03∼1.10)D2​=(1.03∼1..._蜗壳水力设计

推荐文章

热门文章

相关标签