剑芒罗曼史2解图片程序
剑芒罗曼史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解图片程序相关推荐
- 编程精粹 --Microsoft编写优质无错C程序秘诀
献给我的妻子Beth, 以及我的双亲Joseph和Julia Maguire ────为了他们的爱和支持 序 1986年,在为几家小公司咨询和工作了10年之后为了获得编写Macintosh应用程序的经 ...
- off-null-byte-plaiddb
题目: plaidctf2015_plaiddb ->datastore 保护 恩,全开 分析 这题不用纠结这个二叉树算法,解题思路和算法方面关系不大 put函数:(用于添加键值对) off-b ...
- POCO C++库学习和分析 -- 序
POCO C++库学习和分析 -- 序 1. POCO库概述: POCO是一个C++的开源库集.同一般的C++库相比,POCO的特点是提供了整一个应用框架.如果要做C++程序应用框架的快速开发,我觉得 ...
- Visio绘制功能分解图
为什么要绘制功能分解图? 对于编程人员来说,具体分配任务的时候,必须知道自己要做什么,必须了解系统的大体框架.功能分解图可以帮助我们理清程序的框架,便于大局观的掌握. 用Visio2010创建功能分解 ...
- 前谷歌工程师:如何看待程序员普遍缺乏数据结构和算法知识?
很多技术人都很迷茫,觉得自己做的项目没有技术含量,成天就是卖苦力.技术的东西,日新月异,有些人总在忙于追求热点新技术,东学学.西学学,平时泛泛地看技术书籍.技术文章,但始终根本抓不住技术的本质,干了三 ...
- Google工程师:如何看待程序员普遍缺乏数据结构和算法知识?
出处:极客时间<数据结构与算法之美> 很多技术人都很迷茫,觉得自己做的项目没有技术含量,成天就是卖苦力.技术的东西,日新月异,有些人总在忙于追求热点新技术,东学学.西学学,平时泛泛地看技术 ...
- 电气期刊论文实现:基于改进遗传算法的电力机组组合(程序讲解)
个人电气博文传送门链接: 学好电气全靠它,个人电气博文目录(持续更新中-) 专栏解锁是可以看这个专栏所有文章一年,不只是看这一篇文章.淘宝代写一篇论文几百元,我这里算白菜价. 机组组合 程序讲 ...
- 如何看待 70% 的程序员,缺乏数据结构和算法知识?
金三银四来了,各大厂动静不小,都在储备人才,绝对是程序员面试的黄金时间了,不少同学也在后台反馈面试中遇到的一些问题,所以今天想跟大家说说算法. 说起算法,那大厂面试是绝对必考的,可以说是一块大厂的敲门 ...
- 70%以上程序员,不懂数据结构和算法!
金三银四马上到来,各个公司的动静不小,都在储备人才,绝对是程序员的面试黄金时间了,想换工作的人一大把,所以今天想再说说算法. 说起算法,那大厂面试是绝对必考的,可以说是一块大厂的敲门砖.毕竟掌握算法, ...
- ws2812b程序51单片机_51单片机串口通信程序详解
串口通信简介 串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件.一般完成这种功能的电路,我们称为串行接口电路 ...
最新文章
- C++ 智能指针std::shared_ptr简单使用和理解
- Subsonic使用中
- 《Effective Java读书笔记》--序列化
- 8个排序算法的稳定性总结
- Docker镜像分层和临时容器
- java中的解码和编码_关于java中编码和解码(一)
- [IE技巧] 让IE 以全屏模式启动
- python一到10整数的平方和_零基础学python_10_列表(创建数值列表 )
- HashMap的实现原理及其特点
- OpenCV 发起 Spatial AI挑战赛
- radiobutton 设置单选项目标
- Kafka 分布式消息队列介绍
- 电商设计师(美工)必备的素材网站|优图!
- wcf服务契约代理链
- HTTP::Request
- RPC框架dubbo架构原理及使用说明
- 简单解决某盘限速?(黑科技)【油猴】+【某盘直链下载器】+【IDM下载】
- jdk目录详解及其使用方法
- 超详细纯前端导出excel并完成各种样式的修改(xlsx-style)
- SDN:mininet交换机流表操作