【文章标题】: 改造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虚拟机自动化脱壳的方法