[未完成] - 旧 鬼巫女defcode 核心代码解析

通过 4B48F0(-1帧调用)进入 4B404A中,而4B404A中被实现写好了代码。其为核心代码

检测人物的方式 和  极限卢相同。

核心代码如下:


004B404A - pushad                                   ; 入栈
004B404B - pushfd
004B404C - mov eax,[004B5B4C]               ; eax = 主程序地址指针
004B4051 - mov ebx,[eax+00000CD4]       ; select.def文件内全部加载的人物数(总人物数)
004B4057 - mov eax,[eax+00000CD0]       ; select.def文件内人物路径开始处指针
004B405D - mov ecx,00000000                 ; ecx清零操作

004B4062 - add ecx,01                 ; (A处)  循环因子ecx 。每次加1  (实际上 ecx是  检测次数)
004B4065 - mov ebp,00000E30           ; ebp固定为E30。为增量
004B406A - imul ebp,ecx                 ; 检测过的人物数量(检测次数)* E30赋值给ebp
004B406D - mov [004B4130],ebp     ; 4B4130处当作一个中间位置,存放一下ebp的值
004B4073 - mov esi,[004B4130]       ; 相当于把ebp的值放入esi中 (这种传递值的方式,值得学习)
004B4079 - sub esi,00000E30           ; esi = ebp - E30 (第一次检测,不需要加E30。)
004B407F - cmp [esi+eax+08],004B404A ; 人物包信息指针(混沌蛟里则采取的是 -E28 + E30。注意 16进制下 E30 和 E28 相差 8)。这里比较一下,有没有人物包信息地址,如果有,说明该人物被选中了。而选中后指针肯定大于4B404A。如果没选中,指针为0,小于4B404A 。选中后的该指针值 指向的 就是“人物名”
; 第一次检测,ecx = 1 ,此处为 select.def第一个人物包路径 下的人物包信息指针
; 第二次检测,ecx = 2 ,此处为 select.def第一个人物包路径 下的人物包信息指针
... ...

004B4087 - ja 004B4094              ; 如果被选中了,则跳到下面B处,进行处理
004B4089 - cmp ecx,ebx              ; 比较ecx(检测次数)和 select.def里的总人数
004B408B - jb 004B4062              ; 如果检测次数 还没达到 总人数,则返回上面 A处 进行循环检测,直至结束
004B408D - popfd                         ;  (E处) 出栈
004B408E - popad
004B408F - jmp 00496361              ; 此为 4B48F0的原返回值。4B48F0为 -1帧调用。

004B4094 - mov edx,[esi+eax+08]      ; (B处)  把人物包信息指针赋值给edx (edx的值 就指向人物包的信息,比如:人物名,人物显示名 等等)
004B4098 - cmp [edx+38],6665642D        ; -def (鬼巫女def 检测的不是“人物名”的开头,而是检测“人物显示名” ,而且还是显示名的后面的几个字母。)
004B409F - jne 004B40AC                 ; 如果不是自己人物,就跳到下面 C处 (Cns指针指空)
004B40A1 - cmp [edx+3C],65646F63        ; code (同上)
004B40A8 - jne 004B40AC                 ; 同上
004B40AA - jmp 004B40B8                ; 如果是自己人物,就跳转到 下面 D处

004B40AC - mov edx,[edx+000003C4]        ;(C处)cns指针 。这里也有cns指针,比BE8更快
004B40B2 - mov [edx],004B462F            ; 此处 和 4B5900一样是空区域,为了 Cns指针指空
004B40B8 - cmp ecx,ebx                         ; (D处)再最后比较一次,检测次数 和 总人物数
004B40BA - jb 004B4062                         ; 如果小于的话,跳上去继续检测,直至全部人物检测结束
004B40BC - jmp 004B408D                     ; 全部完成后,跳转到 上方 E处,出栈


 
评论
热度(1)
 
回到顶部