-
-
[逆向]再现 Window 按钮突破专家
-
发表于:
2005-1-24 00:04
10194
-
【破解作者】 sisess
【作者邮箱】 pangshijie@sina.com
【使用工具】 olldbg vc++6.0
【破解平台】 Win9x/NT/2000/XP
【软件名称】 Window 按钮突破专家
【软件简介】 看学主页下载的一个小工具“Window 按钮突破专家”,可以让灰色的按钮变成可用,对我们做Crack时挺有帮助的,这小工具如
何神奇法呢?让我们大家一起来看看:)
【破解声明】 好东西不敢独自分享~!建议用1024X768分辨率观看~:)
--------------------------------------------------------------------------------
【破解内容】
首先用olldbg把它反汇编:
00401000 |. 6A 00...... push 0...........................................; /pModule = NULL
00401002 |. E8 19010000 call <jmp.&KERNEL32.GetModuleHandleA>............; \GetModuleHandleA
00401007 |. 6A 00...... push 0...........................................; /lParam = NULL
00401009 |. 68 1E104000 push Window_?0040101E............................; |DlgProc = Window_?0040101E
0040100E |. 6A 00...... push 0...........................................; |hOwner = NULL
00401010 |. 6A 65...... push 65..........................................; |pTemplate = 65
00401012 |. 50......... push eax.........................................; |hInst
00401013 |. E8 14010000 call <jmp.&USER32.DialogBoxParamA>...............; \DialogBoxParamA
00401018 |. 50......... push eax.........................................; /ExitCode
00401019 \. E8 FC000000 call <jmp.&KERNEL32.ExitProcess>.................; \ExitProcess
0040101E /. 55......... push ebp.........................................;这部分是创建窗口和退出的代码
0040101F |. 8B EC...... mov ebp,esp......................................;
00401021 |. 817D0C13010 cmp dword ptr ss:[ebp+C],113.....................;判断是否发生了计时器事件
00401028 |. 74 4F...... je short Window_?00401079........................;发生了就跳到00401079
0040102A |. 817D0C10010 cmp dword ptr ss:[ebp+C],110.....................;判断对话框是否显示了
00401031 |. 74 0F...... je short Window_?00401042........................;显示的话跳到00401042
00401033 |. 837D 0C 10. cmp dword ptr ss:[ebp+C],10.....................;WM_CLOSE是否要退出了
00401037 |. 74 27...... je short Window_?00401060........................;退出就做退出的事
00401039 |. B8 00000000 mov eax,0
0040103E |. C9......... leave
0040103F |. C2 1000.... retn 10
00401042 |> 6A 00...... push 0...........................................; /Timerproc = NULL
00401044 |. 68 C8000000 push 0C8.........................................; |Timeout = 200. ms
00401049 |. 68 00040000 push 400.........................................; |TimerID = 400 (1024.)
0040104E |. FF75 08.... push dword ptr ss:[ebp+8]........................; |hWnd
00401051 |. E8 0C010000 call <jmp.&USER32.SetTimer>......................; \SetTimer
00401056 |. 8B45 08.... mov eax,dword ptr ss:[ebp+8].....................;建立一个计时器
00401059 |. A3 0E304000 mov dword ptr ds:[40300E],eax
0040105E |. EB 64...... jmp short Window_?004010C4
00401060 |> 68 00040000 push 400.........................................; /TimerID = 400 (1024.)
00401065 |. FF75 08 push dword ptr ss:[ebp+8]........................; |hWnd
00401068 |. E8 E9000000 call <jmp.&USER32.KillTimer>.....................; \KillTimer关闭计时器
0040106D |. 6A 00...... push 0...........................................; /Result = 0
0040106F |. FF75 08.... push dword ptr ss:[ebp+8]........................; |hWnd
00401072 |. E8 C1000000 call <jmp.&USER32.EndDialog>.....................; \EndDialog
00401077 |. EB 4B...... jmp short Window_?004010C4.......................;关闭对话框
00401079 |> 68 E9030000 push 3E9.........................................; /ButtonID = 3E9 (1001.)
0040107E |. FF75 08.... push dword ptr ss:[ebp+8]........................; |hWnd
00401081 |. E8 C4000000 call <jmp.&USER32.IsDlgButtonChecked>.............; \IsDlgButtonChecked
00401086 |. 83F8 01.... cmp eax,1........................................;复选按键是否被点上了
00401089 |. 75 39...... jnz short Window_?004010C4
0040108B |. E8 B4000000 call <jmp.&USER32.GetForegroundWindow>...........; [GetForegroundWindow
00401090 |. 50......... push eax.........................................;获取当前窗口
00401091 |. 50......... push eax.........................................; /<%lX>
00401092 |. 68 00304000 push Window_?00403000............................; |Format = "%lX"
00401097 |. 68 04304000 push Window_?00403004............................; |s = Window_?00403004
0040109C |. E8 85000000 call <jmp.&USER32.wsprintfA>.....................; \wsprintfA
004010A1 |. 83C4 0C.... add esp,0C.......................................;格式取字符
004010A4 |. 68 04304000 push Window_?00403004............................; /Text = ""
004010A9 |. 68 EA030000 push 3EA.........................................; |ControlID = 3EA (1002.)
004010AE |. FF75 08.... push dword ptr ss:[ebp+8]........................; |hWnd
004010B1 |. E8 A6000000 call <jmp.&USER32.SetDlgItemTextA>...............; \SetDlgItemTextA
004010B6 |. 58......... pop eax..........................................;把当前窗口的hWnd放到控件3EA去
004010B7 |. 6A 00...... push 0...........................................; /lParam = 0
004010B9 |. 68 CD104000 push Window_?004010CD ; |Callback = Window_?004010CD
004010BE |. 50......... push eax.........................................; |hParent
004010BF |. E8 7A000000 call <jmp.&USER32.EnumChildWindows>..............; \EnumChildWindows
004010C4 |> B8 01000000 mov eax,1........................................;枚举子窗口
004010C9 |. C9......... leave
004010CA \. C2 1000.... retn 10
004010CD /. 55......... push ebp.........................................;枚举出的窗口都做以下任务
004010CE |. 8B EC...... mov ebp,esp......................................;什么任务呢,往下看看
004010D0 |. FF75 08.... push dword ptr ss:[ebp+8]........................; /hWnd
004010D3 |. E8 78000000 call <jmp.&USER32.IsWindowEnabled>...............; \IsWindowEnabled
004010D8 |. 83F8 01.... cmp eax,1........................................;子hWnd是否是激活的
004010DB |. 74 34...... je short Window_?00401111........................;激活的话啥事也不做
004010DD |. 6A 01...... push 1...........................................; /Enable = TRUE
004010DF |. FF75 08.... push dword ptr ss:[ebp+8]........................; |hWnd
004010E2 |. E8 4B000000 call <jmp.&USER32.EnableWindow>..................; \EnableWindow激活窗口
004010E7 |. FF75 08.... push dword ptr ss:[ebp+8]........................; /<%lX>
004010EA |. 68 00304000 push Window_?00403000............................; |Format = "%lX"
004010EF |. 68 04304000 push Window_?00403004............................; |s = Window_?00403004
004010F4 |. E8 2D000000 call <jmp.&USER32.wsprintfA>.....................; \wsprintfA
004010F9 |. 83C4 0C.... add esp,0C.......................................;格式取字符
004010FC |. 68 04304000 push Window_?00403004............................; /Text = ""
00401101 |. 68 EA030000 push 3EA.........................................; |ControlID = 3EA (1002.)
00401106 |. FF35 0E3040 push dword ptr ds:[40300E].......................; |hWnd = NULL
0040110C |. E8 4B000000 call <jmp.&USER32.SetDlgItemTextA>...............; \SetDlgItemTextA
00401111 |> B8 01000000 mov eax,1........................................;把子hWnd放到控件3EA去
00401116 |. C9......... leave
00401117 \. C2 0800.... retn 8
这软件要做的事情很明了了~~
也就是用EnumChildWindows函数去搜索一下有没有没被激活的子窗口hWnd,有的话就激活它.
再注意看下代码,上面出现了个神秘控件ControlID = 3EA (1002.)
可打开“Window 按钮突破专家”就看到一个复选框而已,用资源工具如eXeScope看下你就晓得是什么东西了:)作者把它隐藏的一个EDIT控件,
用做显示hWnd用的.
看到这里了,有没有想过自己也来写一个这样的软件?毕竟是自己做的嘛~~~人家看起来也佩服.
我是想过了,但我是怎么做的呢?和大家分享一下:)
先声明:我这里不用EnumChildWindows函数,因为如果一个软件有2个子hWnd是没被激活的话,用EnumChildWindows函数会一起把它们激活,可是我
只想要一个激活而已,那怎么办呢?所以嘛就不用EnumChildWindows函数了.
下面是我写的VC++6.0代码:(所有控件和“Window 按钮突破专家”的一个样,一个复选框就可以了)
void CEnableDlg::OnTimer(UINT nIDEvent) //这里是计时器事件
{
HWND hWnd,hWndChild;//变量声明
POINT point;
if(IsDlgButtonChecked(IDC_CHECK))
{
hWnd=::GetForegroundWindow();//获取当前窗口的hWnd
GetCursorPos(&point);//获取鼠标坐标
::ScreenToClient(hWnd,&point);//转换为客户坐标
hWndChild=::ChildWindowFromPoint(hWnd,point);//我这里用了个ChildWindowFromPoint函数,目的是获取子hWnd
if(::IsWindowEnabled(hWndChild)==0)//子hWnd是否没被激活
{
::EnableWindow(hWndChild,1);//激活子hWnd
}
}
CDialog::OnTimer(nIDEvent);
}
void CEnableDlg::OnCheck() //这里是复选框的事件
{
SetTimer(1,100,NULL);//建立一个计时器
}
void CEnableDlg::OnClose() //退出事目的释放内存
{
KillTimer(1);//终止计时器
EndDialog(1);//关闭窗口
CDialog::OnClose();
}
代码也就那么简单~~~噢,忘了说明下了,我用的系统版本是(Window2000 Service Pack 3)
文章就写到这了,不知道大家有什么收获没有~:)
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 热烈征求意见,鄙视看不起人的人,转载请注明作者并保持文章的完整, 谢谢!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课