ARC_xp_20160530
2016-05-30 15:01
393 查看
1、
申请内存的地方在哪里?忘了...(应该是用的 malloc)
2、
键盘上按下一个键,处理的函数为:(所在的模块 应该是“CEGUIIrrlichtRenderer.dll”)
ZC: (1)、injectKeyDown函数 是用于处理 回车 等的按键;(2)、injectChar函数 是用于处理 字符按键。
ZC: CE 找到对应输入文字内容的 2个缓冲区(CE修改2个缓冲区的内容,确定了 只有一个是用于发送信息的)
ZC: 焦点处于输入框时,对上面的缓冲区设置OD内存写入断点,会断在 memcpy函数中
2.1、injectChar 的代码:(所在的模块 应该是“CEGUIBase.dll”)
2.2、memcpy前的操作:(所在的模块 应该是“CEGUIBase.dll”)
ZC: 这里 对象中有2个缓冲区,一个是在 信息DWORD个数小于等于0x20时使用的,一个是 信息DWORD个数大于0x20时使用的(貌似这个缓冲区是动态申请的,应该是用的 malloc 但是没找到具体在哪里分配内存...)
3、
CE 对应输入文字内容的 2个缓冲区 --> 定位 当发送消息时,操作缓冲区的汇编指令 --> 分析这些指令
4、几个 地址:
5、
申请内存的地方在哪里?忘了...(应该是用的 malloc)
2、
键盘上按下一个键,处理的函数为:(所在的模块 应该是“CEGUIIrrlichtRenderer.dll”)
003B465F CC INT3 003B4660 /$ 53 PUSH EBX 003B4661 |. 56 PUSH ESI 003B4662 |. 57 PUSH EDI 003B4663 |. 8BF9 MOV EDI,ECX ; ZC: ECX==[[[[[101649D4]+0C]+1C]+218]+58] 003B4665 |. FF15 5CB03B00 CALL DWORD PTR DS:[<&CEGUIBase.?getSingl>; CEGUIBas.?getSingleton@System@CEGUI@@SAAAV12@XZ 003B466B |. 8BF0 MOV ESI,EAX ; ZC: ESI==返回值==019FCAC0==[12F8BD8] 003B466D |. 8B4424 10 MOV EAX,DWORD PTR SS:[ESP+10] ; ZC: 唯一参数,按键ASCII码 003B4671 |. 0FB64C38 18 MOVZX ECX,BYTE PTR DS:[EAX+EDI+18] 003B4676 |. 51 PUSH ECX 003B4677 |. 8BCE MOV ECX,ESI 003B4679 |. FF15 6CB03B00 CALL DWORD PTR DS:[<&CEGUIBase.?injectKe>; CEGUIBas.?injectKeyDown@System@CEGUI@@QAE_NI@Z 003B467F |. 0FB75424 14 MOVZX EDX,WORD PTR SS:[ESP+14] 003B4684 |. 52 PUSH EDX 003B4685 |. 8BCE MOV ECX,ESI 003B4687 |. 8AD8 MOV BL,AL 003B4689 |. FF15 68B03B00 CALL DWORD PTR DS:[<&CEGUIBase.?injectCh>; CEGUIBas.?injectChar@System@CEGUI@@QAE_NI@Z 003B468F |. 84C0 TEST AL,AL 003B4691 |. 75 0A JNZ SHORT CEGUIIrr.003B469D 003B4693 |. 84DB TEST BL,BL 003B4695 |. 75 06 JNZ SHORT CEGUIIrr.003B469D 003B4697 |. 5F POP EDI 003B4698 |. 5E POP ESI 003B4699 |. 5B POP EBX 003B469A |. C2 1000 RETN 10 003B469D |> 5F POP EDI 003B469E |. 5E POP ESI 003B469F |. B0 01 MOV AL,1 003B46A1 |. 5B POP EBX 003B46A2 \. C2 1000 RETN 10 003B46A5 CC INT3
ZC: (1)、injectKeyDown函数 是用于处理 回车 等的按键;(2)、injectChar函数 是用于处理 字符按键。
ZC: CE 找到对应输入文字内容的 2个缓冲区(CE修改2个缓冲区的内容,确定了 只有一个是用于发送信息的)
ZC: 焦点处于输入框时,对上面的缓冲区设置OD内存写入断点,会断在 memcpy函数中
2.1、injectChar 的代码:(所在的模块 应该是“CEGUIBase.dll”)
011B471F CC INT3 011B4720 >/$ 6A FF PUSH -1 011B4722 |. 68 A83E2301 PUSH CEGUIBas.01233EA8 011B4727 |. 64:A1 0000000>MOV EAX,DWORD PTR FS:[0] 011B472D |. 50 PUSH EAX 011B472E |. 83EC 18 SUB ESP,18 011B4731 |. 56 PUSH ESI 011B4732 |. A1 00892E01 MOV EAX,DWORD PTR DS:[12E8900] 011B4737 |. 33C4 XOR EAX,ESP 011B4739 |. 50 PUSH EAX 011B473A |. 8D4424 20 LEA EAX,DWORD PTR SS:[ESP+20] 011B473E |. 64:A3 0000000>MOV DWORD PTR FS:[0],EAX 011B4744 |. 8BF1 MOV ESI,ECX 011B4746 |. 8B4E 34 MOV ECX,DWORD PTR DS:[ESI+34] 011B4749 |. 85C9 TEST ECX,ECX 011B474B |. 74 2A JE SHORT CEGUIBas.011B4777 011B474D |. 6A 00 PUSH 0 011B474F |. E8 4C940000 CALL CEGUIBas.?isVisible@Window@CEGUI@@Q> 011B4754 |. 84C0 TEST AL,AL 011B4756 |. 74 1F JE SHORT CEGUIBas.011B4777 011B4758 |. 8B4E 38 MOV ECX,DWORD PTR DS:[ESI+38] 011B475B |. 85C9 TEST ECX,ECX 011B475D |. 75 0A JNZ SHORT CEGUIBas.011B4769 011B475F |. 8B4E 34 MOV ECX,DWORD PTR DS:[ESI+34] 011B4762 |. E8 A9940000 CALL CEGUIBas.?getActiveChild@Window@CEG> // ZC: 测试下来,缓冲区是这个对象的属性 011B4767 |. EB 10 JMP SHORT CEGUIBas.011B4779 011B4769 |> E8 A2940000 CALL CEGUIBas.?getActiveChild@Window@CEG> 011B476E |. 85C0 TEST EAX,EAX 011B4770 |. 75 07 JNZ SHORT CEGUIBas.011B4779 011B4772 |. 8B46 38 MOV EAX,DWORD PTR DS:[ESI+38] 011B4775 |. EB 02 JMP SHORT CEGUIBas.011B4779 011B4777 |> 33C0 XOR EAX,EAX 011B4779 |> C74424 0C 000>MOV DWORD PTR SS:[ESP+C],0 011B4781 |. 894424 10 MOV DWORD PTR SS:[ESP+10],EAX 011B4785 |. C74424 08 904>MOV DWORD PTR SS:[ESP+8],OFFSET CEGUIBas> 011B478D |. C74424 28 000>MOV DWORD PTR SS:[ESP+28],0 011B4795 |. 85C0 TEST EAX,EAX 011B4797 |. 75 15 JNZ SHORT CEGUIBas.011B47AE 011B4799 |. 32C0 XOR AL,AL 011B479B |. 8B4C24 20 MOV ECX,DWORD PTR SS:[ESP+20] 011B479F |. 64:890D 00000>MOV DWORD PTR FS:[0],ECX 011B47A6 |. 59 POP ECX 011B47A7 |. 5E POP ESI 011B47A8 |. 83C4 24 ADD ESP,24 011B47AB |. C2 0400 RETN 4 011B47AE |> 8B4C24 30 MOV ECX,DWORD PTR SS:[ESP+30] 011B47B2 |. 8B96 D4000000 MOV EDX,DWORD PTR DS:[ESI+D4] 011B47B8 |. 894C24 14 MOV DWORD PTR SS:[ESP+14],ECX 011B47BC |. 895424 1C MOV DWORD PTR SS:[ESP+1C],EDX 011B47C0 |. 8B10 MOV EDX,DWORD PTR DS:[EAX] 011B47C2 |. 8B92 C0000000 MOV EDX,DWORD PTR DS:[EDX+C0] 011B47C8 |. 8D4C24 08 LEA ECX,DWORD PTR SS:[ESP+8] 011B47CC |. 51 PUSH ECX 011B47CD |. 8BC8 MOV ECX,EAX 011B47CF |. FFD2 CALL EDX ZC: here in 011B47D1 |. 837C24 0C 00 CMP DWORD PTR SS:[ESP+C],0 011B47D6 |. 0F95C0 SETNE AL 011B47D9 |. 8B4C24 20 MOV ECX,DWORD PTR SS:[ESP+20] 011B47DD |. 64:890D 00000>MOV DWORD PTR FS:[0],ECX 011B47E4 |. 59 POP ECX 011B47E5 |. 5E POP ESI 011B47E6 |. 83C4 24 ADD ESP,24 011B47E9 \. C2 0400 RETN 4 011B47EC CC INT3
2.2、memcpy前的操作:(所在的模块 应该是“CEGUIBase.dll”)
011148D9 |> \837E 04 20 CMP DWORD PTR DS:[ESI+4],20 // ZC: 对象属性 与0x20比较,<=0x20则跳转至ECX=ESI+14(注意是LEA);>0x20则ECX=[ESI+94] 011148DD |. 76 08 JBE SHORT CEGUIBas.011148E7 011148DF |. 8B8E 94000000 MOV ECX,DWORD PTR DS:[ESI+94] 011148E5 |. EB 03 JMP SHORT CEGUIBas.011148EA 011148E7 |> 8D4E 14 LEA ECX,DWORD PTR DS:[ESI+14] // ZC: 注意这里是LEA 011148EA |> 50 PUSH EAX ; /n 011148EB |. 8D04AA LEA EAX,DWORD PTR DS:[EDX+EBP*4] ; | 011148EE |. 50 PUSH EAX ; |src 011148EF |. 51 PUSH ECX ; |dest 011148F0 |. E8 79131100 CALL <JMP.&MSVCR100.memcpy> ; \memcpy 011148F5 |. 83C4 0C ADD ESP,0C // ZC: 注意到貌似MSVCR100里面的函数都要在调用函数之后平衡堆栈(不像stdcall是在被调用函数里面平衡堆栈)
ZC: 这里 对象中有2个缓冲区,一个是在 信息DWORD个数小于等于0x20时使用的,一个是 信息DWORD个数大于0x20时使用的(貌似这个缓冲区是动态申请的,应该是用的 malloc 但是没找到具体在哪里分配内存...)
3、
CE 对应输入文字内容的 2个缓冲区 --> 定位 当发送消息时,操作缓冲区的汇编指令 --> 分析这些指令
4、几个 地址:
基址 0x101649D4 模块Irrlicht.dll (XP中被加载到的地址:0x10001000) 偏移:0x001639D4 位于函数0x100E9410中[函数偏移0x000E8410] 基址 0x012F8BD8 模块CEGUIBase.dll (XP中被加载到的地址:0x01111000) 偏移:0x001E7BD8 位于函数0x011B40B0中[函数偏移0x000A30B0] 函数地址 0x011BDC10 模块CEGUIBase.dll (XP中被加载到的地址:0x01111000) 偏移:0x000ACC10 OD提示的函数名:“getActiveChild@Window” 函数地址 0x003B4660 模块CEGUIIrrlichtRenderer.dll (XP中被加载到的地址:0x003B1000) 偏移:0x00003660 OD提示的函数名:“”
5、
相关文章推荐
- 开启tomcat
- 如何用 Python 实现 Web 抓取?
- NYOJ 1253 Turing equation (第七届河南省赛)
- cocos2d-x 自定义N个碰撞矩形框。
- iOS开发之自定义导航栏返回按钮右滑返回手势失效的解决
- 第6课时《自定义智能指针》
- Mybatis 批量删除
- 2.详细图解JVM内存三大核心区域及其JVM内存案例剖析
- 深入解析 Spring MVC的配置文件
- 期末总结
- 用C和C++编写输出乘法口诀表
- 不允许创建临时变量,交换两个数的内容
- 求10 个整数中最大值
- 写一个函数返回参数二进制中 1 的个数
- 将数组A中的内容和数组B中的内容进行交换。(数组一样大)
- 获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。
- 将三个数按从大到小输出。
- 求两个数的最大公约数。
- 转换大小写字母
- 输出一个整数的每一位