首页
社区
课程
招聘
[原创]Obsidium注册演示之一[前篇->逆向分析]
2007-10-7 10:45 6670

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

2007-10-7 10:45
6670
姑且先叫这个名字,让你失望了,不是逆向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

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (6)
雪    币: 896
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
fly 85 2007-10-7 11:32
2
0
不错,支持一下
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
【BiNg】 2007-10-7 12:07
3
0
学习,学习,在学习
雪    币: 256
活跃值: (453)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
wyqzm 1 2007-10-7 12:55
4
0
试问一下路过的大侠,如果在dll中写代码,由于GetModuleHandle()每次获得的基址是变化的,如下面所示

1000B00: push ebp  //假设的起始地址
....
1000B10   74 20 je 1000B20  //要修改的地址
....
1000B20  

1000B10-1000B00=10,获得基址后+10,是可以的,但如果这个程序修改了或是升级了,原来在1000B10处的je 1000B20,现在的地址是1000B15了,那么如何搜索代码再次自动定位这个特征?

mov eax,[搜索到的值]
test eax,2074
jnz 不相等再跳回去找

这样的代码该如何写?
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bossline 2007-11-23 13:35
5
0
谢谢...我去试一下..
雪    币: 716
活跃值: (162)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
elance 6 2007-11-23 14:37
6
0
没看懂是干嘛的,
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
张沥 2007-12-13 20:29
7
0
88988000375DAAFC3260AD59

给注册一下,谢谢!
游客
登录 | 注册 方可回帖
返回