剑芒罗曼史2解图片程序

mcg文件

file head 40h
---------------------------
10h palette offset
1ch width
20h height
---------------------------

palette 400h
---------------------------
BMP's palette
---------------------------

pixel data
使用一种比较特殊的压缩法,至少是我不知道的,呵呵,具体的解码函数看0x422990吧

使用工具

IDA 4.0
TRW 2000

注:
dat/plane/n0.mcg,实际上不是mcg文件,好像是bmp吧,先把它换名再运行才不会出问题!

#include <stdio.h>
#include <windows.h>
#include <malloc.h>
#include <io.h>
#include <conio.h>

typedef struct BITMAPHEADER
{
   unsigned short type;
   unsigned long  size;
   unsigned long  reserved;
   unsigned long  offbits;
   unsigned long  headsize;
   unsigned long  width;
   unsigned long  height;
   unsigned short planes;
   unsigned short bit; 
} BITMAPHEADER;

void encode(BYTE *dst,DWORD length1,BYTE *src,DWORD length2);

void LoadXmp(DWORD &w,DWORD &h,BYTE* &data,char *name)
{
   BITMAPHEADER bmph;
   FILE *fp;
   char *tmp,*line;
   int i,pitch;
   unsigned j;

fp=fopen(name,"rb");
//   fp=CreateFile(name,0x80000000,1,NULL,3,0x10000080,0);
   
//   GetFileSize(fp,&w);

data=(BYTE *)malloc(w);
   if(data==NULL)
   {
   printf("Out of memory!");
   return ;
   }

fread(data,w,1,fp);

fclose(fp);

//   ReadFile(fp,data,w,&h,NULL);

//   CloseHandle(fp);
}

void SaveBmp(DWORD w,DWORD h,BYTE *data,char * name)
{
FILE *f;
BITMAPFILEHEADER bithead;
BITMAPINFOHEADER bitinfo;
DWORD headsize,linesize,i,j,s,w1,h1;
unsigned long color;

if(data==NULL)
return ;

if((f=fopen(name,"wb"))==NULL)
{
   printf("write file error");
}

memcpy(&w1,data+0x1c,4);
memcpy(&h1,data+0x20,4);
// w1=(DWORD)(*(data+0x1c));
// h1=(DWORD)(*(data+0x20));

linesize=(w1+3)&0xfffffffc;
s=linesize-3;

headsize=sizeof(bithead)+sizeof(bitinfo);
bithead.bfType='MB';
bithead.bfSize=headsize+linesize*h1+1024;
bithead.bfReserved1=bithead.bfReserved2=0;
bithead.bfOffBits=headsize+1024;
fwrite(&bithead,1,sizeof(bithead),f);

bitinfo.biSize=sizeof(bitinfo);
bitinfo.biWidth=w1;
bitinfo.biHeight=h1;
bitinfo.biPlanes=1;
   bitinfo.biBitCount=8;
bitinfo.biCompression=BI_RGB;
bitinfo.biSizeImage=0;
   bitinfo.biXPelsPerMeter=72;
bitinfo.biYPelsPerMeter=72;
bitinfo.biClrUsed=0;
   bitinfo.biClrImportant=0;
fwrite(&bitinfo,1,sizeof(bitinfo),f);

fwrite(data+0x40,0x400,1,f);

BYTE *pixel_data;
pixel_data=(BYTE *)malloc(linesize*h1);
if(pixel_data==NULL)
{
printf("out of memory");
goto ret;
}

encode(pixel_data,linesize*h1,data+0x440,w-0x440);

for(i=0;i<h1;i++)
fwrite(pixel_data+linesize*(h1-i-1),linesize,1,f);

if(pixel_data!=NULL)
free(pixel_data);

ret:
fclose(f);
}

void encode(BYTE *dst,DWORD length1,BYTE *src,DWORD length2)
{
BYTE tmp[0x1000];
DWORD i,j,k,num;

memset(tmp,0,0x1000);

// i=(DWORD)src+length2;
__asm{
mov eax,src;
mov ebx,length2;
add eax,ebx;
mov i,eax;

mov eax,dst;
mov ebx,length1;
add eax,ebx;
mov k,eax;
}

__asm{
push ebx;
push edx;

push esi;

mov ebx,src;
mov edx,dst;
mov esi,0x0fee;

jmp _422a50;
_422a42:
shr num,1;
mov eax,num;
test ah,1;
jnz _422a5d;
_422a50:
mov cl,byte ptr [ebx];
mov ch,0xff;
and ecx,0xffff;
mov num,ecx;

inc ebx;
_422a5d:
test byte ptr num,1;
jz _422a80;
_422a64:
mov al,[ebx];
and esi,0x0fff;

mov ecx,esi;
inc esi;
inc ebx;

mov byte ptr [edx],al;
inc edx;

mov [ecx+tmp],al;

jmp _422ad8;
_422a80:
mov ax,[ebx];
mov cl,ah;

and eax,0x0fff;
shr cl,4;
add cl,3;
inc ebx;
inc ebx;

cmp cl,0;
jz _422ad7;

mov j,ebx;
mov bl,cl;
_422aab:
and eax,0x0fff;
and esi,0x0fff;

mov cl,byte ptr [tmp+eax];
mov [edx],cl;

mov [tmp+esi],cl;

inc eax;
inc esi;
inc edx;

dec bl;
jnz _422aab;
mov ebx,j;
_422ad7:
_422ad8:
cmp ebx,i;
jnb _ret;
cmp edx,k;
jb _422a42;
_ret:
pop esi;
pop edx;
pop ebx;
}
}

