我不知道是否有人跟我有同样的问题,OD的OllyGraph/OllyTraceGraph流程图插件不能使用。我参考此网站(https://bitbucket.org/mrexodia/ollytracegraph)提供的插件源码,修复了这个问题。用OD分别加载OD和IDA,结合插件源码分析,导致错误的原因是缺少命令行参数。作者发布的插件应该是能用的,不知道为什么会变成这样。修复方法:让插件启动函数ShellExecuteW上方的那个CALL,CALL向代码缝隙处(如06442084),添加下面的补丁代码,运行完后再跳往原来要去的地方,
06442084 $ 60 pushad
06442085 . 68 00010000 push 0x100
0644208A . 8D9D A0F9FFFF lea ebx,dword ptr ss:[ebp-0x660]
06442090 . 53 push ebx
06442091 . E8 96FFFFFF call <jmp.&ollydbg.StrlenW> ; 获取原字串长度
06442096 . 83C4 08 add esp,0x8
06442099 . 8D3443 lea esi,dword ptr ds:[ebx+eax*2]
0644209C . 8D7E 2E lea edi,dword ptr ds:[esi+0x2E]
0644209F . C707 22000000 mov dword ptr ds:[edi],0x22 ; 尾部加引号
064420A5 . 83EF 02 sub edi,0x2
064420A8 . 83EE 02 sub esi,0x2
064420AB > 66:A5 movs word ptr es:[edi],word ptr ds:[esi] ; 倒着复制字串
064420AD . 83EF 04 sub edi,0x4
064420B0 . 83EE 04 sub esi,0x4
064420B3 . 48 dec eax
064420B4 .^ 75 F5 jnz short OllyGrap.064420AB ; 上跳 原字串后移
064420B6 . 3BDF cmp ebx,edi
064420B8 . 73 40 jnb short OllyGrap.064420FA
064420BA . E8 30000000 call OllyGrap.064420EF ; 下面的命令行参数入栈
064420BF . 2D00 7200 6500 6D00 6>unicode "-remove "
064420CF . 2D00 7400 6900 6D00 6>unicode "-timelim"
064420DF . 6900 7400 2000 3100 3>unicode "it 10 """,0
064420EF $ 5E pop esi ; ollydbg.0040A1B0
064420F0 . 83C6 2C add esi,0x2C
064420F3 . B8 17000000 mov eax,0x17
064420F8 .^ EB B1 jmp short OllyGrap.064420AB ; 上跳 添加命令行参数
064420FA > 61 popad
064420FB .^ E9 30F1FFFF jmp OllyGrap.06441230
即使在OD中函数已经被识别,插件图片中的函数指向仍然错误。毕竟不是原生支持。
相对于OllyGraph,OllyTraceGraph做了些美化。
相对于IDA,OD中流程图参考还是有优势的,特别是在程序加壳的时候。