Physics365/991CN-X-CW-Decompilation

教程内容请求

Opened this issue · 35 comments

教程内容请求

大家对教程内容有什么补充的要求,可以补充在这个Issue里
分为两个部分:

  1. 缺失知识点/模块(如缺失Σ溢出的方法)
  2. 缺失对内容的解释(看不懂)
  3. 排版建议

Contributors直接更新下面我的评论2,3,4即可。(请使用任务列表)

缺失知识点/模块

缺失对内容的解释

  • 991CN X (VerC) 异常教程/第三章 变量与历史记录 中an下刷字符的方法不全的说

    其实有相当多的方法(大佬们应该更熟悉的说),各有其便利性,教程里给出的这个有点繁复,像

    F.__ __ __ __ __ __ __ x10 __ 
    xin->cm:
    x:
    xin->cm:
    @=1.0000__ __ __ __ __ x10 __
    

    这个和

    xin->cm:
    x:
    xin->cm:
    @=10000__ [__ __ __] 23
    

    这个都满方便而且常用的
    (也许可以单独列一个附录的说)

  • reference from #29 对于利用变量的copy方法解释有一定缺失,同时(可能)有错误

  • 优化部分过于晦涩的表述(详见讨论页

排版建议

  • 精简不必要的章节分割(详见讨论页
  • 更好的练习/例题体系:在正文中穿插讲解例题,在章末留下练习,在附录留下练习解答。
  • (可选)更直观的计算器操作讲解形式(详见讨论页

缺失对内容的解释

reference from #29 对于利用变量的copy方法解释有一定缺失,同时(可能)有错误

缺失对内容的解释

991CN X (VerC) 异常教程/第三章 变量与历史记录 中an下刷字符的方法不全的说
其实有相当多的方法(大佬们应该更熟悉的说),各有其便利性,教程里给出的这个有点繁复,像

F.__ __ __ __ __ __ __ x10 __ 
xin->cm:
x:
xin->cm:
@=1.0000__ __ __ __ __ x10 __

这个和

xin->cm:
x:
xin->cm:
@=10000__ [__ __ __] 23

这个都满方便而且常用的
(也许可以单独列一个附录的说)

觉得现有建议不妥或不予考虑的话可以像这样划掉

觉得教程有要补充的就直接写上去好了,其实没必要开issue

rop基本原理的教程已经写好了。我的水平只能做这么多,剩余的部分,只好以俟君子,@Xyzstk 能否帮助一下?

觉得教程有要补充的就直接写上去好了,其实没必要开issue

实际上是因为我也不太会!的说!

现在教程里缺一大块rop的内容,由于我自己也不会,所以没法写,@Xyzstk 能否帮助一下

大佬已经很厉害了(那个内存修改器就很好的说

觉得教程有要补充的就直接写上去好了,其实没必要开issue

这地方倒是更像一个「待办事项清单」😂

@qiufuyu123 教程需要补一些例子,你看下能不能直接把知乎文章弄过来(我没账号看不了知乎)

ok,就是rop那一部分是吧?但是知乎没法直接导出markdown,得等我复制粘贴一遍 🥲

不过我找到自动导出工具了

md文件在这里

commit

这里只提交了md文件,资源(jpg)存储在云盘,见下方

image

@EwTE-H

觉得教程有要补充的就直接写上去好了,其实没必要开issue

这地方倒是更像一个「待办事项清单」😂

是不是可以放到github的project里。。。不过classic的project我没找到就是了

缺失知识点/模块

* [ ]  缺失Σ溢出的方法

* [ ]  缺失按键检测原理(KI KO那个)

* [ ]  缺失刷各种数量的字符的专题

* [ ]  指出地址的储存、打出与使用方法(小端序)

* [x]  [https://github.com/Physics365/991CN-X-CW-Decompilation/blob/main/ROP/复杂ROP程序/fx991cnx/内存写入/quickcpy_0xd820.bin](https://github.com/Physics365/991CN-X-CW-Decompilation/blob/main/ROP/%E5%A4%8D%E6%9D%82ROP%E7%A8%8B%E5%BA%8F/fx991cnx/%E5%86%85%E5%AD%98%E5%86%99%E5%85%A5/quickcpy_0xd820.bin) 处的文件在lfs变基时丢失

* [ ]  卡西欧991cnx的许多内置的未列出的字符的功能(比如81的(/@是平方和),可以单独列个表的说。不需要长的ropchain也能用说实在有些时候很方便的说,比如Intg(,可以直接算[x]的说

@Physics365

对于按键检测的话,可以去搜搜矩阵键盘扫描,rom也dump了,也有ghidra,可以看看源代码?

刷字符真的没必要,quickcpy/4d变量+字符表搞定

地址只是采用了小端序表示而已,你只要点出是和字节自然书写顺序相反就行了
比如0x11223344只要点出其字节表示为:
44 33 22 11就行了

没必要列出991cnx的未使用字符功能,使用这些未使用字符的功能也麻烦很多(CWII就更不要说了),也不会有多出Rom能力之外的功能(比如Gamma),并且根据Rom不同可能性质也不同
不过Intg(这样的应该是卡西欧程序员懒得删了,因为这种代码可能被程序的其他地方使用(比如Fix数位显示代码),删除了不会减少多少rom大小
像大Π这样的就彻底被移除了,不过还是可以用e sigma ln这样的方法来算,其实影响不大

题外话,楼主是最近在学日语ですかdesuka
"的说"这个口癖影响我理解语句了

另外,建议移除无意义的乱码字符,这些乱码字符会影响CWII的学习,因为CWII采用了新的一二级转换表,没有之前的bug了
不过乱码字符的特性确实可以很方便的看出来字符的二进制表示...
另外试试将一二级字符表做成纯文字版,加上字体?(这个是可行的,一级字符显示前会被转换为二级字符)
此外,一级字符和二级字符,多字节双字节字符 控制字符之类的字符的命名问题应该需要探讨一下(毕竟这些其实是历史遗留),这些很容易误导新手理解

我的建议是:
一级字符改为: 算术字符
二级字符改为: 显示字符
双字节字符改为: 双字节(算术)字符
控制字符改为: ROP函数(gadget)

这个可以讨论一下

缺失知识点/模块

* [ ]  缺失Σ溢出的方法

* [ ]  缺失按键检测原理(KI KO那个)

* [ ]  缺失刷各种数量的字符的专题

* [ ]  指出地址的储存、打出与使用方法(小端序)

* [x]  [https://github.com/Physics365/991CN-X-CW-Decompilation/blob/main/ROP/复杂ROP程序/fx991cnx/内存写入/quickcpy_0xd820.bin](https://github.com/Physics365/991CN-X-CW-Decompilation/blob/main/ROP/%E5%A4%8D%E6%9D%82ROP%E7%A8%8B%E5%BA%8F/fx991cnx/%E5%86%85%E5%AD%98%E5%86%99%E5%85%A5/quickcpy_0xd820.bin) 处的文件在lfs变基时丢失

* [ ]  卡西欧991cnx的许多内置的未列出的字符的功能(比如81的(/@是平方和),可以单独列个表的说。不需要长的ropchain也能用说实在有些时候很方便的说,比如Intg(,可以直接算[x]的说

@Physics365

对于按键检测的话,可以去搜搜矩阵键盘扫描,rom也dump了,也有ghidra,可以看看源代码?

刷字符真的没必要,quickcpy/4d变量+字符表搞定

刷字符还是满有用的说,放在附录也许会比较好的说

地址只是采用了小端序表示而已,你只要点出是和字节自然书写顺序相反就行了 比如0x11223344只要点出其字节表示为: 44 33 22 11就行了

这个还是提一下比较好的说

没必要列出991cnx的未使用字符功能,使用这些未使用字符的功能也麻烦很多(CWII就更不要说了),也不会有多出Rom能力之外的功能(比如Gamma),并且根据Rom不同可能性质也不同 不过Intg(这样的应该是卡西欧程序员懒得删了,因为这种代码可能被程序的其他地方使用(比如Fix数位显示代码),删除了不会减少多少rom大小 像大Π这样的就彻底被移除了,不过还是可以用e sigma ln这样的方法来算,其实影响不大

这些其实有个别的(比如Intg,在算下取整的累加时很有用)还是满好用的说,弄一下还是有意义的也许,而且也可以补充一下字符表指出那些可以用lbf就能刷,这样对于比较新手的人来说也方便,而且能直接一点看到教程的学习的成效的说

题外话,楼主是最近在学日语ですか(desuka) "的说"这个口癖影响我理解语句了

呐,"的说"是我的个人口癖的说,如果要写教程的话不会带到教程里,但是平常回复的话也没办法的说

另外,建议移除无意义的乱码字符,这些乱码字符会影响CWII的学习,因为CWII采用了新的一二级转换表,没有之前的bug了 不过乱码字符的特性确实可以很方便的看出来字符的二进制表示... 另外试试将一二级字符表做成纯文字版,加上字体?(这个是可行的,一级字符显示前会被转换为二级字符) 此外,一级字符和二级字符,多字节双字节字符 控制字符之类的字符的命名问题应该需要探讨一下(毕竟这些其实是历史遗留),这些很容易误导新手理解

无意义的字符的话就指明无意义也许可以的说

我的建议是: 一级字符改为: 算术字符 二级字符改为: 显示字符 双字节字符改为: 双字节(算术)字符 控制字符改为: ROP函数(gadget)

这个可以讨论一下

主要是几个字符之间有重叠(比如rop与一二级字符),按分类的话会很难分的说,所以还是按十六进制编号顺序排列会比较好的说

不建议把控制字符放在字符表里,因为控制字符的本质是函数地址,应该归到rop一类里去
字符表就分1,2级字符就够了

不建议把控制字符放在字符表里,因为控制字符的本质是函数地址,应该归到rop一类里去 字符表就分1,2级字符就够了

不,我没提控制字符是字符,我的意思是,1,2级字符的说法有迷惑性,应该考虑改名,如果是针对新手的话

1,2级字符是早期研究拼字遗留的,这个命名在通常语境下不具有任何意义

没必要列出991cnx的未使用字符功能,使用这些未使用字符的功能也麻烦很多(CWII就更不要说了),也不会有多出Rom能力之外的功能(比如Gamma),并且根据Rom不同可能性质也不同 不过Intg(这样的应该是卡西欧程序员懒得删了,因为这种代码可能被程序的其他地方使用(比如Fix数位显示代码),删除了不会减少多少rom大小 像大Π这样的就彻底被移除了,不过还是可以用e sigma ln这样的方法来算,其实影响不大

这些其实有个别的(比如Intg,在算下取整的累加时很有用)还是满好用的说,弄一下还是有意义的也许,而且也可以补充一下字符表指出那些可以用lbf就能刷,这样对于比较新手的人来说也方便,而且能直接一点看到教程的学习的成效的说

@Physics365
我推测,异常字符的作用效果是可能随着机型甚至版本改变的(卡西欧也没必要保证异常字符能工作),这些和rom的函数和数据偏移和内容不同有关,甚至对于cwi,乱码也是会因为rom变化而改变的
不过,关于异常字符的特性的话可以考虑用ui自动化对着模拟器去刷?我自己之前就用模拟器+ui自动化刷了个字符表
毕竟字符用法也就那几种,ocr一下错误类型或者直接读取stacktrace和寄存器判断就行了

不建议把控制字符放在字符表里,因为控制字符的本质是函数地址,应该归到rop一类里去 字符表就分1,2级字符就够了

不,我没提控制字符是字符,我的意思是,1,2级字符的说法有迷惑性,应该考虑改名,如果是针对新手的话

1,2级字符是早期研究拼字遗留的,这个命名在通常语境下不具有任何意义

是否可以改成单字节/双字节字符表的说¿

没必要列出991cnx的未使用字符功能,使用这些未使用字符的功能也麻烦很多(CWII就更不要说了),也不会有多出Rom能力之外的功能(比如Gamma),并且根据Rom不同可能性质也不同 不过Intg(这样的应该是卡西欧程序员懒得删了,因为这种代码可能被程序的其他地方使用(比如Fix数位显示代码),删除了不会减少多少rom大小 像大Π这样的就彻底被移除了,不过还是可以用e sigma ln这样的方法来算,其实影响不大

这些其实有个别的(比如Intg,在算下取整的累加时很有用)还是满好用的说,弄一下还是有意义的也许,而且也可以补充一下字符表指出那些可以用lbf就能刷,这样对于比较新手的人来说也方便,而且能直接一点看到教程的学习的成效的说

@Physics365 我推测,异常字符的作用效果是可能随着机型甚至版本改变的(卡西欧也没必要保证异常字符能工作),这些和rom的函数和数据偏移和内容不同有关,甚至对于cwi,乱码也是会因为rom变化而改变的 不过,关于异常字符的特性的话可以考虑用ui自动化对着模拟器去刷?我自己之前就用模拟器+ui自动化刷了个字符表 毕竟字符用法也就那几种,ocr一下错误类型或者直接读取stacktrace和寄存器判断就行了

至少Intg等等在991cnx的verc和verf里都能用,所以仅对于cnx来讲还是能用的,而且最主要是对于很多新手来说,如果没办法有非常显著而且易得的成果就会有点吸引力缺失,而这些字符个别也的确很有用。其实更重要的是指出哪些单字节字符可以直接用lbf去刷,这个能省不少事而且还满常用的

如果能自动判断的话就更方便了的说

不建议把控制字符放在字符表里,因为控制字符的本质是函数地址,应该归到rop一类里去 字符表就分1,2级字符就够了

不,我没提控制字符是字符,我的意思是,1,2级字符的说法有迷惑性,应该考虑改名,如果是针对新手的话
1,2级字符是早期研究拼字遗留的,这个命名在通常语境下不具有任何意义

是否可以改成单字节/双字节字符表的说¿

@fish4terrisa-MSDSM

你这就是没有怎么分清单字节双字节 一级二级了

单字节双字节和内容有关的,大部分函数都会对其进行处理,是字符本身的特性

一级二级则是因为被不同的函数解释而导致的,在编辑公式的时候,就是一级字符,显示到屏幕上面的,就是二级字符,这是和被什么函数使用相关的

不建议把控制字符放在字符表里,因为控制字符的本质是函数地址,应该归到rop一类里去 字符表就分1,2级字符就够了

不,我没提控制字符是字符,我的意思是,1,2级字符的说法有迷惑性,应该考虑改名,如果是针对新手的话
1,2级字符是早期研究拼字遗留的,这个命名在通常语境下不具有任何意义

是否可以改成单字节/双字节字符表的说¿

@fish4terrisa-MSDSM

你这就是没有怎么分清单字节双字节 一级二级了

单字节双字节和内容有关的,大部分函数都会对其进行处理,是字符本身的特性

一级二级则是因为被不同的函数解释而导致的,在编辑公式的时候,就是一级字符,显示到屏幕上面的,就是二级字符,这是和被什么函数使用相关的

哦哦,这个啊,那是我弄错了,那么原来的一级字符表就叫单字节字符表,然后二级作为映射或者拼字字符表行不行的说?

不建议把控制字符放在字符表里,因为控制字符的本质是函数地址,应该归到rop一类里去 字符表就分1,2级字符就够了

不,我没提控制字符是字符,我的意思是,1,2级字符的说法有迷惑性,应该考虑改名,如果是针对新手的话
1,2级字符是早期研究拼字遗留的,这个命名在通常语境下不具有任何意义

是否可以改成单字节/双字节字符表的说¿

@fish4terrisa-MSDSM
你这就是没有怎么分清单字节双字节 一级二级了
单字节双字节和内容有关的,大部分函数都会对其进行处理,是字符本身的特性
一级二级则是因为被不同的函数解释而导致的,在编辑公式的时候,就是一级字符,显示到屏幕上面的,就是二级字符,这是和被什么函数使用相关的

哦哦,这个啊,那是我弄错了,那么原来的一级字符表就叫单字节字符表,然后二级作为映射或者拼字字符表行不行的说?

不是这样的,公式中的字符也有双字节的,两者是互不干扰的

比如单位转换就都是FE开头的双字节字符,但是它不属于二级字符,而是一级字符

@Physics365
教程内容不考虑在内存区域添加SFR的内容吗?

data段0xf000往上就是sfr区域了,包含屏幕帧缓冲区,对比度,屏幕控制,待机,定时器等特殊功能的控制

btw: sfr==special function register 特殊功能寄存器

同意

不建议把控制字符放在字符表里,因为控制字符的本质是函数地址,应该归到rop一类里去 字符表就分1,2级字符就够了

不,我没提控制字符是字符,我的意思是,1,2级字符的说法有迷惑性,应该考虑改名,如果是针对新手的话
1,2级字符是早期研究拼字遗留的,这个命名在通常语境下不具有任何意义

是否可以改成单字节/双字节字符表的说¿

@fish4terrisa-MSDSM
你这就是没有怎么分清单字节双字节 一级二级了
单字节双字节和内容有关的,大部分函数都会对其进行处理,是字符本身的特性
一级二级则是因为被不同的函数解释而导致的,在编辑公式的时候,就是一级字符,显示到屏幕上面的,就是二级字符,这是和被什么函数使用相关的

哦哦,这个啊,那是我弄错了,那么原来的一级字符表就叫单字节字符表,然后二级作为映射或者拼字字符表行不行的说?

不是这样的,公式中的字符也有双字节的,两者是互不干扰的

比如单位转换就都是FE开头的双字节字符,但是它不属于二级字符,而是一级字符

的确双字节字符是一级字符,但二级字符(也就是拼字的时候显示时字节对应的字符)表里应该都是单字节对应一个字符的吧,我的意思是:

原一级字符表 => 
             单字节字符表
             双字节字符表(FAXX,FBXX...)
原二级字符表 =>
             映射(拼字)字符表

这样行不行

但二级字符(也就是拼字的时候显示时字节对应的字符)表里应该都是单字节对应一个字符的吧

NO

image

但二级字符(也就是拼字的时候显示时字节对应的字符)表里应该都是单字节对应一个字符的吧

NO

image

emmm...那就分成

原一级字符表 => 
             单字节字符表
             双字节字符表(FAXX,FBXX...)
原二级字符表 =>
             映射(拼字)字符表
             映射(拼字)汉字字符表

如何

可以

但二级字符(也就是拼字的时候显示时字节对应的字符)表里应该都是单字节对应一个字符的吧

NO
image

emmm...那就分成

原一级字符表 => 
             单字节字符表
             双字节字符表(FAXX,FBXX...)
原二级字符表 =>
             映射(拼字)字符表
             映射(拼字)汉字字符表

如何

@fish4terrisa-MSDSM

在非中文机型上,双字节的二级字符不一定是中文,中文和日语共用字节开头(0xF1 0xF2),0xF3 0xF4都是其他语言机型的字节开头,还有0xF0里面在Cwii中存储了一些符号,这些也不属于汉字

由于拼字字符不需要用到双字节字符的特性(因为也没办法编辑)

所以我建议:

将二级字符统一改为映射(拼字)字符

特别标注其为双字节是无意义的

但二级字符(也就是拼字的时候显示时字节对应的字符)表里应该都是单字节对应一个字符的吧

NO
image

emmm...那就分成

原一级字符表 => 
             单字节字符表
             双字节字符表(FAXX,FBXX...)
原二级字符表 =>
             映射(拼字)字符表
             映射(拼字)汉字字符表

如何

@fish4terrisa-MSDSM

在非中文机型上,双字节的二级字符不一定是中文,中文和日语共用字节开头(0xF1 0xF2),0xF3 0xF4都是其他语言机型的字节开头,还有0xF0里面在Cwii中存储了一些符号,这些也不属于汉字

由于拼字字符不需要用到双字节字符的特性(因为也没办法编辑)

所以我建议:

将二级字符统一改为映射(拼字)字符

特别标注其为双字节是无意义的

好的