姑且先叫这个名字,让你失望了,不是逆向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:[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
附件下载:
Obsidium注册演示之一[前篇-逆向分析].rar
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!