首页
社区
课程
招聘
[讨论]实现了类似OD空格更改指令的功能
发表于: 2013-3-27 19:56 7451

[讨论]实现了类似OD空格更改指令的功能

2013-3-27 19:56
7451
IDA中配置文件idagui.cfg中有一个参数可以使IDA能够修改程序字节. 但是这个更改只影响idb.
更改这个配置文件而被加入的Patch Program菜单我想这功能不会是插件实现的. 因为插件都在Plugin菜单, 这个是猜的. 把ida\procs\中的pc.w32放进ida中才看到实现在这里. 叫"处理器模块".
模块导出的processor_t结构太大, 本来想用c parse功能优化下显示, 结果parse出错, 头文件不会改.
重点其实在结构里面的idp_notify枚举量, 其中有一个assemble, 值为9. 这个类似win的回调函数的通知消息, 代表了一个"汇编"操作要发生. 我怎么知道的? 看书啊..!
这是此重点函数的几个片段

.text:13028A93         push    eax
.text:13028A94         push    ecx
.text:13028A95         push    0
.text:13028A97         call    j_invoke_callbacks //ida sdk api
.text:13028A9C         test    eax, eax

.text:13028AC4         ja      ret_ok                            ; jumptable 13028AD1 default case
.text:13028ACA         movzx   edx, byte ptr ds:unk_13029CF8[eax]
.text:13028AD1         jmp     ds:jumptable[edx*4]               ; switch jump

.text:13029C44 jumptable dd offset loc_13028AD8                  ; sub_13028A70+61r
.text:13029C44                                                   ; jump table for switch statement
.text:13029C48         dd offset loc_13028B91                    ; jumptable 13028AD1 case 1
.text:13029C4C         dd offset loc_1302916A                    ; jumptable 13028AD1 case 2
.text:13029C50         dd offset loc_13028C42                    ; jumptable 13028AD1 case 4
.text:13029C54         dd offset loc_13028BD3                    ; jumptable 13028AD1 case 5
.text:13029C58         dd offset callback_assembly               ; jumptable 13028AD1 case 9
.text:13029C5C         dd offset loc_130290F7                    ; jumptable 13028AD1 case 12

好像已经找到了这个"汇编"函数, 下一步就是用插件来调用来汇编想要的地址, 之后得到的字节用fwrite写入文件中, 而不是idb. 但是还不知道如何下手, 继续看书.
附件是未完成的代码.
流程就是弹出一个对话框, 要求输入汇编, 之后调用上面提到的函数汇编成字节写入文件中.
       
//odsdk生成汇编bin写入ea所指的文件偏移处和更改IDB数据
get_input_file_path(filepath, sizeof(filepath));            /*获取文件路径*/
file = fopen(filepath, "rb");                               /*打开 rb二进制模式*/
fread(&stDosHeader, sizeof(IMAGE_DOS_HEADER), 1, file);     /*读取dos头*/
fseek(file, stDosHeader.e_lfanew, SEEK_SET);                /*定位nt头*/
fread(&stNtHeader, sizeof(stNtHeader), 1, file);            /*读取nt头*/
fseek(file, stDosHeader.e_lfanew + sizeof(IMAGE_NT_HEADERS), SEEK_SET); /*定位节表*/
pstSectHeader = new IMAGE_SECTION_HEADER[stNtHeader.FileHeader.NumberOfSections]; /*new 一片区域存放节表..*/
fread(pstSectHeader, sizeof(IMAGE_SECTION_HEADER), stNtHeader.FileHeader.NumberOfSections, file); /*读取节表*/
DWORD dfileoffset = Va2Offset(&stDosHeader, &stNtHeader, pstSectHeader, ea);   /*获取ea所指的地址的文件偏移, 这个偏移就是要用fwrite写入的经过汇编的字节.*/
delete []pstSectHeader;     /*删除申请的内存*/

此处用了太多代码用来获取要汇编地址的文件偏移. 我想这些数据可以通过ida内部分析的数据获得. 这样, 实现我想要的功能可能用不到100行代码. +
另外说一下调试ida插件的一个方法. 首先工程肯定是要生成调试符号 这个用/DEBUG 符号类型在项目中设置就行. 我用断点发现断不下来,
解决方法是这样:
__asm _emit 0xcc
之后设置调试的程序为idag.exe, f5运行. 就能断下了.

求交流..求指导..

/*3月31日:*/
找到几个API:
get_original_byte       //获取原始字节
get_full_byte             //获取目前字节
get_fileregion_offset  //获取文件偏移
netnode_sup1st        //检索数据中的patch信息
netnode_supnxt        //获取数据库patch信息

考虑到怎么也找不到sdk中类似assemble的函数, Patch Program中又已经实现了此功能. 我无奈, 就把这个插件"升级了"..
现在, 它调用上面几个函数获取数据库中Patch的信息, 覆盖到文件中. 实现类似的功能.
我喜欢这个插件的根本原因就是IDA调试时它的调试目标是程序, 因而之前所有的Patch都是无效的. 我已经把IDA当作动态分析的工具用了, 太强大了.

另外的:
附件sr.rar有两个文件.
一个是IDA权威指南的作者写的根据dif文件patch程序的控制台程序, 我剽窃了一下.
另个是IDA的开发者Ilfak Guilfanov的一个类似Patch Bytes功能的源文件.

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//