随笔 - 224  文章 - 41  trackbacks - 0
<2013年7月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

享受编程

常用链接

留言簿(11)

随笔分类(159)

随笔档案(224)

文章分类(2)

文章档案(4)

经典c++博客

搜索

  •  

最新评论

阅读排行榜

评论排行榜

原文地址:http://home.inf.fh-rhein-sieg.de/~ikarim2s/how2injectcode/code_inject.html


前期准备:


    首先,我们需要一个调试器,这里我比较喜欢OLLYDBG ---我认为他是这个世界上最好的调试器 :P)

    第二,我们需要一个拿来注入我们代码的应用程序,我选择的是windows的记事本(notepad.exe),把notepad.exe拷贝到一个新的目录下,
         并把它重命名为
CodeInjectTest。


开始


    我们的目标是往Notepad.EXE 注入一些我们想要的代码,在例子中我们将在Notepad.EXE启动的时候注入一个简单的对话框。

    启动记事本,如下是原本的记事本的样子。

                                     

 

    用OD打开原始的notepad,如果没什么差错的话,你应该会看到下面的窗口。

                          

 

   
     因为我们需要往exe中注入自己的代码,因此需要遭到应用程序的空白处,这个空白处我们把它叫做CodeCaves。滚动od中的cpu窗口,
    知道我们找到
CodeCaves。如下:

                                    



    地址从01008747开始。

 

    在标红的区域中,就是notepadCodeCave。在这里我们可以写一些自己想要的代码,而且他不会影响程序的正常运行。如果我们想要调用 Messagebox
   你需要知道一下关于
Messagebox的介绍:
   

 int MessageBox(
            HWND hWnd,  
// handle of owner window
            LPCTSTR lpText, // address of text in message box
            LPCTSTR lpCaption,  // address of title of message box  
            UINT uType  // style of message box
          );


    这些就是你必须知道的一些关于MessageBox的东西,现在我们可以在CodeCaves 下做一些自己的事情了。首先,我们要创建MessageBox里显示的
    提示信息的字符串,这里我们选择几行CodeCaves,如下:

                                  
    点击 Binary=>Edit or (CTRL+E)你将看到如下的窗口,在窗口中输入你自己想填写的:

                                 


    点击ok,你将会看到那些红色代码就是你修改的:


                                


    现在用CTRL+A 在分析一下代码。

                               


    Ok,如果你希望MessageBox ,有不同的标题属性,你可以重复上述的操作,创建另外一个字符串,如"INJECTED NOTEPAD"。


    现在是时候编写 asm代码的时候了  ;)

    我们需要编写触发MessageBox 的asm代码。这是一些快速的例子如下:

PUSH 0            ; BUTTONS = <OK ONLY>
PUSH 1008751     ; CAPTION  = Our adress of the "INJECTED NOTEPAD"
PUSH 1008751     ; MESSAGE  = Same like above.
PUSH 0            ; ICON        = <NO ICON>
CALL MessageBoxA  ; Run MessageBoxA with the Params above.



    这些代码在od上看起来应该是这个样子的:

                      


    看到上面的箭头了没,接下来是重要的一步!如果你现在保存它并运行它,你将看不到任何的效果,为什么呢?

    因为这段代码并没有被调用。

    我们必须记住" PUSH 0" 的偏移位置,因为我们需要从程序的开始位置跳转过来,然后在跳回去 ;)

    再记住了这个地址以后,跳转到程序的开头位置如下:

                              

    现在来到了程序开始执行的位置。还记得我们一开始我们想往程序里加入什么吗? ;) 从开始选择几段的代码,拷贝到剪贴板中。

                             


    把这些代码保存在文件中去,可能等下我们会使用到它。回到刚才程序的开头位置 (在图片中是 PUSH 70)

    双击它,在弹出来的地方下 编写如下的代码"JMP <adress of your first push>"

                            

    按下Assemble 按钮,将看到如下红色的代码。

                           


    注意下红色盒子里的地址,这是我们等下需要跳回来的地方。

    对比一下新的代码和刚才拷贝到剪贴板的代码,你会发现原来的一些代码被覆盖带了,为了保持程序可执行我们必须补上这些被重写的代码。

    在这个例子中,被覆盖掉的代码如下:

PUSH 70
PUSH NOTEPAD.01001898



 

    在 CALL MessageBoxA的后面,补上这段代码,然后跳回到原处。

                             


    一切都已经就绪了。

    如下,保存一下新的记事本:
                              


    选择"All modifications",在弹出来的对话框中选择"Copy All" ,给程序去一个名字,保存它,如果你成功的话,你讲看到如下的窗体。 

                            

   
点击ok,记事本将正常启动了。

总结:

1.明白要注入的代码该怎么编写

2.记得恢复原来被代替掉的代码。



posted on 2013-07-02 15:38 漂漂 阅读(6905) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理