染成茜色的坂道破解技术内幕之内功提高篇,成为真正的程序员

本文介绍了汇编语言的基础知识,并通过实例讲解了指针的概念。同时,深入探讨了如何利用API进行字体设置,以实现游戏的汉化工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

染成茜色的坂道破解技术内幕之基础知识

在大学中最头疼的两门语言莫过于C和汇编
汇编语言 C语言难学几乎成了流传
特别是C的指针
实际上理解汇编,C的指针就很好理解了
有人说不懂C和汇编的不算真正程序员

本文带大家成为真正程序员<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

1认识汇编:
 moveax,1000h
addeax,4000h
subeax,2000h
calldumpregs

假如说我们是厨师,我们就要了解刀子,汤勺,炉子的用法(怎么老想起染红动画第二话)
汇编不像C,它是和硬件打交道的
CPU有存储单元 叫寄存器,速度快过内存 这个是常识。
基本寄存器:32位汇编
EAX  EBP
EBXESP
ECXESI
EDXEDI
这些寄存器使用有规则的,具体可以看看汇编的书
另外还有些段寄存器

上面的语句就类似于: 
EAX <- 1000h;mov 是move的助记,相当于拷贝,16进制数尾部都标有H 作为记号
EAX <- (EAX+4000h) ;SUB和ADD是很简单的单词
EAX <- (EAX-2000h) 
调用dumpregs 用于显示;自定义的过程、函数

[]和指针 
最难的就是这些东西了
大师用个最常见的例子告诉大家:
坑神要给大师个文件,比如 あかね色に染まる坂
坑神一般不直接传,而是上传到FTP或者其他地方
然后给大师给下载链接


游戏本体就相当于 数据,而下载链接就是指针,指针其实也是个数,用来存地址

比如
.data
val1BYTE10h
.code
movesi,OFFSETval1;val1的地址 -〉esi
movAL,[esi];将esi的数据作为 地址,找该地址的数据,ESI数据假如是5000H地址,那么把内存地址为5000H的数据-〉AL,而指针就是ESI,地址是5000H

示例:
int_tmain(intargc,_TCHAR*argv[])
{
inta,b=0;
a=43;
b=a;
return0;
}

在VC++中设置断点
然后选择查看汇编窗口
inta,b=0;
013717CEmovdwordptr[b],0
a=43;
013717D5movdwordptr[a],2Bh
b=a;
013717DCmoveax,dwordptr[a]
013717DFmovdwordptr[b],eax
return0;
013717E2xoreax,eax
}
013717

断点是什么?
排练的时候教练会叫大家:停
然后指出问题后继续

断点就是让程序停在那里,咱们可以仔细研究
这是研究程序很重要方法

013717CEmovdwordptr[b],0
这是什么意义?
dwordptr是伪指令,人们发现光IntelCPU指令还是不行,比如要定义数据大小的指令都没有,所以我们的编译器(老师应该说过,比如MASM,VC++)都会有自己可以识别但不是

IntelCPU指令的指令
dword是一种数据类型,dwordPtr就是正版的定义指针指向内存
上面的那句相当于
b本身是个指针
先读b找到地址
把地址存的数据再作为指针
最后把0送到目标内存地址

把上面两句话合一了
其实就是一个功能把0-〉目标内存地址

你肯定会说,怎么那么麻烦
直接
mov[b],0
试试看
mov[b],0可以吗?为什么?

用刚才的例子: 坑神姐姐认为论坛FTP不方便,于是就上传网盘,然后给大师下载地址

此时无法直接下载的,网盘有防盗链系统。

我的闲话:汇编考完试,常听徒弟说,那啥,指令太多了,忙不过来。我就很奇怪,我做试卷的时候反而发现指令不多啊,就那么几条。。。。。。
实际上,真正用到的指令确实不多,所以有人提出RISC和CISC之争。

现在打开调试器,大家会发现,无从下手
为什么呢?就像游戏一样,最终BOSS都不知道,怎么开战?

