wyqzm 发表于 2007-10-7 09:59:59

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

注意:让你失望了,不是逆向Obsidium本身,我没那个水平

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

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


一,载入程序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载入来到

我的程序界面

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:
0040AA6B|.50            push eax
0040AA6C|.64:8925 00000>mov dword ptr fs:,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 编辑 ]

wyqzm 发表于 2007-10-7 16:43:21

呵呵,人气似乎比较差呀! 大家是不是都忙着渡假呀?
文中dll有源码的,有兴趣跟我讨论

senots 发表于 2007-10-7 17:41:54

看不懂。不过努力学之。顶一下!!

tigerisme 发表于 2007-10-7 18:44:56

兄弟写的不错.来学习学习../:good
页: [1]
查看完整版本: Obsidium注册演示之一[前篇->逆向分析]