123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676 |
- <!DOCTYPE html><html><head>
- <title>逆向规范</title>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
- <link rel="stylesheet" href="file:///c:\Users\Anderson\.vscode\extensions\shd101wyy.markdown-preview-enhanced-0.6.1\node_modules\@shd101wyy\mume\dependencies\katex\katex.min.css">
-
-
-
-
-
-
-
-
-
- <style>
- /**
- * prism.js Github theme based on GitHub's theme.
- * @author Sam Clarke
- */
- code[class*="language-"],
- pre[class*="language-"] {
- color: #333;
- background: none;
- font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
- text-align: left;
- white-space: pre;
- word-spacing: normal;
- word-break: normal;
- word-wrap: normal;
- line-height: 1.4;
- -moz-tab-size: 8;
- -o-tab-size: 8;
- tab-size: 8;
- -webkit-hyphens: none;
- -moz-hyphens: none;
- -ms-hyphens: none;
- hyphens: none;
- }
- /* Code blocks */
- pre[class*="language-"] {
- padding: .8em;
- overflow: auto;
- /* border: 1px solid #ddd; */
- border-radius: 3px;
- /* background: #fff; */
- background: #f5f5f5;
- }
- /* Inline code */
- :not(pre) > code[class*="language-"] {
- padding: .1em;
- border-radius: .3em;
- white-space: normal;
- background: #f5f5f5;
- }
- .token.comment,
- .token.blockquote {
- color: #969896;
- }
- .token.cdata {
- color: #183691;
- }
- .token.doctype,
- .token.punctuation,
- .token.variable,
- .token.macro.property {
- color: #333;
- }
- .token.operator,
- .token.important,
- .token.keyword,
- .token.rule,
- .token.builtin {
- color: #a71d5d;
- }
- .token.string,
- .token.url,
- .token.regex,
- .token.attr-value {
- color: #183691;
- }
- .token.property,
- .token.number,
- .token.boolean,
- .token.entity,
- .token.atrule,
- .token.constant,
- .token.symbol,
- .token.command,
- .token.code {
- color: #0086b3;
- }
- .token.tag,
- .token.selector,
- .token.prolog {
- color: #63a35c;
- }
- .token.function,
- .token.namespace,
- .token.pseudo-element,
- .token.class,
- .token.class-name,
- .token.pseudo-class,
- .token.id,
- .token.url-reference .token.variable,
- .token.attr-name {
- color: #795da3;
- }
- .token.entity {
- cursor: help;
- }
- .token.title,
- .token.title .token.punctuation {
- font-weight: bold;
- color: #1d3e81;
- }
- .token.list {
- color: #ed6a43;
- }
- .token.inserted {
- background-color: #eaffea;
- color: #55a532;
- }
- .token.deleted {
- background-color: #ffecec;
- color: #bd2c00;
- }
- .token.bold {
- font-weight: bold;
- }
- .token.italic {
- font-style: italic;
- }
- /* JSON */
- .language-json .token.property {
- color: #183691;
- }
- .language-markup .token.tag .token.punctuation {
- color: #333;
- }
- /* CSS */
- code.language-css,
- .language-css .token.function {
- color: #0086b3;
- }
- /* YAML */
- .language-yaml .token.atrule {
- color: #63a35c;
- }
- code.language-yaml {
- color: #183691;
- }
- /* Ruby */
- .language-ruby .token.function {
- color: #333;
- }
- /* Markdown */
- .language-markdown .token.url {
- color: #795da3;
- }
- /* Makefile */
- .language-makefile .token.symbol {
- color: #795da3;
- }
- .language-makefile .token.variable {
- color: #183691;
- }
- .language-makefile .token.builtin {
- color: #0086b3;
- }
- /* Bash */
- .language-bash .token.keyword {
- color: #0086b3;
- }
- /* highlight */
- pre[data-line] {
- position: relative;
- padding: 1em 0 1em 3em;
- }
- pre[data-line] .line-highlight-wrapper {
- position: absolute;
- top: 0;
- left: 0;
- background-color: transparent;
- display: block;
- width: 100%;
- }
- pre[data-line] .line-highlight {
- position: absolute;
- left: 0;
- right: 0;
- padding: inherit 0;
- margin-top: 1em;
- background: hsla(24, 20%, 50%,.08);
- background: linear-gradient(to right, hsla(24, 20%, 50%,.1) 70%, hsla(24, 20%, 50%,0));
- pointer-events: none;
- line-height: inherit;
- white-space: pre;
- }
- pre[data-line] .line-highlight:before,
- pre[data-line] .line-highlight[data-end]:after {
- content: attr(data-start);
- position: absolute;
- top: .4em;
- left: .6em;
- min-width: 1em;
- padding: 0 .5em;
- background-color: hsla(24, 20%, 50%,.4);
- color: hsl(24, 20%, 95%);
- font: bold 65%/1.5 sans-serif;
- text-align: center;
- vertical-align: .3em;
- border-radius: 999px;
- text-shadow: none;
- box-shadow: 0 1px white;
- }
- pre[data-line] .line-highlight[data-end]:after {
- content: attr(data-end);
- top: auto;
- bottom: .4em;
- }html body{font-family:"Helvetica Neue",Helvetica,"Segoe UI",Arial,freesans,sans-serif;font-size:16px;line-height:1.6;color:#333;background-color:#fff;overflow:initial;box-sizing:border-box;word-wrap:break-word}html body>:first-child{margin-top:0}html body h1,html body h2,html body h3,html body h4,html body h5,html body h6{line-height:1.2;margin-top:1em;margin-bottom:16px;color:#000}html body h1{font-size:2.25em;font-weight:300;padding-bottom:.3em}html body h2{font-size:1.75em;font-weight:400;padding-bottom:.3em}html body h3{font-size:1.5em;font-weight:500}html body h4{font-size:1.25em;font-weight:600}html body h5{font-size:1.1em;font-weight:600}html body h6{font-size:1em;font-weight:600}html body h1,html body h2,html body h3,html body h4,html body h5{font-weight:600}html body h5{font-size:1em}html body h6{color:#5c5c5c}html body strong{color:#000}html body del{color:#5c5c5c}html body a:not([href]){color:inherit;text-decoration:none}html body a{color:#08c;text-decoration:none}html body a:hover{color:#00a3f5;text-decoration:none}html body img{max-width:100%}html body>p{margin-top:0;margin-bottom:16px;word-wrap:break-word}html body>ul,html body>ol{margin-bottom:16px}html body ul,html body ol{padding-left:2em}html body ul.no-list,html body ol.no-list{padding:0;list-style-type:none}html body ul ul,html body ul ol,html body ol ol,html body ol ul{margin-top:0;margin-bottom:0}html body li{margin-bottom:0}html body li.task-list-item{list-style:none}html body li>p{margin-top:0;margin-bottom:0}html body .task-list-item-checkbox{margin:0 .2em .25em -1.8em;vertical-align:middle}html body .task-list-item-checkbox:hover{cursor:pointer}html body blockquote{margin:16px 0;font-size:inherit;padding:0 15px;color:#5c5c5c;background-color:#f0f0f0;border-left:4px solid #d6d6d6}html body blockquote>:first-child{margin-top:0}html body blockquote>:last-child{margin-bottom:0}html body hr{height:4px;margin:32px 0;background-color:#d6d6d6;border:0 none}html body table{margin:10px 0 15px 0;border-collapse:collapse;border-spacing:0;display:block;width:100%;overflow:auto;word-break:normal;word-break:keep-all}html body table th{font-weight:bold;color:#000}html body table td,html body table th{border:1px solid #d6d6d6;padding:6px 13px}html body dl{padding:0}html body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:bold}html body dl dd{padding:0 16px;margin-bottom:16px}html body code{font-family:Menlo,Monaco,Consolas,'Courier New',monospace;font-size:.85em !important;color:#000;background-color:#f0f0f0;border-radius:3px;padding:.2em 0}html body code::before,html body code::after{letter-spacing:-0.2em;content:"\00a0"}html body pre>code{padding:0;margin:0;font-size:.85em !important;word-break:normal;white-space:pre;background:transparent;border:0}html body .highlight{margin-bottom:16px}html body .highlight pre,html body pre{padding:1em;overflow:auto;font-size:.85em !important;line-height:1.45;border:#d6d6d6;border-radius:3px}html body .highlight pre{margin-bottom:0;word-break:normal}html body pre code,html body pre tt{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}html body pre code:before,html body pre tt:before,html body pre code:after,html body pre tt:after{content:normal}html body p,html body blockquote,html body ul,html body ol,html body dl,html body pre{margin-top:0;margin-bottom:16px}html body kbd{color:#000;border:1px solid #d6d6d6;border-bottom:2px solid #c7c7c7;padding:2px 4px;background-color:#f0f0f0;border-radius:3px}@media print{html body{background-color:#fff}html body h1,html body h2,html body h3,html body h4,html body h5,html body h6{color:#000;page-break-after:avoid}html body blockquote{color:#5c5c5c}html body pre{page-break-inside:avoid}html body table{display:table}html body img{display:block;max-width:100%;max-height:100%}html body pre,html body code{word-wrap:break-word;white-space:pre}}.markdown-preview{width:100%;height:100%;box-sizing:border-box}.markdown-preview .pagebreak,.markdown-preview .newpage{page-break-before:always}.markdown-preview pre.line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}.markdown-preview pre.line-numbers>code{position:relative}.markdown-preview pre.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:1em;font-size:100%;left:0;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.markdown-preview pre.line-numbers .line-numbers-rows>span{pointer-events:none;display:block;counter-increment:linenumber}.markdown-preview pre.line-numbers .line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right}.markdown-preview .mathjax-exps .MathJax_Display{text-align:center !important}.markdown-preview:not([for="preview"]) .code-chunk .btn-group{display:none}.markdown-preview:not([for="preview"]) .code-chunk .status{display:none}.markdown-preview:not([for="preview"]) .code-chunk .output-div{margin-bottom:16px}.scrollbar-style::-webkit-scrollbar{width:8px}.scrollbar-style::-webkit-scrollbar-track{border-radius:10px;background-color:transparent}.scrollbar-style::-webkit-scrollbar-thumb{border-radius:5px;background-color:rgba(150,150,150,0.66);border:4px solid rgba(150,150,150,0.66);background-clip:content-box}html body[for="html-export"]:not([data-presentation-mode]){position:relative;width:100%;height:100%;top:0;left:0;margin:0;padding:0;overflow:auto}html body[for="html-export"]:not([data-presentation-mode]) .markdown-preview{position:relative;top:0}@media screen and (min-width:914px){html body[for="html-export"]:not([data-presentation-mode]) .markdown-preview{padding:2em calc(50% - 457px + 2em)}}@media screen and (max-width:914px){html body[for="html-export"]:not([data-presentation-mode]) .markdown-preview{padding:2em}}@media screen and (max-width:450px){html body[for="html-export"]:not([data-presentation-mode]) .markdown-preview{font-size:14px !important;padding:1em}}@media print{html body[for="html-export"]:not([data-presentation-mode]) #sidebar-toc-btn{display:none}}html body[for="html-export"]:not([data-presentation-mode]) #sidebar-toc-btn{position:fixed;bottom:8px;left:8px;font-size:28px;cursor:pointer;color:inherit;z-index:99;width:32px;text-align:center;opacity:.4}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] #sidebar-toc-btn{opacity:1}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc{position:fixed;top:0;left:0;width:300px;height:100%;padding:32px 0 48px 0;font-size:14px;box-shadow:0 0 4px rgba(150,150,150,0.33);box-sizing:border-box;overflow:auto;background-color:inherit}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc::-webkit-scrollbar{width:8px}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc::-webkit-scrollbar-track{border-radius:10px;background-color:transparent}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc::-webkit-scrollbar-thumb{border-radius:5px;background-color:rgba(150,150,150,0.66);border:4px solid rgba(150,150,150,0.66);background-clip:content-box}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc a{text-decoration:none}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc ul{padding:0 1.6em;margin-top:.8em}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc li{margin-bottom:.8em}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .md-sidebar-toc ul{list-style-type:none}html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .markdown-preview{left:300px;width:calc(100% - 300px);padding:2em calc(50% - 457px - 150px);margin:0;box-sizing:border-box}@media screen and (max-width:1274px){html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .markdown-preview{padding:2em}}@media screen and (max-width:450px){html body[for="html-export"]:not([data-presentation-mode])[html-show-sidebar-toc] .markdown-preview{width:100%}}html body[for="html-export"]:not([data-presentation-mode]):not([html-show-sidebar-toc]) .markdown-preview{left:50%;transform:translateX(-50%)}html body[for="html-export"]:not([data-presentation-mode]):not([html-show-sidebar-toc]) .md-sidebar-toc{display:none}
- /* Please visit the URL below for more information: */
- /* https://shd101wyy.github.io/markdown-preview-enhanced/#/customize-css */
- </style>
- </head>
- <body for="html-export">
- <div class="mume markdown-preview ">
- <h3 class="mume-header" id="%E9%80%86%E5%90%91%E8%A7%84%E8%8C%83-v20220113">逆向规范 (v2022.01.13)</h3>
- <h4 class="mume-header" id="%E5%88%86%E6%9E%90%E8%A7%84%E8%8C%83-%E5%BC%BA%E5%88%B6%E8%A6%81%E6%B1%82">分析规范 [强制要求]</h4>
- <ul>
- <li>阅读每一行的汇编并深入理解其含义。</li>
- <li>研究清楚每一个函数的参数及返回值类型。</li>
- <li>研究清楚函数的属性,如类的成员函数,类的静态函数,全局函数等。</li>
- <li>研究清楚变量的属性,如全局变量,类的静态变量,赋初值的全局变量,无初值的全局变量。</li>
- <li><strong>严禁抄袭F5的代码,F5代码仅仅作为一种参考,发现是F5的代码直接拒绝(抄袭是可耻的)。</strong></li>
- <li>所有的逆向C++代码,必须是手工一行行敲出来的。</li>
- </ul>
- <hr>
- <h4 class="mume-header" id="%E5%87%BD%E6%95%B0%E5%91%BD%E5%90%8D%E8%A7%84%E8%8C%83-%E5%BC%BA%E5%88%B6%E8%A6%81%E6%B1%82">函数命名规范 [强制要求]</h4>
- <ul>
- <li>
- <p>函数如果有符号,要求必须与符号一致,不改变函数名</p>
- </li>
- <li>
- <p>函数头要有这个函数的地址,如001200A4, 不需要加上0x</p>
- </li>
- <li>
- <p>函数参数的命名与寄存器编号对应上<br>
- 如:int GetDataSize_OGLES(int i0, int i1, int i2, EFTTTexFormat eFormat3, int i4)<br>
- i0是通过R0寄存器传入的,又因为是int类型,因此命名为i0,其它的依次类推</p>
- <p>类的成员函数如:<br>
- void CFTTTextureOGLES::MallocDataSpace(int i1, int i2, int i3, EFTTTexFormat eFormat4, int i5)<br>
- 因为this指针是通过R0传入是,所以其它的参数是从R1开始的,因此i1是通过R1传入的,将它命名成i1, 其它的依次类推</p>
- </li>
- </ul>
- <hr>
- <h4 class="mume-header" id="%E5%8F%98%E9%87%8F%E5%91%BD%E5%90%8D%E8%A7%84%E8%8C%83-%E5%BC%BA%E5%88%B6%E8%A6%81%E6%B1%82">变量命名规范 [强制要求]</h4>
- <ul>
- <li>变量如果有符号,要求必须与符号一致,不改变变量名, 在定义变量的位置后加上该变量在IDA中的地址</li>
- <li>类成员变量命名在变量后一定要加上 "_XX", 其中XX是16进制偏移,变量在类中的偏移地址<br>
- 如:<br>
- uchar *pData_18;<br>
- GLuint textures_1C; <strong>注意1C要大写</strong></li>
- <li>寄存器的局部变量命名,rx_xxxx, 如r1寄存器,r1_count;</li>
- <li>栈上局部变量命名, 变量后一定要加上 "_XX", 其中XX是16进制偏移,该变量在栈中的偏移地址,如internalFormat_98</li>
- <li>变量的命名要求尽可能的短,如:<br>
- bool b_1C; //小写b表示bool类型<br>
- int i_8 //小写i表示int类型<br>
- int* pi_8 //小写p表示指针类型<br>
- uint ui_C //小写ui表示指针类型<br>
- 在本文档最后有详细的命名规范</li>
- <li><strong>全局变量统一定义在CPP的头部</strong></li>
- </ul>
- <hr>
- <h4 class="mume-header" id="%E5%9C%B0%E5%9D%80%E8%A7%84%E8%8C%83-%E5%BC%BA%E5%88%B6%E8%A6%81%E6%B1%82">地址规范 [强制要求]</h4>
- <ul>
- <li>
- <p>函数的定义和实现的位置的上一行,需要有写下函数的地址 //0018872C;</p>
- <ul>
- <li>函数的地址强制要求是16进制大写如,0018872C,注意一定不能加0x</li>
- <li>// 与 后面的地址中间没有空格连在一起 //0018872C</li>
- <li>
- <pre data-role="codeBlock" data-info="c++" class="language-cpp"><span class="token comment">//001bf86C <-- 地址大写且//与地址间没有空格,不能加0x</span>
- <span class="token keyword keyword-void">void</span> <span class="token class-name">CGfxPrecipitation</span><span class="token double-colon punctuation">::</span><span class="token function">Update</span><span class="token punctuation">(</span><span class="token keyword keyword-bool">bool</span> b1<span class="token punctuation">)</span>
- 请严格按照这个格式来写
- </pre></li>
- </ul>
- </li>
- <li>
- <p>函数中每个"{ "}" 都要有对应的地址,如if语句开始位置,if体开始位置,else体开始位置,if结束位置都需要写上地址<br>
- 其它的语句如 for , while, switch等都需要写上地址</p>
- </li>
- <li>
- <p>调用子函数的时,需要加上调用的地址</p>
- </li>
- <li>
- <p>这么做的必要性在于,将逆向人员分析的结果一定承度上保留下来,方便自己或其他人重新检查这段代码</p>
- </li>
- </ul>
- <p><strong>请仔细阅读下面的例子,并严格按照规范来书写代码,否则代码视为无效,将被退回重写</strong></p>
- <pre data-role="codeBlock" data-info="c++" class="language-cpp"><span class="token comment">//001F2060 <- **此处必须要有函数的首地址**</span>
- <span class="token keyword keyword-void">void</span> <span class="token function">FE_LoadLanguageText</span><span class="token punctuation">(</span><span class="token keyword keyword-int">int</span> i0<span class="token punctuation">,</span> <span class="token keyword keyword-bool">bool</span> b1<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//i0 对应寄存器R0,b1 对应寄存器R1</span>
- <span class="token function">LOGI</span><span class="token punctuation">(</span><span class="token string">"FE_LoadLanguageText: Entry"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
- <span class="token comment">//001F207C <- **此处必须要有if语句比较的地址**</span>
- <span class="token keyword keyword-if">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>bLoadLanguageText_4B7E3C <span class="token operator">||</span> b1<span class="token punctuation">)</span> <span class="token punctuation">{</span>
- <span class="token comment">//001F2084 <- **此处必须要有if语句开始的首地址**</span>
- <span class="token keyword keyword-if">if</span> <span class="token punctuation">(</span>g_pTextDbs <span class="token operator">!=</span> <span class="token keyword keyword-nullptr">nullptr</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
- <span class="token comment">//001F2090 <- **此处必须要有if语句开始的首地址**</span>
- <span class="token keyword keyword-delete">delete</span><span class="token punctuation">[</span><span class="token punctuation">]</span> g_pTextDbs<span class="token punctuation">;</span>
- <span class="token punctuation">}</span>
- <span class="token comment">//loc_1F20B4 <- **此处必须要有if语句结束地址**</span>
- g_pTextDbs <span class="token operator">=</span> <span class="token keyword keyword-nullptr">nullptr</span><span class="token punctuation">;</span> <span class="token comment">//001F20B8 STR R0, [R4]</span>
- g_pTextDbs <span class="token operator">=</span> <span class="token keyword keyword-new">new</span> CFTTLangDatabase<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">//001F20E4 STR R6, [R4]</span>
- <span class="token comment">//001F20F0 <- **此处必须要有if语句开始的首地址**</span>
- <span class="token keyword keyword-if">if</span> <span class="token punctuation">(</span>STY_tConfig<span class="token punctuation">.</span>DownloadListAdText_63A4 <span class="token operator">>=</span> <span class="token number">0x80D</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
- <span class="token comment">//001F20F4 <- **此处必须要有if语句开始的首地址**</span>
- <span class="token keyword keyword-char">char</span> buf_A8<span class="token punctuation">[</span><span class="token number">128</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// <- _A8 表示这个变量在栈上的位置</span>
- <span class="token function">snprintf</span><span class="token punctuation">(</span>buf_A8<span class="token punctuation">,</span> <span class="token number">128</span><span class="token punctuation">,</span> <span class="token string">"scw_lang_%i.xlc"</span><span class="token punctuation">,</span> STY_tConfig<span class="token punctuation">.</span>DownloadListAdText_63A4<span class="token punctuation">)</span><span class="token punctuation">;</span>
- <span class="token keyword keyword-char">char</span> buf_128<span class="token punctuation">[</span><span class="token number">128</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// <- _128 表示这个变量在栈上的位置</span>
- <span class="token function">snprintf</span><span class="token punctuation">(</span>buf_128<span class="token punctuation">,</span> <span class="token number">128</span><span class="token punctuation">,</span> <span class="token string">"SUPPORT:%s"</span><span class="token punctuation">,</span> buf_A8<span class="token punctuation">)</span><span class="token punctuation">;</span>
- <span class="token comment">//001F2118 <- **此处必须要有if语句开始的首地址**</span>
- <span class="token keyword keyword-if">if</span> <span class="token punctuation">(</span><span class="token class-name">CFTTFileSystem</span><span class="token double-colon punctuation">::</span><span class="token function">FileExists</span><span class="token punctuation">(</span>buf_128<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
- <span class="token comment">//001F211E <- **此处必须要有if语句开始的首地址**</span>
- g_pTextDbs<span class="token operator">-></span><span class="token function">Init</span><span class="token punctuation">(</span>buf_128<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token keyword keyword-nullptr">nullptr</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
- FTSTEXT_iTextDBVersion <span class="token operator">=</span> STY_tConfig<span class="token punctuation">.</span>DownloadListAdText_63A4<span class="token punctuation">;</span>
- <span class="token punctuation">}</span>
- <span class="token comment">//loc_1F2134 <- **此处必须要有if语句结束地址**</span>
- <span class="token punctuation">}</span>
- <span class="token comment">//loc_1F2136 <- **此处必须要有if语句结束地址**</span>
- g_pTextDbs<span class="token operator">-></span><span class="token function">Init</span><span class="token punctuation">(</span><span class="token string">"PKG:/Data/Text/scw_lang.xlc"</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token keyword keyword-nullptr">nullptr</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
- FTSTEXT_iTextDBVersion <span class="token operator">=</span> <span class="token number">0x80C</span><span class="token punctuation">;</span>
- <span class="token comment">//001F2150 <- **此处必须要有for语句开始地址**</span>
- <span class="token keyword keyword-for">for</span> <span class="token punctuation">(</span><span class="token keyword keyword-int">int</span> dr6 <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> dr6 <span class="token operator">!=</span> <span class="token number">3</span><span class="token punctuation">;</span> dr6<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// dr6 表示是使用R6寄存器做为索引</span>
- <span class="token comment">//001F215A <- **此处必须要有for主体首地址**</span>
- g_pTextDbs<span class="token punctuation">[</span>dr6<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">Init</span><span class="token punctuation">(</span>list_files_327CE4<span class="token punctuation">[</span>dr6<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token keyword keyword-nullptr">nullptr</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
- <span class="token punctuation">}</span>
- <span class="token comment">//001F2170 <- **此处必须要有for结束地址**</span>
- bLoadLanguageText_4B7E3C <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token comment">//STRB.W R0, [R11]</span>
- <span class="token punctuation">}</span>
- <span class="token comment">//001F2174 <- **此处必须要有函数调用**</span>
- ELangType eType <span class="token operator">=</span> <span class="token function">GetFTTLangFromLang</span><span class="token punctuation">(</span>i0<span class="token punctuation">)</span><span class="token punctuation">;</span>
- g_pTextDbs<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">LoadLanguage</span><span class="token punctuation">(</span>eType<span class="token punctuation">)</span><span class="token punctuation">;</span>
- g_pTextDbs<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">LoadLanguage</span><span class="token punctuation">(</span>eType<span class="token punctuation">)</span><span class="token punctuation">;</span>
- g_pTextDbs<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">LoadLanguage</span><span class="token punctuation">(</span>eType<span class="token punctuation">)</span><span class="token punctuation">;</span>
- <span class="token function">LOGI</span><span class="token punctuation">(</span><span class="token string">"FE_LoadLanguageText: End"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
- <span class="token punctuation">}</span>
- </pre><hr>
- <h4 class="mume-header" id="%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83">开发环境</h4>
- <ul>
- <li>建议使用Nexus5 4.4.4版本的Android系统</li>
- <li>使用 VSCode 开发</li>
- <li>NDK版本必须是18b</li>
- <li>IDA版本推荐7.0及以上</li>
- <li>相关资源分享包括APK包,NDK18b, IDA等工具<br>
- 链接:<a href="https://pan.baidu.com/s/1e1pRKsoIEsXKu1obaexoFA">https://pan.baidu.com/s/1e1pRKsoIEsXKu1obaexoFA</a> 提取码:shfi</li>
- </ul>
- <hr>
- <h4 class="mume-header" id="%E9%AA%8C%E6%94%B6%E6%A0%87%E5%87%86">验收标准</h4>
- <ul>
- <li>
- <p>逆向出来的C++代码再反编译回去,与原始的汇编代码一致,我们称之为笑脸,在代码中标识为 ^_^</p>
- </li>
- <li>
- <p>单元测试完成后,要按如下格式写上实际情况<br>
- //单元测试等级: 目测游戏表现<br>
- //单元测试内容: 启动游戏到第2关(包括第2关)<br>
- //单元测试结果: 正常<br>
- //已测试分支:</p>
- </li>
- <li>
- <p>对于汇编一致函数写法示例</p>
- <pre data-role="codeBlock" data-info="c++" class="language-cpp"><span class="token comment">//001C5B48 //^_^ 开始的位置必须表明函数位置(位置不可带0x),和笑脸</span>
- <span class="token class-name">TShadowAABB</span><span class="token double-colon punctuation">::</span><span class="token function">TShadowAABB</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
- ……<span class="token punctuation">.</span>中间省略
- <span class="token punctuation">}</span>
- </pre></li>
- <li>
- <p>对于汇编不一致函数的写法示例:</p>
- <pre data-role="codeBlock" data-info="c++" class="language-cpp"><span class="token comment">//0012644C //^_-</span>
- <span class="token comment">//单元测试等级: 目测游戏表现/函数输入输出数据对比</span>
- <span class="token comment">//单元测试内容: 启动游戏到第2关(包括第2关)</span>
- <span class="token comment">//单元测试结果: 正常/函数输出数据一致,游戏运行正常.</span>
- <span class="token keyword keyword-void">void</span> <span class="token class-name">CFESChooseHero</span><span class="token double-colon punctuation">::</span><span class="token function">PreRender3D</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
- <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>中间省略
- <span class="token punctuation">}</span>
- TShadowAABB<span class="token operator">*</span> <span class="token class-name">TShadowAABB</span><span class="token double-colon punctuation">::</span><span class="token function">Block</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
- <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>中间省略
- <span class="token comment">//该函数是有输出的,我们可以对它的返回值和原始程序输出做对比</span>
- <span class="token punctuation">}</span>
- </pre></li>
- <li>
- <p>关于汇编不一致函数,不同点的标注示例:</p>
- <pre data-role="codeBlock" data-info="c++" class="language-cpp">TShadowAABB<span class="token operator">*</span> <span class="token class-name">TShadowAABB</span><span class="token double-colon punctuation">::</span><span class="token function">Block</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
- <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>中间省略
- <span class="token comment">//假设下面的判断不同</span>
- <span class="token comment">/*
- 描述: 此处>=跳转原来是BGE, 但是它为BPL(描述现象)
- 原始汇编: *****
- 自己汇编: *****
- */</span>
- <span class="token keyword keyword-if">if</span> <span class="token punctuation">(</span> s0_float <span class="token operator">-</span> s6_float <span class="token operator"><</span> <span class="token number">0.0f</span> <span class="token punctuation">)</span>
- <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>中间省略
- <span class="token punctuation">}</span>
- </pre></li>
- <li>
- <p>对于已经在头文件库中给出的全局变量,必须使用项目已经指定的头文件包含进来<br>
- 不可以在自己的头文件中再单独声明一个同类型,同名称的变量。</p>
- </li>
- <li>
- <p>如果你实现的函数分支流程,和原始的不一致的,<br>
- 请你在提交函数体内详细说明, 进而证明你的流程也是正确的。<br>
- 否则, 统一按照不合格处理。</p>
- </li>
- </ul>
- <hr>
- <h4 class="mume-header" id="%E4%BB%A3%E7%A0%81%E9%A3%8E%E6%A0%BC-%E5%BB%BA%E8%AE%AE%E8%A6%81%E6%B1%82">代码风格 [建议要求]</h4>
- <ul>
- <li>VSCode上设置为Google代码风格</li>
- <li>缩进2个空格</li>
- <li>缩写统一
- <table>
- <thead>
- <tr>
- <th>类型</th>
- <th>定义</th>
- <th>缩写</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>typedef char</td>
- <td>int8</td>
- <td>c</td>
- </tr>
- <tr>
- <td>typedef signed char</td>
- <td>sint8</td>
- <td>sc</td>
- </tr>
- <tr>
- <td>typedef unsigned char</td>
- <td>uint8</td>
- <td>uc</td>
- </tr>
- <tr>
- <td>typedef short</td>
- <td>int16</td>
- <td>s</td>
- </tr>
- <tr>
- <td>typedef signed short</td>
- <td>sint16</td>
- <td>ss</td>
- </tr>
- <tr>
- <td>typedef int</td>
- <td>int32</td>
- <td>i</td>
- </tr>
- <tr>
- <td>typedef signed int</td>
- <td>sint32</td>
- <td>si</td>
- </tr>
- <tr>
- <td>typedef unsigned int</td>
- <td>uint32</td>
- <td>ui</td>
- </tr>
- <tr>
- <td>typedef int64_t</td>
- <td>int64</td>
- <td>ll</td>
- </tr>
- <tr>
- <td>typedef uint64_t</td>
- <td>uint64</td>
- <td>ull</td>
- </tr>
- <tr>
- <td>typedef unsigned int</td>
- <td>uint</td>
- <td>ui</td>
- </tr>
- <tr>
- <td>typedef unsigned char</td>
- <td>uchar</td>
- <td>uc</td>
- </tr>
- <tr>
- <td>typedef unsigned short</td>
- <td>ushort</td>
- <td>us</td>
- </tr>
- <tr>
- <td>typedef unsigned long</td>
- <td>ulong</td>
- <td>ul</td>
- </tr>
- </tbody>
- </table>
- </li>
- </ul>
- <hr>
- <h4 class="mume-header" id="scorehero-%E5%91%BD%E5%90%8D%E8%A7%84%E8%8C%83">Score!Hero 命名规范</h4>
- <table>
- <thead>
- <tr>
- <th>类型</th>
- <th>缩写</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>类</td>
- <td>大写 C 开头</td>
- </tr>
- <tr>
- <td>结构体</td>
- <td>大写 T 开头</td>
- </tr>
- <tr>
- <td>枚举变</td>
- <td>大写 E 开头</td>
- </tr>
- <tr>
- <td>类的静态变量</td>
- <td>小写 ms_ 开头</td>
- </tr>
- <tr>
- <td>类的静态bool变量</td>
- <td>小写 ms_b 开头</td>
- </tr>
- <tr>
- <td>类的静态float变量</td>
- <td>小写 ms_f 开头</td>
- </tr>
- <tr>
- <td>类的静态int变量</td>
- <td>小写 ms_i 开头</td>
- </tr>
- <tr>
- <td>类的静态unsigned int变量</td>
- <td>小写 ms_u 开头</td>
- </tr>
- <tr>
- <td>类的静态char*变量</td>
- <td>小写 ms_s 开头</td>
- </tr>
- <tr>
- <td>类的静态Matrix变量</td>
- <td>小写 ms_m 开头</td>
- </tr>
- <tr>
- <td>类的静态枚举变量</td>
- <td>小写 ms_e 开头</td>
- </tr>
- <tr>
- <td>类的静态指量变量</td>
- <td>小写 ms_p 开头</td>
- </tr>
- <tr>
- <td>类的静态结构体变量</td>
- <td>小写 ms_t 开头</td>
- </tr>
- <tr>
- <td>全局变量</td>
- <td>小写 g_ 开头</td>
- </tr>
- <tr>
- <td>全局bool变量</td>
- <td>小写 g_b 开头</td>
- </tr>
- <tr>
- <td>全局int变量</td>
- <td>小写 g_i 开头</td>
- </tr>
- <tr>
- <td>全局unsigned int变量</td>
- <td>小写 g_u 开头</td>
- </tr>
- <tr>
- <td>全局float变量</td>
- <td>小写 g_f 开头</td>
- </tr>
- <tr>
- <td>全局char*变量</td>
- <td>小写 g_s 开头</td>
- </tr>
- <tr>
- <td>全局Matrix变量</td>
- <td>小写 g_m 开头</td>
- </tr>
- <tr>
- <td>全局枚举变量</td>
- <td>小写 g_e 开头</td>
- </tr>
- <tr>
- <td>全局指量变量</td>
- <td>小写 g_p 开头</td>
- </tr>
- <tr>
- <td>全局结构体变量</td>
- <td>小写 g_t 开头</td>
- </tr>
- </tbody>
- </table>
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </body></html>
|