尝试反汇编 FLUENT ADDON 之 SOFC
来源:互联网 发布:发现值得买网站源码 编辑:程序博客网 时间:2024/06/06 14:01
最近研究 FLUENT ADDON 有一些进展,先是读出了 addon.bin 的编码规则,再进一步的话可以利用反汇编来还原出 SOFC 的源文件。
为什么是 SOFC,因为它提供了 object 文件,比较容易入手。
之前因为 rpvar 在并行版中会出现一些问题,而从 sofc.h 可以看到有对 rpvar 的修正,就从这相关的函数开始吧。
步骤其实还比较简单:
1 dumpbin 得到 fc.obj 的汇编代码,以 pull_real_from_cache 函数为例:
汇编代码:
_pull_real_from_cache: 00001D50: 55 push ebp 00001D51: 8B EC mov ebp,esp 00001D53: 51 push ecx 00001D54: 8B 45 08 mov eax,dword ptr [ebp+8] 00001D57: 3B 05 00 00 00 00 cmp eax,dword ptr [?old_rpvar@?1??pull_real_from_cache@@9@9] 00001D5D: 75 08 jne 00001D67 00001D5F: D9 05 00 00 00 00 fld dword ptr [?old_result@?1??pull_real_from_cache@@9@9] 00001D65: EB 6C jmp 00001DD3 00001D67: 8B 4D 08 mov ecx,dword ptr [ebp+8] 00001D6A: 89 0D 00 00 00 00 mov dword ptr [?old_rpvar@?1??pull_real_from_cache@@9@9],ecx 00001D70: C7 05 00 00 00 00 mov dword ptr [?old_result@?1??pull_real_from_cache@@9@9],0 00 00 00 00 00001D7A: C7 45 FC 00 00 00 mov dword ptr [ebp-4],0 00 00001D81: EB 09 jmp 00001D8C 00001D83: 8B 55 FC mov edx,dword ptr [ebp-4] 00001D86: 83 C2 01 add edx,1 00001D89: 89 55 FC mov dword ptr [ebp-4],edx 00001D8C: 8B 45 FC mov eax,dword ptr [ebp-4] 00001D8F: 3B 05 00 00 00 00 cmp eax,dword ptr [_rvars_count] 00001D95: 7D 36 jge 00001DCD 00001D97: 8B 4D 08 mov ecx,dword ptr [ebp+8] 00001D9A: 51 push ecx 00001D9B: 8B 55 FC mov edx,dword ptr [ebp-4] 00001D9E: 8B 04 95 00 00 00 mov eax,dword ptr _rvars[edx*4] 00 00001DA5: 50 push eax 00001DA6: E8 00 00 00 00 call _strcmp 00001DAB: 83 C4 08 add esp,8 00001DAE: 85 C0 test eax,eax 00001DB0: 75 19 jne 00001DCB 00001DB2: 8B 4D FC mov ecx,dword ptr [ebp-4] 00001DB5: 8B 15 00 00 00 00 mov edx,dword ptr [_rvars_vals] 00001DBB: 8B 04 8A mov eax,dword ptr [edx+ecx*4] 00001DBE: A3 00 00 00 00 mov dword ptr [?old_result@?1??pull_real_from_cache@@9@9],eax 00001DC3: D9 05 00 00 00 00 fld dword ptr [?old_result@?1??pull_real_from_cache@@9@9] 00001DC9: EB 08 jmp 00001DD3 00001DCB: EB B6 jmp 00001D83 00001DCD: D9 05 00 00 00 00 fld dword ptr [__real@cb189680] 00001DD3: 8B E5 mov esp,ebp 00001DD5: 5D pop ebp 00001DD6: C3 ret 00001DD7: CC int 3 00001DD8: CC int 3 00001DD9: CC int 3 00001DDA: CC int 3 00001DDB: CC int 3 00001DDC: CC int 3 00001DDD: CC int 3 00001DDE: CC int 3 00001DDF: CC int 3
其实功能比较简单,仔细推敲之后,写一段 C 代码与之对应。
2 写出对应的 C 代码
#include <stdio.h>extern char *rvars[];extern float * rvars_vals;extern int rvars_count;float pull_real_from_cache(char *rpvar){static char * old_rpvar;static float old_result;int i = 0;if (rpvar == old_rpvar){return old_result;}old_rpvar = rpvar;old_result = 0.0;for (i=0; i<rvars_count; ++i){if (strcmp(rpvar, rvars[i]) == 0){old_result = rvars_vals[i];return old_result;}}return 0.0f;}
3 编译C代码,并用 dumpbin 反汇编与原始汇编代码进行对比
4 完成,继续下一个
ps: 需要注意一点,dumpbin 的版本太低(比如VC6自带的dumpbin)的话反汇编的代码有些问题,尽量使用高版本的dumpbin
- 尝试反汇编 FLUENT ADDON 之 SOFC
- Fluent Addon 程序解析
- 反汇编之路
- 反汇编之爆破
- 汇编与反汇编之小技巧
- 反汇编之函数调用
- cpp反汇编之protected
- cpp反汇编之数组
- cpp反汇编之指针
- PIC单片机之反汇编
- fluent define/models下没有addon-module的解法
- MFC程序反汇编之快速定位
- 反汇编之简单函数调用
- 简单反汇编之if判断
- 简单反汇编之for循环
- 简单反汇编之冒泡排序
- 简单反汇编之注册机编写
- 一起来学反汇编-之if语句
- 启动CEGUI
- 你的变量究竟存储在什么地方?
- sql 语法
- Oracle全文索引!
- XMI转换Java对象
- 尝试反汇编 FLUENT ADDON 之 SOFC
- Android中ProgressBar自定义进度条的高度、颜色、圆角
- android工作小结 ---- 3
- AfxMessageBox和Messagebox的区别
- 分布式下读取文件
- TipWindow.xaml_1124
- xv视频提取器的一些用法
- esx : vm machine network cable is unplugin solution
- 嵌入式根文件系统制作