欢迎大家到我的个人主页点击打开链接,一起交流、学习,一起进步~
这一次我们使用ollydbg手动向可执行文件内存中添加指令,使其能够实现我们要求的功能,同时也不影响原功能的实现。
(一)向printf(“hello world”)中注入代码,使其实现MessageBoxA:(这一点没能实现。。。)
1.这一方法参考了文章http://home.inf.fh-rhein-sieg.de/~ikarim2s/how2injectcode/code_inject.html,但是当一切写好,准备调用MessageBox时,发现我们并没有这个函数,即以下这步当中的call,我们只是call了一个地址,而没有call到USER32中的MessageBox,
???
原因是我们的文件原本就没有调用USER32.dll,因此计算写上了地址也不知道在call什么,使用PEView打开NotePad.exe,发现确实是调用过USER32.dll。
2.然后想到,是不是可以在我们文件的.idata节中添加上USER32.dll,同时在IAT中添加MessageBoxA的相关信息。尝试中:
首先找到.idata节,添加 IMAGE_IMPORT_DESCRIPTOR,然后在IID指向的位置中填上相应的dll名称、函数名称等:
- IID的结构:
0-3字节:OriginalFirstThunk INT的地址
4-7字节:TimeDateStamp 时间戳
8-11字节:ForwarderChain 链表的前一个结构
12-15字节:Namel 指向DLL名称的指针
16-19字节:FirstThunk 定义针对Namel这个动态链接库引入的所有导入函数(IAT的地址)
00406580->0040648E->MessageBoxA,这个就是INT的输入顺序
这里只添加了MessageBoxA这一个函数
添加完后,右键->copy to executable->copy all,另存为新的exe,先运行一下有没有报错:
使用PEView打开我们的新文件,发现在IAT中不仅多了USER32,还增加了以下dll:
打开了另一个正常的exe,发现它的IAT下一项之间有5个字段的0相隔,我想应该是系统将我们添加的IID之后的五个字段也当作是某一个dll文件了,如此。。。无奈才疏学浅,想不出应该是怎样添加的。
(二)向已有MessageBoxA函数的可执行文件中添加代码,使其先弹出我们想要的内容:
折于第一种方法,无奈只得另寻他法,这一方法与上篇博文实现的功能相同,不过那篇是自动,本篇为手动:
1.找到原文件中的MessageBoxA,在起始处使用F2设置断点,并用F8单步跟进,查看由何处跳往这里,记下这个地址,以后会加以修正,同时复制该段代码:
记下地址004013DD
2.在.text节末添加自己需要的弹框的标题和内容,此处简单全记为”SUCCESS INJECTED”,同时将上面复制的代码粘贴到此处(当然这是极为偷懒的方法),修改相关偏移,将显示的文字地址改为我们刚刚写下的”SUCCESS INJECTED”的地址(00402684),同时将RETN改为JMP,JMP到原MessageBoxA的起始地址,这里为00401500:
3.在004013DD修改跳转地址,改为我们后加的MessgaeBoxA:
4.右键->copy to executable->copy all,另存为新的exe,运行:
5.运行完后出现了这样的错误???
这个问题我还没有想出是什么原因,为什么会涉及到地址43435553?希望大家有什么想法可以一起交流。