首页
社区
课程
招聘
[原创] 改造MoleBox Pr
发表于: 2008-11-7 19:27 11842

[原创] 改造MoleBox Pr

2008-11-7 19:27
11842
【文章标题】: 改造MoleBox Pr
【文章作者】: fyc132
【作者邮箱】: 286751251@qq.com
【作者QQ号】: 286751251
【软件名称】: MoleBox Pr
【下载地址】: 附件
【保护方式】: 无
【编写语言】: Microsoft Visual C++ ver 5.0/6.0
【使用工具】: OD
【操作平台】: Xp+Sp3
【软件介绍】: 可以将一个应用程序和它的所有数据文件全部打包到一
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  想必MoleBox Pr大家都知道吧,可以将一个应用程序和它的所有数据文件全部打包到一个exe文件中,打包后的程序可以和以前一样的运行
  我在网上找的是别人汉化好的,可以无限期使用,可是启动的时候弹出个NAG,用的很不舒服。决定把这个NAG去掉。

  No.1
  在去掉一个NAG之前,我们得先了解这个对话框是通过什么函数调用出来的,用OD载入后,按CTRL+N键打开函数,发现一些常用的函数USER32.DialogBoxParamA,但是我们得确认下那个对话框是不是调用这个函数启动的,选中这个函数点右键点在每个参考上设置断点,F9运行程序,果然断下了,这说明程序是调用DialogBoxParamA来启动程序的
  No.2

  已经找到了NAG的启动函数,那我们就把NAG的启动改为主界面.
  首先介绍下DialogBoxParamA函数:
  
  函数功能:该函数根据对话框模板资源创建一个模态的对话框。在显示对话框之前,函数把一个应用程序定义的值作为WM_INITDIALOG消息的IParam参数传到对话框过程,应用程序可用此值来初始化对话框控制。
  
      函数原型:int DialogBoxParam(HINSTANCE hlnstance,LPCTSTR IpTemplateName,HWND hWndParent, DLGPROCIPDialogFunc,LPARAM dwlnitParam);
  
      参数:
  
      hlnstance:标识一个模块的事例,该模块的可执行文件含有对话框模板。
  
      IpTemplateName:标识对话框模板。此参数可以指向一个以NULL结尾的字符串的指针,该字符串指定对话框模扳名,或是指定对话框模板的资源标识符的一个整型值。如果此参数指定了一个资源标识符,则它的高位字一定为零,且低位字一定含有标识符。一定用MAKEINTRESOURDE宏指令创建此值。
  
      hWndParent:指定拥有对话框的窗口。
  
      IpDirlogFunc:指向对话框过程的指针。有关更详细的关于对话框过程的信息,请参见DialogProc。
  
      dwlnitaram:指定传递到WM_INITDIALOG消息的IParam参数中的对话框过程的值。
  
      返回值:如果函数调用成功则返回值为在对函数EndDialog的调用中的nResult参数,该EndDialog函数用于中止对话框。如果函数调用失败,则返回值为C1。若想获得错误信息,请调用GetLastError函数。
  
      备注:DialogBoxParam函数用CreateWindowEx函数创建对话框。然后把一个WM_INITDIALOGG消息传递到对话框过程。如果模板指定DS_SETFONT类型,DialogBoxParam函数把一个WM_SETFONT消息传递到对话框过程。(不管模板是否指定WS_VISIBLE类型),函数显示对话框使拥有窗口失效,且为对话框启动它本身的消息循环来检取和传递消息。当对话框应用程序调用EndDialog函数时,DialogBoxParam函数清除对话框中止消息循环;使拥有窗口生效(如果以前有效),且返回函数EndDialog的调用中的nReSUlt参数。Windows 95和以后版本:系统可支持每个对话框模板最多为255个控制。为把多于255个控制放入对话框,可以在WM_INITDLALOG消息处理器中创建控制,而不是把它们放入模板中。Windows CE:IPTemplateName参数指向的对话框模板中DLGTEMPLATE结构并不支持所有的类型。
  
      速查:Windows NT:3.1及以上版本:Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:Winuser.h;库文件:USer32.lib:Unicode:在Windows NT上实现为Unicode和ANSI两种版本。
  
  说明如上,程序中的代码如下:
  0041FE00  /$  8B4424 04     mov     eax, dword ptr [esp+4]
  0041FE04  |.  8B5424 08     mov     edx, dword ptr [esp+8]
  0041FE08  |.  3D 49040000   cmp     eax, 449
  0041FE0D  |.  6A 00         push    0                                ; /lParam = NULL
  0041FE0F  |.  0F94C1        sete    cl                               ; |
  0041FE12  |.  68 40FE4100   push    0041FE40                         ; |DlgProc = 原.0041FE40
  0041FE17  |.  25 FFFF0000   and     eax, 0FFFF                       ; |
  0041FE1C  |.  52            push    edx                              ; |hOwner
  0041FE1D  |.  50            push    eax                              ; |pTemplate
  0041FE1E  |.  6A 00         push    0                                ; |/pModule = NULL
  0041FE20  |.  880D 31D04200 mov     byte ptr [42D031], cl            ; ||
  0041FE26  |.  FF15 80504200 call    dword ptr [<&KERNEL32.GetModuleH>; |\GetModuleHandleA
  0041FE2C  |.  50            push    eax                              ; |hInst
  0041FE2D  |.  FF15 EC524200 call    dword ptr [<&USER32.DialogBoxPar>; \DialogBoxParamA
  0041FE33  \.  C3            retn
  我们现在需要定位主程序的对话框的地址,继续F9,进去主界面后又被断了下来.

  00413490  /$  6A FF         push    -1
  00413492  |.  68 FB2B4200   push    00422BFB                         ;  SE 处理程序安装
  00413497  |.  64:A1 0000000>mov     eax, dword ptr fs:[0]
  0041349D  |.  50            push    eax
  0041349E  |.  64:8925 00000>mov     dword ptr fs:[0], esp
  004134A5  |.  51            push    ecx
  004134A6  |.  6A 7C         push    7C
  004134A8  |.  E8 73DEFEFF   call    00401320
  004134AD  |.  83C4 04       add     esp, 4
  004134B0  |.  894424 00     mov     dword ptr [esp], eax
  004134B4  |.  85C0          test    eax, eax
  004134B6  |.  C74424 0C 000>mov     dword ptr [esp+C], 0
  004134BE  |.  74 09         je      short 004134C9
  004134C0  |.  8BC8          mov     ecx, eax
  004134C2  |.  E8 59000000   call    00413520
  004134C7  |.  EB 02         jmp     short 004134CB
  004134C9  |>  33C0          xor     eax, eax
  004134CB  |>  A3 14CF4200   mov     dword ptr [42CF14], eax
  004134D0  |.  8B4424 14     mov     eax, dword ptr [esp+14]
  004134D4  |.  6A 00         push    0                                ; /lParam = NULL
  004134D6  |.  68 702E4100   push    00412E70                         ; |DlgProc = 原.00412E70
  004134DB  |.  25 FFFF0000   and     eax, 0FFFF                       ; |
  004134E0  |.  6A 00         push    0                                ; |hOwner = NULL
  004134E2  |.  50            push    eax                              ; |pTemplate
  004134E3  |.  6A 00         push    0                                ; |/pModule = NULL
  004134E5  |.  C74424 20 FFF>mov     dword ptr [esp+20], -1           ; ||
  004134ED  |.  FF15 80504200 call    dword ptr [<&KERNEL32.GetModuleH>; |\GetModuleHandleA
  004134F3  |.  50            push    eax                              ; |hInst
  004134F4  |.  FF15 EC524200 call    dword ptr [<&USER32.DialogBoxPar>; \DialogBoxParamA
  004134FA  |.  8B0D 14CF4200 mov     ecx, dword ptr [42CF14]
  00413500  |.  85C9          test    ecx, ecx
  00413502  |.  74 07         je      short 0041350B
  00413504  |.  6A 01         push    1
  00413506  |.  E8 D5000000   call    004135E0
  0041350B  |>  8B4C24 04     mov     ecx, dword ptr [esp+4]
  0041350F  |.  64:890D 00000>mov     dword ptr fs:[0], ecx
  00413516  |.  83C4 10       add     esp, 10
  00413519  \.  C3            retn
  我们现在只需要把004134D4  |.  6A 00         push    0                                ; /lParam = NULL
  004134D6  |.  68 702E4100   push    00412E70                         ; |DlgProc = 原.00412E70
  004134DB  |.  25 FFFF0000   and     eax, 0FFFF                       ; |
  004134E0  |.  6A 00         push    0                                ; |hOwner = NULL
  004134E2  |.  50            push    eax                              ; |pTemplate
  004134E3  |.  6A 00         push    0                                ; |/pModule = NULL
  004134E5  |.  C74424 20 FFF>mov     dword ptr [esp+20], -1           ; ||
  004134ED  |.  FF15 80504200 call    dword ptr [<&KERNEL32.GetModuleH>; |\GetModuleHandleA
  004134F3  |.  50            push    eax                              ; |hInst
  004134F4  |.  FF15 EC524200 call    dword ptr [<&USER32.DialogBoxPar>; \DialogBoxParamA
  覆盖到NAG的代码头就可以了,选中上面代码,右键--二进制--二进制复制
  然后打开NAG的代码0041FE00
选中这个代码段的代码-继续右键--二进制--二进粘贴,把下面多余的代码NOP掉,

  保存程序,OK
  打开我们修改好的程序,NAG已经去掉了
  
--------------------------------------------------------------------------------
【经验总结】
  去NAG方法经验小结:
  1.找到调用NAG的函数代码
  2.找到主页面的函数代码
  3.用主页面的代码替换NAG的代码
  4.保存
  5.OK  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2008年11月07日 下午 07:17:49

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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (22)
雪    币: 1564
活跃值: (3572)
能力值: ( LV13,RANK:420 )
在线值:
发帖
回帖
粉丝
2
(*^__^*) 嘻嘻……,图文并茂,是不是容易理解一点
2008-11-7 20:37
0
雪    币: 251
活跃值: (25)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
3
好文章,支持一下
2008-11-7 20:44
0
雪    币: 7906
活跃值: (3086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我更喜欢语音带视频的
2008-11-8 01:01
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
更简单的方法,用资源编辑器直接把那个Dialog删除就可以了。
2008-11-8 10:58
0
雪    币: 1564
活跃值: (3572)
能力值: ( LV13,RANK:420 )
在线值:
发帖
回帖
粉丝
6
楼上的,自己弄好后再说
对话框资源没了,程序无法载入对话框,自然也进入不了主页面,这个办法自然行不通
2008-11-8 11:21
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
nvr
7
支持一下~!!!!!!!!!!!!!!!完全支持这样的文章~!
你这个方法很值得学习~!
不过  直接把调用对话框的CALL NOP掉好像直接就可以去 掉对话框了~!
2008-11-8 11:38
0
雪    币: 1432
活跃值: (823)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
直接改个NAG标志位或许更简单点~
2008-11-8 11:49
0
雪    币: 1564
活跃值: (3572)
能力值: ( LV13,RANK:420 )
在线值:
发帖
回帖
粉丝
9
介绍了去NAG的基本思路
2008-11-8 12:03
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
认真看了看,好像这个注册窗口和程序运行的主窗口都是使用DialogBoxParamA函数.
是不是说,如果两个窗口使用的不是同样的函数构建,就不能用这个方法?
2008-11-8 17:53
0
雪    币: 1564
活跃值: (3572)
能力值: ( LV13,RANK:420 )
在线值:
发帖
回帖
粉丝
11
如果不是同样的函数的话,就让NAG窗口代码段的开头跳到主页面的的代码就可以了
2008-11-8 18:39
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
12
请问这是在干嘛用的, 好像很受欢迎.
我怎看不出用途为何?
2008-11-8 19:19
0
雪    币: 1564
活跃值: (3572)
能力值: ( LV13,RANK:420 )
在线值:
发帖
回帖
粉丝
13
就是去NAG窗口,(*^__^*) 嘻嘻……
2008-11-8 19:47
0
雪    币: 12055
活跃值: (4768)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
有点看不明...
2008-11-9 14:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
小儿科的事,看来是看雪看多了。你试试附件(其它文件没有上传,到一楼下载完整,再将附件放进去)

附件下载:

http://www.live-share.com/files/365334/___1.rar.html
2008-11-9 23:27
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
又学到了下段点DialogBoxParam来解决 多谢楼主拉````
思路:
不让NAG窗口代码运行就可以了

1.下调用窗口函数法
2.堆栈F12调用法
3.改跳转法(如果是注册才取消的NAG窗)
2008-11-10 03:27
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
你怎么知道哪个是主页面的函数代码
2008-11-20 22:19
0
雪    币: 1564
活跃值: (3572)
能力值: ( LV13,RANK:420 )
在线值:
发帖
回帖
粉丝
18
函数分析,经验吧
2008-11-20 22:25
0
雪    币: 209
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
真是不错啊~哈哈
2008-11-21 13:56
0
雪    币: 340
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
图文并茂。很详细的说,容易消化。o(∩_∩)o

我再补充一种前辈的方法去nag一般情况都比较有效:

想必好多朋友都晓得。

F12 :-)

。。。汗 16楼说过了。。 嘿嘿 我觉得F12最简单。。

API也很容易的说。
2008-11-21 14:31
0
雪    币: 282
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
呵呵,不错不错,学习了。。
2008-12-1 22:31
0
雪    币: 186
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
不知道把两个函数的对话框地址改成一样,,行不
2009-9-5 19:31
0
雪    币: 173
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
学习了 嘿嘿
2009-12-26 23:53
0
游客
登录 | 注册 方可回帖
返回
//