void main()
{
DWORD w,h;
BYTE *data;
bool ret;
int i;
long done;
_finddata_t f;

done=_findfirst("*.mcg",&f);
if(done==-1)
return ;
ret=false;

while(!ret)
{
w=f.size;
LoadXmp(w,h,data,f.name);

i=0;
next:
while(f.name[i]!='.')
i++;
if(!((f.name[i+1]=='m'||f.name[i+1]=='M')&&(f.name[i+2]=='c'||f.name[i+2]=='C')&&(f.name[i+3]=='g'||f.name[i+3]=='G')))
{
i++;
goto next;
}

f.name[i+1]='b';
f.name[i+2]='m';
f.name[i+3]='p';

SaveBmp(w,h,data,f.name);

if(data!=NULL)
free(data);

ret=_findnext(done,&f);
}

return ;
}

剑芒罗曼史2解图片程序相关推荐

  1. 编程精粹 --Microsoft编写优质无错C程序秘诀

    献给我的妻子Beth, 以及我的双亲Joseph和Julia Maguire ────为了他们的爱和支持 序 1986年,在为几家小公司咨询和工作了10年之后为了获得编写Macintosh应用程序的经 ...

  2. off-null-byte-plaiddb

    题目: plaidctf2015_plaiddb ->datastore 保护 恩,全开 分析 这题不用纠结这个二叉树算法,解题思路和算法方面关系不大 put函数:(用于添加键值对) off-b ...

  3. POCO C++库学习和分析 -- 序

    POCO C++库学习和分析 -- 序 1. POCO库概述: POCO是一个C++的开源库集.同一般的C++库相比,POCO的特点是提供了整一个应用框架.如果要做C++程序应用框架的快速开发,我觉得 ...

  4. Visio绘制功能分解图

    为什么要绘制功能分解图? 对于编程人员来说,具体分配任务的时候,必须知道自己要做什么,必须了解系统的大体框架.功能分解图可以帮助我们理清程序的框架,便于大局观的掌握. 用Visio2010创建功能分解 ...

  5. 前谷歌工程师:如何看待程序员普遍缺乏数据结构和算法知识?

    很多技术人都很迷茫,觉得自己做的项目没有技术含量,成天就是卖苦力.技术的东西,日新月异,有些人总在忙于追求热点新技术,东学学.西学学,平时泛泛地看技术书籍.技术文章,但始终根本抓不住技术的本质,干了三 ...

  6. Google工程师:如何看待程序员普遍缺乏数据结构和算法知识?

    出处:极客时间<数据结构与算法之美> 很多技术人都很迷茫,觉得自己做的项目没有技术含量,成天就是卖苦力.技术的东西,日新月异,有些人总在忙于追求热点新技术,东学学.西学学,平时泛泛地看技术 ...

  7. 电气期刊论文实现:基于改进遗传算法的电力机组组合(程序讲解)

    个人电气博文传送门链接: 学好电气全靠它,个人电气博文目录(持续更新中-)     专栏解锁是可以看这个专栏所有文章一年,不只是看这一篇文章.淘宝代写一篇论文几百元,我这里算白菜价. 机组组合 程序讲 ...

  8. 如何看待 70% 的程序员,缺乏数据结构和算法知识?

    金三银四来了,各大厂动静不小,都在储备人才,绝对是程序员面试的黄金时间了,不少同学也在后台反馈面试中遇到的一些问题,所以今天想跟大家说说算法. 说起算法,那大厂面试是绝对必考的,可以说是一块大厂的敲门 ...

  9. 70%以上程序员,不懂数据结构和算法!

    金三银四马上到来,各个公司的动静不小,都在储备人才,绝对是程序员的面试黄金时间了,想换工作的人一大把,所以今天想再说说算法. 说起算法,那大厂面试是绝对必考的,可以说是一块大厂的敲门砖.毕竟掌握算法, ...

  10. ws2812b程序51单片机_51单片机串口通信程序详解

    串口通信简介 串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件.一般完成这种功能的电路,我们称为串行接口电路 ...

最新文章

  1. C++ 智能指针std::shared_ptr简单使用和理解
  2. Subsonic使用中
  3. 《Effective Java读书笔记》--序列化
  4. 8个排序算法的稳定性总结
  5. Docker镜像分层和临时容器
  6. java中的解码和编码_关于java中编码和解码(一)
  7. [IE技巧] 让IE 以全屏模式启动
  8. python一到10整数的平方和_零基础学python_10_列表(创建数值列表 )
  9. HashMap的实现原理及其特点
  10. OpenCV 发起 Spatial AI挑战赛
  11. radiobutton 设置单选项目标
  12. Kafka 分布式消息队列介绍
  13. 电商设计师(美工)必备的素材网站|优图!
  14. wcf服务契约代理链
  15. HTTP::Request
  16. RPC框架dubbo架构原理及使用说明
  17. 简单解决某盘限速?(黑科技)【油猴】+【某盘直链下载器】+【IDM下载】
  18. jdk目录详解及其使用方法
  19. 超详细纯前端导出excel并完成各种样式的修改(xlsx-style)
  20. SDN:mininet交换机流表操作

热门文章

  1. 备战Java后端【Day6】
  2. 使用Rasterio读取栅格数据
  3. 基于线性函数近似的安全强化学习 Safe RL with Linear Function Approximation 翻译 1
  4. 【微生物相关数据库】NAR database issue
  5. java average_Java IntStream average()用法及代码示例
  6. Linux LTP (一)
  7. 新发的日常小实验——Ubuntu安装拼音输入法
  8. 韶大talk 评论热度抽取
  9. BAT的医疗春秋大梦
  10. SLAM | 视觉SLAM中直接法开源算法:LSD-SLAM、DSO