飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 7558|回复: 3

[原创] Obsidium注册演示之一[前篇->逆向分析]

[复制链接]
  • TA的每日心情
    无聊
    4 天前
  • 签到天数: 610 天

    [LV.9]以坛为家II

    发表于 2007-10-7 09:59:59 | 显示全部楼层 |阅读模式
    注意:让你失望了,不是逆向Obsidium本身,我没那个水平

    本章是利用汇编的方法逆向改造程序使其动态加载外部dll,并调用的例子,
    小弟不才,在此向各位大侠献丑了,写得不好请拍砖!

    //----------------------------------------------------
    demo程序是我在网上找的,为了便于分析,我加入了一下提示框MessageBox
    SpxImage1.gif

    一,载入程序RegularDllCall.exe,F9运行,下断bp MessageBoxA,程序运行了,点"调用DLL"
    OD断下,Alt+F9来到:

    00401326   .  8BF1          mov esi,ecx
    00401328   .  68 58304000   push RegularD.00403058                                   ;  这里调用的
    0040132D   .  E8 48020000   call <jmp.&MFC42.#4224_?MessageBoxA@CWnd@@QAEHPBD0I@Z>   ;  //下面用LoadLibraryA加载dll文件RegularDll.dll
    00401332   .  68 48304000   push RegularD.00403048                                   ; /FileName = "RegularDll.dll"
    00401337   .  FF15 0C204000 call dword ptr ds:[<&KERNEL32.LoadLibraryA>]             ; \LoadLibraryA
    0040133D   .  8BF8          mov edi,eax                                              ;  把RegularDll.dll的地址赋给edi
    0040133F   .  85FF          test edi,edi
    00401341   .  75 0E         jnz short RegularD.00401351
    00401343   .  50            push eax
    00401344   .  50            push eax
    00401345   .  68 3C304000   push RegularD.0040303C
    0040134A   .  8BCE          mov ecx,esi
    0040134C   .  E8 29020000   call <jmp.&MFC42.#4224_?MessageBoxA@CWnd@@QAEHPBD0I@Z>   ;  //下面使用函数GetProcAddress得到dll输出函数的地址
    00401351   >  68 34304000   push RegularD.00403034                                   ; /ProcNameOrOrdinal = "ShowDlg"
    00401356   .  57            push edi                                                 ; |hModule
    00401357   .  FF15 00204000 call dword ptr ds:[<&KERNEL32.GetProcAddress>]           ; \GetProcAddress
    0040135D   .  8BF8          mov edi,eax                                              ;  将获得的函数的地址赋给edi
    0040135F   .  85FF          test edi,edi
    00401361   .  75 0E         jnz short RegularD.00401371
    00401363   .  50            push eax
    00401364   .  50            push eax
    00401365   .  68 20304000   push RegularD.00403020
    0040136A   .  8BCE          mov ecx,esi
    0040136C   .  E8 09020000   call <jmp.&MFC42.#4224_?MessageBoxA@CWnd@@QAEHPBD0I@Z>
    00401371   >  FFD7          call edi                                                 ;  跳转到这里调用函数ShowDlg了
    00401373   .  5F            pop edi
    00401374   .  5E            pop esi

    二,基本分析就到这里,提供一下上面两个函数的原型,我们再来改造我们需要的程序啊

    HMODULE LoadLibrary(
      LPCTSTR lpFileName   // 需要加载的dll的名字
    );

    FARPROC GetProcAddress(
      HMODULE hModule,    // dll的句柄
      LPCSTR lpProcName   // 处理函数名,即dll的输出函数
    );

    只需要用到这两个函数,一会会用到.

    三,找个样品练一下手,找我自己写的VaxC.exe吧,OD载入来到

    我的程序界面
    SpxImage.gif
    0040AA56 >/$  55            push ebp                   //从这里开始改造,
    0040AA57  |.  8BEC          mov ebp,esp
    0040AA59  |.  6A FF         push -1
    0040AA5B  |.  68 58D14000   push VaxC.0040D158
    0040AA60  |.  68 DCAB4000   push <jmp.&MSVCRT._except_handler3>                      ;  SE 处理程序安装
    0040AA65  |.  64:A1 0000000>mov eax,dword ptr fs:[0]
    0040AA6B  |.  50            push eax
    0040AA6C  |.  64:8925 00000>mov dword ptr fs:[0],esp

    Ctrl+N看看有没有输出函数GetProcAddress,哦,看了一下,没有,于是要加入,这里懒一点用工具加入,用
    LordPE载入VaxC.exe,"目录"->"输入表"->右键"添加导入表",API填GetProcAddress,DLL填Kernel32.dll,好

    再用Winhex找到空白处EEE0写入Dll.dll,在EEF0处写入sxym

    在OD窗口找到一个空白处,我找到了0040B800,写入如下代码:

    0040B800   > \60            pushad                    //保护寄存器
    0040B801   .  68 E0EE4000   push _VaxC.0040EEE0                                      ; /FileName = "Dll.dll"
    0040B806   .  FF15 C8C04000 call dword ptr ds:[<&KERNEL32.LoadLibraryA>]             ; \LoadLibraryA
    0040B80C   .  8BF8          mov edi,eax                                      //将返回值保存在edi中
    0040B80E   .  68 F0EE4000   push _VaxC.0040EEF0                                      ; /ProcNameOrOrdinal = "sxym"
    0040B813   .  57            push edi                                                 ; |hModule
    0040B814   .  FF15 1E204100 call dword ptr ds:[<&kernel32.GetProcAddress>]           ; \GetProcAddress
    0040B81A   .  8BF8          mov edi,eax                        //取得sxym地址以备调用
    0040B81C   .  FFD7          call edi           //调用Dll.dll中的函数sxym
    0040B81E   .  61            popad
    0040B81F   .  55            push ebp
    0040B820   .  8BEC          mov ebp,esp
    0040B822   .  6A FF         push -1
      //这里应该加上sub esp,8  我少加了,呵呵,但工作没有问题,实际上是应该加上的呀!
    0040B824   .^ E9 32F2FFFF   jmp _VaxC.0040AA5B

    同时把0040AA56处改为0040AA56 > $ /E9 A50D0000   jmp _VaxC.0040B800


    呵呵,简单写了一下,调试起来是很快的,但写文章是很累的.这里说明几个材料

    1,sxym的函数原型
      自定义函数

       void sxym();  //这是我在VC++ MFC扩展dll中自己加的

    2,提供的成品dll.dll中我加了Obsidium壳,调用了SDK函数,程序调用这个dll需要注册,否则在程序自身目录
      写下本机的注册文件Machine.txt,如果已注册则不会出现这个提示.
      
      这是为本程序写下一篇留下的

    3,VaxC.exe是我自己写的工具,干什么用的大家可以看说明,这个东西在我自己的机器上用起来很舒服.但,本着学习的
      目的,我禁止任何人用此程序用于任何经营目的,否则后果自负!请于下载24小时内自行删除
    呵呵

    4,有兴趣者可以脱壳dll.dll,让大家也都来学习一下.如需要key我也可以提供,但前提是你需要给我你的机器码,这个机器码是每台电脑各不一样,因此key文件是不通用的.

                                 by wyqzm 2007-10-7

    [ 本帖最后由 wyqzm 于 2007-10-7 10:20 编辑 ]
    SpxImage.gif

    Obsidium注册演示之一[前篇-逆向分析].rar

    444.02 KB, 下载次数: 32, 下载积分: 飘云币 -2 枚

    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    4 天前
  • 签到天数: 610 天

    [LV.9]以坛为家II

     楼主| 发表于 2007-10-7 16:43:21 | 显示全部楼层
    呵呵,人气似乎比较差呀! 大家是不是都忙着渡假呀?
    文中dll有源码的,有兴趣跟我讨论
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-10-7 17:41:54 | 显示全部楼层
    看不懂。不过努力学之。顶一下!!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-10-7 18:44:56 | 显示全部楼层
    兄弟写的不错.来学习学习../:good
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表