能力值:
( LV3,RANK:20 )
2 楼
暂时只看了第一页:
在干掉了两个病毒
建议: 在克服了两个病毒后(一个是身体的,另一个是电脑的),终于上传了最新的教程。
This is where the
real learning will
come in .
=>
By doing the homework ,
critical knowledge will
be gained .
=> 课后作业才是学习重点呢.
这个循环的唯一责任是从
窗口 接收“消息” //不是图像界面的窗口, 是 Windows OS
我们要在WinMain过程中提供一个无线循环
建议: 我们要在WinMain函数中编写一个无限循环,以及随时可以处理返回信息的回调函数。然后该循环将其接收到的消息发送给我们的回调函数,在回调函数中我们决定是否对特定的消息做处理,或只让Windows处理它。
(我认为在这里不需要强调'地址', 略感累赘)
=========
另外, 看来我需要补充一下之前提议的更动.
注意它将ARG.3拷贝到EAX和EDX。然后它对EDX完成了16位SHR(右移位)操作。然后对该值做OR操作,如果它不是0,就跳转。基本上这是在检测参数的两个高位字节是否是0(你正在读汇编语言的书,不是吗?) ,是用来告诉我们资源是怎样被影响到的。
那为毛检测0 而不是1/2/3? 因为在Winuser.h中, BN_CLICKED就是零 (Button_Clicked).
在之前的附件中有以下一段劣解, 看来还是被遗忘了
//Win32.hlp:
BOOL CALLBACK DialogProc(
HWND hwndDlg, // handle to dialog box
UINT uMsg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
//if i recall correctly:
switch(uMsg) // [ARG.2]
{
case WM_COMMAND:
switch(HIWORD(wParam)) // notification code, high 16 bits of [ARG.3]
{
case BN_CLICKED: // it is an enum of 0 in Winuser.h
switch(LOWORD(wParam)) // identifier of the control
{
case BUTTON_1:
// ...
break;
case BUTTON_2:
// ...
break;
}
break;
}
break;
}
希望有Windows GUI 编程经验的来给给意见.
能力值:
( LV2,RANK:10 )
3 楼
沙发没有了,没有抢到…………
能力值:
( LV9,RANK:450 )
4 楼
在干掉了两个病毒
建议: 在克服了两个病毒后(一个是身体的,另一个是电脑的),终于上传了最新的教程。
回: 干掉和克服这个细节没啥影响,我也考虑过克服,不过觉得克服电脑病毒有点别扭,就使用干掉这个词了。
This is where the real learning will come in.
=> By doing the homework, critical knowledge will be gained.
=> 课后作业才是学习重点呢.
回: 你这一提醒,我了解了啥意思。不过我改成了“课后作业才是真正学习的地方”,应该也没啥问题。 这个循环的唯一责任是从窗口接收“消息” //不是图像界面的窗口, 是 Windows OS
回: 这个是我疏忽了,没注意到,已改正。
我们要在WinMain过程中提供一个无线循环
建议: 我们要在WinMain函数中编写一个无限循环,以及随时可以处理返回信息的回调函数。然后该循环将其接收到的消息发送给我们的回调函数,在回调函数中我们决定是否对特定的消息做处理,或只让Windows处理它。
(我认为在这里不需要强调'地址', 略感累赘)
回: 虽然说,说起来好像挺累赘的,不过我大概能了解作者的意思。因为在winmain中传递的确实是回调函数的地址,或者叫指针也行。作者可能想要将这个意思表达出来,他这样说确实没错,也更严谨。我认为应该保留,所以我还是坚持我的翻译。
那为毛检测0 而不是1/2/3? 因为在Winuser.h中, BN_CLICKED就是零 (Button_Clicked).
回:
这里我先引用下百度百科里的内容:
------------------来自百度百科------------------
WM_COMMAND:
窗口菜单:
LOWORD(wParam): 菜单id
HIWORD(wParam): 0
lParam: 0
如果这个消息是由子窗口控件产生,如button产生则:
LOWORD(wParam): 控件ID
HIWORD(wParam): 通知码
lParam: 子窗口句柄。
如果这个消息是由子窗口或者快捷键产生则通知码为1,由菜单产生通知码为0。
通过参数,可以区分这个消息的来源是来自于控件,快捷键还是菜单。
------------------来自百度百科------------------
上面的其实还是有点问题的,快捷键的通知码是1,子窗口或者控件的通知码则是Control-defined notification code,具体可以参考MSDN https://msdn.microsoft.com/zh-cn/library/windows/desktop/ms647591(v=vs.85).aspx
很显然,检测0,不是因为BN_CLICKED是0。而是因为
switch(HIWORD(wParam)) 要先判断该WM_COMMAND消息是不是控件产生的,所以是0的话就直接跳走了,如果不是0,就根据Control-defined notification code来判断是不是按钮被点击,然后 switch(LOWORD(wParam))判断是哪个按钮。
原文中的“This is
because the upper bits of EDX tells us the ID of the resource that has been affected.”这句很明显是错的,因为是低位保存了资源的ID,用于判断哪个资源被影响到。
能力值:
( LV3,RANK:20 )
5 楼
不能使用wParam来区分菜单和控件,因为菜单ID和控件ID可以是相同的,notification code也可以是零。(而且代码中是
JNZ )
Iczelion's Win32 Assembly Tutorial 9 : You cannot use wParam to differentiate between a menu and a control since the menu ID and control ID may be identical and the notification code may be zero.
======
刚刚做了测试, 以Resource Editor打开crackme12.exe, 把button 1的style加上BS_NOTIFY, 再经OllyDbg 调试, 随即在双击按钮后在HIWORD(wParam) 出现了0x5(
BN_DBLCLK )的值. (其他按钮没有BS_NOTIFY, 所以没有BN_DBLCLK通知码) (set conditional breakpoint DX==5)
0是BN_CLICKED 无异议了吧?
#define BN_CLICKED 0 #define BN_DBLCLK 5 #define BN_SETFOCUS 6 #define BN_KILLFOCUS 7
能力值:
( LV9,RANK:450 )
6 楼
如果Iczelion是对的话,不过我没有证据证明他错,那么你说的“不能使用wParam来区分菜单和控件,因为菜单ID和控件ID可以是相同的,notification code也可以是零。”是没错。不过代码使用JNZ恰恰说明了是通过wParam来判断是否为控件的,因为上一句是OR DX,DX。只有DX不为0时才跳转。DX不为0根据MSDN,那肯定是控件产生的,而且本例也没有菜单项。
"其他按钮没有BS_NOTIFY, 所以没有BN_DBLCLK通知码",MSDN中“To get BN_DBLCLK notification codes, the button must have the BS_RADIOBUTTON or BS_OWNERDRAW style.”,所以和BS_NOTIFY没关系。
其实BN_CLICKED是0我没异议,不过从程序流程看检测的不是BN_CLICKED
我都快绕晕了,咱别论道了
能力值:
( LV3,RANK:20 )
7 楼
那好吧, 先等你完成其余的翻译工作...
======
page 7:
仔细看这个,能够发现过程处理的其他消息只剩WM_COMMAND了(真的,每一个WM_COMMAND都有可能是一个不同的“类型” )
建议: 仔细查看下, 不难发现WM_COMMAND就是过程余下唯一会处理的消息 (尽管WM_COMMAND只是一个统称, 其实它可以传递不同“类型”的消息)。
QM_SETFONT //WM_SETFONT
page 10:
事实是,以十六进制的双字写入彻底的暴露它对该crackme是很重要的
参考: 作者以十六进制写入英文词汇"Dead"(死掉了) 暗示该处在crackme的重要性。
能力值:
( LV2,RANK:10 )
8 楼
不能太纠结,重要的是理解思路
不可能所有的案例在所有的系统上都能重新操练
能力值:
( LV9,RANK:450 )
9 楼
我还真没注意到那是个dead。我还纳闷这句怎么说不通呢
你这用自己语言组织的也挺好。
能力值:
( LV2,RANK:10 )
10 楼
杀了安于生,
还有后来人,
革命要努力,
坚持最难得。
能力值:
( LV2,RANK:10 )
11 楼
Wake up,wake up.I believe you can do better.
能力值:
( LV3,RANK:20 )
12 楼
樓主你會繼續更新嗎?
能力值:
( LV9,RANK:450 )
13 楼
会的,最近有事忙,加上原网站挂了,在贴图时比较麻烦,所以进度下来了
能力值:
( LV2,RANK:10 )
14 楼
希望 复出吧。。。
能力值:
( LV2,RANK:10 )
15 楼
等楼主更新,好久没更新了!
能力值:
( LV2,RANK:10 )
16 楼
楼主,能不能把原版放出来,我想看看后面的,等我翻译了,也贴出来