-
-
[讨论]实现了类似OD空格更改指令的功能
-
发表于: 2013-3-27 19:56 7449
-
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功能的源文件.
更改这个配置文件而被加入的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功能的源文件.
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
- [分享]剑灵外挂源码 12892
- [聊聊]我想聊聊 3873
- [讨论]实现了类似OD空格更改指令的功能 7450
- [建议]讨论区各种没营养的求助贴 4611
看原图
赞赏
雪币:
留言: