本帖最后由 herowuking 于 2015-6-10 10:07 编辑 最近在学习PE格式---逆向的基础,不用多说~~ 拿OllyMoreMenu 1.5+来练练手 插件下载地址:https:///download.php?view.3412 OllyDBG v2.01h官方下载地址:http://www./odbg201.zip (找了个中文语言包OllyDbg.lng,然后就可以切换中英文了) 然后准备好工具WinHex和Stud PE、OllyDBG下载下来解压之后复制一份,一个用来调试【下面简称OD1】,一个用来加载MoreMenu插件(被调试)【下面简称OD2】 为啥拿它来练呢?因为它不听话---每次从打开自定义的工具都弹出一个让人讨厌的对话框,而且配置文件cfg.ini默认放在插件目录下不太喜欢 看着很不爽~~ 不知道是不是我配置的问题,如果是请大侠指点,反正不影响我修改它。。。。本来就是为了学习PE格式的 而且配置文件cfg.ini默认在Ollydbg的插件目录Plugin下面我也很不喜欢~ 我想给他改个名字:MoreMenu.ini,放在Ollydbg的根目录下。。。 下面开始,一步一步。。。。首先申明,我是菜鸟 要借助工具分析 用StudPE打开MoreMenu插件:OllyMoreMenu_1.5+.dll (我配置了WinHex为StudPE的外部Hex编辑工具,StudPE分析PE结构很好,但是缺乏Hex编辑功能,这个选项的配置弥补了这个缺陷) 第一步,定位那个讨厌的对话框位置: 【OD2】运行,用【OD1】附加它: 在命令行下断点 bp MessageBoxA、bp MessageBoxW(这里补充一点,需要支持,下面附件里面有,下载后放在OD1的Plugin目录下) F9运行 在OD2里面点击自己添加的工具菜单里面的工具,OD1断下了它 这个时候,在User32.dll领空,不是我想要的,注意看上图右下角栈窗口里面的最上面一项ESP里面保存的值:ESP [0018D7F4] == 10001CDE 因为函数CALL调用等价于PUSH EIP,JMP xxxx,而EIP又是存储下一条指令的寄存器,因此,我们可以判断CALL MessageBox肯定在10001CDE上面那条,在OD1里面按Ctrl+G 输入VA地址:0x10001CDE,看看: 我们已经找到了这个MessageboxA调用的地方。 往上看CALL调用之前的语句: CPU Disasm 地址 十六进制数据 指令 注释 标签 10001CBB 68 6C4A0010 PUSH OFFSET 10004A6C ASCII 'C:\Users\3DPEDesign\Desktop\OllyDBG v2.01h\Tools\LordPE\LordPE.EXE' 10001CC0 68 49420010 PUSH OFFSET 10004249 ASCII 'open' 10001CC5 6A 00 PUSH 0 10001CC7 E8 E20D0000 CALL 10001CCC 6A 00 PUSH 0 ;MessageBoxA从右至左第一个参数 10001CCE 6A 00 PUSH 0 ;MessageBoxA从右至左第二个参数 10001CD0 8D85 00EEFFFF LEA EAX,[EBP-1200] 10001CD6 50 PUSH EAX ;MessageBoxA从右至左第三个参数 10001CD7 6A 00 PUSH 0 ;MessageBoxA从右至左第四个参数 10001CD9 E8 DA0C0000 CALL 基本就是执行函数ShellExecuteA打开指定的工具里面的程序之后,没有经过啥判断必定执行MessageboxA,然后那句讨厌的提示就出来了,找到了地方,修改就很方便 在10001CCC~10001CD9这几条条语句上面点击右键-->编辑-->填充位NOP...保存修改到文件,测试一下,打开再也没有那个提示了,清静~~ 第二步,修配置文件cfg.ini的名字位MoreMenu.ini,并且位置放在OD根目录下。这是本处女文的分析重点---PE文件格式学习 重新用OD1附加调试加载了OllyMoreMenu 1.5+插件的OD2 按Alt+E 打开可执行模块视图,在OllyMoreMenu 1.5+插件模块上面点击右键,在CPU中查看代码,来到MoreMenu插件的入口点: CPU Disasm 地址 十六进制数据 指令 注释 标签 10001000 Oll 55 PUSH EBP 10001001 8BEC MOV EBP,ESP 10001003 837D 0C 01 CMP DWORD PTR SS:[EBP+0C],1 10001007 75 09 JNE SHORT 10001012 10001009 FF75 08 PUSH DWORD PTR SS:[EBP+8] 1000100C 8F05 74420010 POP DWORD PTR DS:[10004274] 10001012 B8 01000000 MOV EAX,1 10001017 C9 LEAVE 10001018 C2 0C00 RETN 0C 1000101B ODB 55 PUSH EBP 1000101C 8BEC MOV EBP,ESP 1000101E 68 F1410010 PUSH OFFSET 100041F1 UNICODE 'MAIN' 10001023 FF75 08 PUSH DWORD PTR SS:[EBP+8] 10001026 FF15 80300010 CALL DWORD PTR DS:[<&msvcrt.wcscmp>] 1000102C 83C4 08 ADD ESP,8 1000102F 85C0 TEST EAX,EAX 10001031 75 07 JNE SHORT 1000103A 10001033 B8 A9410010 MOV EAX,OFFSET 100041A9 到 PTR UNICODE 'Add Menu' 10001038 C9 LEAVE 10001039 C3 RETN 1000103A 33C0 XOR EAX,EAX 1000103C C9 LEAVE 1000103D C3 RETN 1000103E ODB 55 PUSH EBP 1000103F 8BEC MOV EBP,ESP 10001041 817D 08 C900000 CMP DWORD PTR SS:[EBP+8],0C9 10001048 73 04 JAE SHORT 1000104E 1000104A 33C0 XOR EAX,EAX 1000104C C9 LEAVE 1000104D C3 RETN 1000104E A1 9C300010 MOV EAX,DWORD PTR DS:[<&ollydbg.hwollym unicode="">&ollydbg.hwollym> 10001053 FF30 PUSH DWORD PTR DS:[EAX] 10001055 8F05 C4440010 POP DWORD PTR DS:[100044C4] 1000105B 68 04010000 PUSH 104 10001060 68 28460010 PUSH OFFSET 10004628 ASCII 'C:\Users\3DPEDesign\Desktop\OllyDBG v2.01h\plugin\cfg.ini' 10001065 FF35 74420010 PUSH DWORD PTR DS:[10004274] 1000106B E8 A8190000 CALL 10001070 68 28460010 PUSH OFFSET 10004628 ASCII 'C:\Users\3DPEDesign\Desktop\OllyDBG v2.01h\plugin\cfg.ini' 10001075 E8 401A0000 CALL 1000107A 68 28460010 PUSH OFFSET 10004628 ASCII 'C:\Users\3DPEDesign\Desktop\OllyDBG v2.01h\plugin\cfg.ini' 1000107F 68 28480010 PUSH OFFSET 10004828 ASCII 'C:\Users\3DPEDesign\Desktop\OllyDBG v2.01h\plugin\cfg.bak' 10001084 E8 CB190000 CALL 10001089 68 FB410010 PUSH OFFSET 100041FB ASCII '\cfg.bak' 1000108E 68 28480010 PUSH OFFSET 10004828 ASCII 'C:\Users\3DPEDesign\Desktop\OllyDBG v2.01h\plugin\cfg.bak' 10001093 E8 B0190000 CALL 10001098 68 04420010 PUSH OFFSET 10004204 ASCII '\cfg.ini' 1000109D 68 28460010 PUSH OFFSET 10004628 ASCII 'C:\Users\3DPEDesign\Desktop\OllyDBG v2.01h\plugin\cfg.ini' 100010A2 E8 A1190000 CALL 100010A7 6A 4F PUSH 4F 100010A9 6A 02 PUSH 2 看到了吧,这个红色标注的CALL就是获得当前模块路径和文件名的,它有三个参数: hModuleLong 一个模块的句柄。可以是一个DLL模块,或者是一个应用程序的实例句柄。如果该参数为NULL,该函数返回该应用程序全路径。 lpFileNameString 指定一个字串缓冲区,要在其中容纳文件的用NULL字符中止的路径名,hModule模块就是从这个文件装载进来的 nSizeLong 装载到缓冲区lpFileName的最大字符数量 原插件里面,参数hModuleLong(CALL之上,最后一个PUSH处)传入的是插件本身的Module句柄,那么获得的就是插件所在的Plugin目录了,如果我们把这里修改位NULL就可以了。。。 简单的把PUSH DWORD PTR DS:[10004274] 用NOP填充,然后再改为Push 0么? 肯定不能这么简单了,因为在OD窗口可以看到这条指令前面的二进制数下面有下划线,有下划线代表这这里是“重定位”的了。 记住重定位的VA地址:10001067 (注意,不是10001065,下划线开始的那个字节才是!!!前面是指令二进制字节码,后面是操作数) 累死了,搞了半天才引出PE文件格式。。。。。。开始吧: 用StudPE打开OllyMoreMenu_1.5+.dll,再点工具-->Hex编辑器,调用WinHex打开它。。。 StudPE用来定位,WinHex用来修改 找到了Raw---文件中重定位表的起始的地址了吧,在WinHex中定位: ![]() 重定位表的数据结构如下图所示: ![]() 所以我们知道这个插件的重定位表有三个块儿组成,每个块儿里面基本都是“ 4字节的RVA起始地址 + 4字节的块儿长度 + Word型重定位项”组成,重定位项里面高4位是重定位类型,一般都是3,后12位(16进制对应的就是3位)是偏移地址。 对于上面OD找到的地址位10001067重定位数据,减去模块基址,减去页的起始RVA地址 即是 10001067 - 1000000 - 1000 = 67 那么重定位项就是 67 30 (小端机,高低字节对调知道吧),WinHex里面的物理地址3616位置能找到它。。。 去掉这个重定位(改为00 00),才可以后续再OD里面修改PUSH DWORD PTR DS:[10004274]位PUSH 0 直接上图: ![]() 再用OD打开调试,么有重定位了吧: ![]() 剩下,就简单了,用NOP填充PUSH DWORD PTR DS:[10004274] 再修改为PUSH 0: ![]() 保存到可执行文件即可 然后,把Plugin目录里面的cfg.ini移动到OD2根目录,并重命名为MoreMenu.ini,用WinHex再次打开MoreMenu插件 查找搜索cfg.ini文本: ![]() 对照知道,这是在.data数据段里面的,一般字符串都存在数据段 找一个Ascii码查询工具,查询你想修改的配置文件名字MoreMenu.bak MoreMenu.ini的Ascii码: ![]() 在刚才数据段上面找一块儿全是00 而且在OD内存模块中查看没有被使用的区域,我选择的是2D50起始地址: ![]() 剩下的,对照这OD里面: 10001089 68 FB410010 PUSH OFFSET 100041FB ASCII '\cfg.bak' 1000108E 68 28480010 PUSH OFFSET 10004828 ASCII 'C:\Users\3DPEDesign\Desktop\OllyDBG v2.01h\plugin\cfg.bak' 10001093 E8 B0190000 CALL 10001098 68 04420010 PUSH OFFSET 10004204 ASCII '\cfg.ini' 修改物理地址 489 和499的字节码了(物理地址怎么找见下图里面的文字解释): ![]() 因为上面新加的两个字符串起始地址分别是2D50 和 2D5E,它们在.data数据块儿内,VA地址就是: DLL模块基地址+.data段RVA+(字符串物理地址-.data段的物理起始地址) 2D50的VA:1000000+4000+(2D50-2C00) = 10004150 2D5E的VA:1000000+4000+(2D5E-2C00) = 1000415E 所以,把物理地址489处的字节码改为 50 41,499处的字节码改为5E 41 存盘,测试一下把~~ 下面贴上我学习PE格式的思维导图: ![]() 我修改好的OllyMoreMenu_1.5+h5.dll 和 MoreMenu.ini配置文件: 游客,如果您要查看本帖隐藏内容请回复 申明:本文属于处女贴,不妥之处请大侠们指点,但是不要喷,我也是在学习中。。。 |
|