还有人问: 大师,你昏了吧,又不叫你输CDKEY ,破解了干什么?

galgame 游戏汉化和galgame 游戏翻译入门经典教程

提到,区位码问题,直接灌中文会乱码

API是什么?
搞C/C++编程,必须掌握API

类似这样的语句大家见过吧:
cout<<endl
cout就是C++函数,是C++系统提供的
同样我们要搞windows开发,必定用到windows提供的函数,只不过换个名字
API(ApplicationProgrammingInterface,应用程序编程接口)

染红必定使用了字体的API我们的任务就是修改这个函数

MSDN是什么?
微软给我们的电子字典,英语不懂查朗文或者牛津,程序要查MSDN
想想看创造字体的函数会叫啥?
启动MSDN(也可以去在线网站)
找到下面函数:

HFONTCreateFont(
intnHeight,//heightoffont
intnWidth,//averagecharacterwidth
intnEscapement,//angleofescapement
intnOrientation,//base-lineorientationangle
intfnWeight,//fontweight
DWORDfdwItalic,//italicattributeoption
DWORDfdwUnderline,//underlineattributeoption
DWORDfdwStrikeOut,//strikeoutattributeoption
DWORDfdwCharSet,//charactersetidentifier
DWORDfdwOutputPrecision,//outputprecision
DWORDfdwClipPrecision,//clippingprecision
DWORDfdwQuality,//outputquality
DWORDfdwPitchAndFamily,//pitchandfamily
LPCTSTRlpszFace//typefacename
);

有时候视野要看开,比如下面这段信息是EnumFontFamiliesEx内容,却很重要

TheEnumFontFamiliesExfunctionenumeratesallfontsinthesystemthatmatchthefontcharacteristicsspecifiedbytheLOGFONTstructure.EnumFontFamiliesEx

enumeratesfontsbasedontypefacename,characterset,orboth.

TogettheappropriatefontondifferentlanguageversionsoftheOS,callEnumFontFamiliesExwiththedesiredfontcharacteristicsintheLOGFONTstructure,

retrievetheappropriatetypefacename,andcreatethefontusingCreateFontorCreateFontIndirect.

估计大家看E文很浮云,但是一个真正的程序员E文必须很好
上面
EnumFontFamiliesEx就是初始化选择字体的函数,告诉程序有那些字体可用,CreateFont用来创造字体
其中也包括characterset
这些就是要修改的BOSS
总的来说就是要修改程序的CreateFont或者CreateFontIndirect还有EnumFontFamiliesEx
将characterset改为中文,这样染红就可以显示中文了

查资料
DWORDfdwCharSet,//charactersetidentifier
字符集值
ANSI_CHARSET0
DEFAULT_CHARSET1
SYMBOL_CHARSET2
MAC_CHARSET77
SHIFTJI_CHARSET128日文
HANGEUL_CHARSET129
HANGUL_CHARSET129
JOHAB_CHARSET130
GB2312_CHARSET134简体中文
CHINESEBIG5_CHARSET136繁体中文
GREEK_CHARSET161
TURKISH_CHARSET162
VIETNAMESE_CHARSET163
HEBREW_CHARSET177
ARABIC_CHARSET178
BALTIC_CHARSET186
RUSSIAN_CHARSET204
THAI_CHARSET222
EASTEUROPE_CHARSET238
OEM_CHARSET255

一般来说汇编用16进制数据,记不记得上面汇编也是16进制
简单地说,要使程序能正常使用中文,就是要把程序中字符集的值由80改成0x86或者0x88(繁体),
提示:16进制数转换用计算器

由于在Vista下那个所谓的OllyDebug汉化无非用,我找了OllyICE
OllyICE是爱好者继续开发OllyDebug的东西,也是换个名字,都差不多

<!--EndFragment--> 染成茜色的坂道破解技术内幕之实战篇
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值