注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

风雨夜归人

专业收集资料,个人爱好!

 
 
 

日志

 
 

代码/DLL注入工具 [CodeInjector v1.1]   

2009-05-31 14:53:41|  分类: 编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

这是一个用来向指定进程注入代码/DLL的小工具,简单点说就是让某个进程执行你想让它执行的指令,或是让这个进程加载你/别人写的DLL模块,知道plugin的人应该很容易了解这是什么意思,暂时来说使用这个工具的人需要了解一定的汇编语言知识和Windows的进程/DLL机制。

这个小工具其实是2月份的时候就写了一半了,虽然并没能完成我当初想要实现的全部功能,却因为各种原因也没办法继续写下去了,但毕竟算是有点小实用性的功能出来了,就在广海论坛上发布过,当时还算挺受欢迎的。后来经过断断续续的修改,觉得也发布出来让有需要的人用一下。

主要是有了下面的一些变化:

[-] 把反汇编引擎的DLL去掉,直接整合到主程序中;

[+] 增加了DLL的注入/卸载等功能;

[*] 在对进程列表进行排序的时候,不再重新遍历进程,速度正常了,不再像之前那样要卡一下。

开发工具:Microsoft Visual Studio 6.0

先看看主界面:

                              主窗口(图一)

代码/DLL注入工具 [CodeInjector v1.1]  - 白云飘飘 - Louis333风雨夜归人

了解的人看了上图一眼应该就很容易知道怎么用了,但为了尽可能让更多的人了解,还是以一个实例来说一下吧!

实例目标:Windows自带的计算器(Calc.exe)

实例任务:让计算器自己弹出一个对话框,标题是"Test",内容是"Hello!"

实例分析:

[Q] 怎么弹出对话框?

[A] 弹出对话框需要调用API(可理解为操作系统提供给我们使用的函数/代码)MessageBox,其原型为:

int MessageBox(      

    HWND hWnd,           // 父窗口的句柄

    LPCTSTR lpText,      // 对话框的正文

    LPCTSTR lpCaption,   // 对话框的标题

    UINT uType           // 对话框的类型

);

    其中hWnd和uType我们暂时不用管是什么意思,只需要知道hWnd我们传个0给它就好了,而uType倒可以随便传个数字看看结果有什么不一样,另外两个参数想必也毋庸多说了吧。

    在这个任务中,如果用的是C/C++,我们应该这样调用:

    MessageBox(0, "Hello!", "Test", 123);

    但我们在CodeInjector中用的是纯汇编,要调用函数就需要类似这样的代码:

    push 参数2

    push 参数1

    call 函数地址

    但这里首先遇到了个问题:CodeInjector暂时还不支持定义变量/标号/过程等!也就是说,我们要的"Hello"和"Test"要另外想办法制造出来。我想到的办法是利用堆栈,我们先来看看"Hello"和"Test"在内存中应该是怎么的一个样子:

   

    54 65 73 74 00 48 65 6C 6C 6F 21 00  ==> Test Hello!

   

    这是这两个字符串(刚好12个字节)连在一起存放的情况,左侧是每个字符的ASCII码(十六进制),在C/C++中字符串是以0作为结束标志的。

    好了,我们想象一下它们在堆栈中的存放情况:

    

   

    54 65 73 74 | Test   <- esp,栈顶

    00 48 65 6C |  Hel

    6C 6F 21 00 | lo!

    如果我们紧接着就开始把参数压栈的话,那接下来堆栈的内容应该是这样的:

    uType

    lpCaption  -> esp

    lpText     -> esp+5

    hWnd

[Q] 怎么解决MessageBox的地址问题

[A] 利用调试器即可,此略。

实例步骤:

一、运行计算器

二、运行CodeInjector(点此下载

三、点击主窗口(见图一)左上方的按钮“选择目标进程”,在弹出窗口(见下图)上方的进程列表中选中计算器的进程并点击“确定”按钮:

                              (图二)

代码/DLL注入工具 [CodeInjector v1.1]  - 白云飘飘 - Louis333风雨夜归人

四、利用调试器或其它方法确定MessageBoxA的地址,假设为0x77D507EA(注意,这个值因系统而异);

五、回到主窗口,在中间的编辑框中输入以下代码:

    ; 54 65 73 74 00 48 65 6C 6C 6F 21 00  ==> Test Hello!

    ; Stack should be the following:

    ;   54 65 73 74 | Test   <- esp

    ;   00 48 65 6C |  Hel

    ;   6C 6F 21 00 | lo!

    ;   uType

    ;   lpCaption  -> esp

    ;   lpText     -> esp+5

    ;   hWnd

    push 0x00216F6C

    push 0x6C654800

    push 0x74736554

    push eax            ; save eax

    mov eax, esp

    add eax, 4          ; eax -> lpCaption

    push 0x00010040  ; uType

    push eax            ; lpCaption

    add eax, 5

    push eax            ; lpText

    push 0                ; hWnd

    call 0x77D507EA    ; MessageBoxA (注意,这个地址因系统而异)

    pop eax              ; restore eax

    add esp, 0xC

六、点击主窗口上的“CreateRemoteThread”按钮。

实例结果:

    在点击“CreateRemoteThread”按钮后,会发现弹出一个对话框,如下图所示:

                              (图三)

代码/DLL注入工具 [CodeInjector v1.1]  - 白云飘飘 - Louis333风雨夜归人

    该对话框的标题和内容完全如目标一致,而且注意它的图标,跟计算器的一样,说明两者属于同一进程,任务成功。

    至于DLL注入的部分因为简单在此就不多做介绍了。

    关于注入代码的部分,本来我的计划是不用汇编,而是以一种能实现语言基本功能的“脚本”的方式,比如支持变量等,但因时间关系暂时还没办法做,有机会再说吧。

   ----------------------------------------------------------------

   CodeInjector下载:点击此处

  评论这张
 
阅读(748)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018