首页
社区
课程
招聘
[翻译]R4ndom破解教程全文翻译(For新手):第十六章(上)
2015-5-30 23:59 10329

[翻译]R4ndom破解教程全文翻译(For新手):第十六章(上)

2015-5-30 23:59
10329

翻译说明:
1、本教程在  52破解论坛  及  看雪论坛  全球同步首发!
2、本教程翻译自国外的The Legend of Random的系列教程,英文原文地址:http://thelegendofrandom.com/blog/sample-page。本翻译教程只是为了给不愿看英文教程以及英文水平不好的人提供方便,同时也是自己的学习过程。该教程对英文水平要求不是很高,不过个人水平有限,有些地方翻译不准的请批评指正。
3、本翻译教程请勿用于商业用途。另,转载请注明!!!
4、感谢The Legend of Random!

发帖说明:
根据译者的时间安排,快的话2-3天会上传一章,慢的话就不造了。如果有段时间没更新请勿怪,因为译者的工作性质,有时是接触不到网络的。

其他章节:
全系列章节导航帖



对不起了大家,咱坛编辑帖子实在太麻烦,有需要的可以下载PDF文件看。

本文PDF文件下载(已排版):
第十六章(上):Windows消息的处理.pdf
本文相关附件下载地址(国外链接,不是一直好用):
(截止到2015年5月30日23时50分,本章原作者的网站无法打开,故无法提供相关下载链接)

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
点赞1
打赏
分享
最新回复 (15)
雪    币: 30
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
三蚊雞 2015-5-31 03:54
2
0
暂时只看了第一页:
在干掉了两个病毒
建议: 在克服了两个病毒后(一个是身体的,另一个是电脑的),终于上传了最新的教程。

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 编程经验的来给给意见.
雪    币: 15937
活跃值: (1125)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
killbr 2015-5-31 08:03
3
0
沙发没有了,没有抢到…………
雪    币: 511
活跃值: (353)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
QQSniper 9 2015-5-31 08:37
4
0
在干掉了两个病毒
建议: 在克服了两个病毒后(一个是身体的,另一个是电脑的),终于上传了最新的教程。
回:干掉和克服这个细节没啥影响,我也考虑过克服,不过觉得克服电脑病毒有点别扭,就使用干掉这个词了。

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,用于判断哪个资源被影响到。
雪    币: 30
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
三蚊雞 2015-5-31 20:35
5
0
不能使用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
雪    币: 511
活跃值: (353)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
QQSniper 9 2015-5-31 22:10
6
0
如果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

我都快绕晕了,咱别论道了
雪    币: 30
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
三蚊雞 2015-5-31 22:41
7
0
那好吧, 先等你完成其余的翻译工作...

======
page 7:
仔细看这个,能够发现过程处理的其他消息只剩WM_COMMAND了(真的,每一个WM_COMMAND都有可能是一个不同的“类型” )
建议: 仔细查看下, 不难发现WM_COMMAND就是过程余下唯一会处理的消息 (尽管WM_COMMAND只是一个统称, 其实它可以传递不同“类型”的消息)。

QM_SETFONT //WM_SETFONT

page 10:
事实是,以十六进制的双字写入彻底的暴露它对该crackme是很重要的
参考: 作者以十六进制写入英文词汇"Dead"(死掉了) 暗示该处在crackme的重要性。
雪    币: 15937
活跃值: (1125)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
killbr 2015-6-1 07:34
8
0
不能太纠结,重要的是理解思路
不可能所有的案例在所有的系统上都能重新操练
雪    币: 511
活跃值: (353)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
QQSniper 9 2015-6-1 09:05
9
0
我还真没注意到那是个dead。我还纳闷这句怎么说不通呢
你这用自己语言组织的也挺好。
雪    币: 15937
活跃值: (1125)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
killbr 2015-6-2 07:53
10
0
杀了安于生,
还有后来人,
革命要努力,
坚持最难得。
雪    币: 15937
活跃值: (1125)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
killbr 2015-6-8 07:13
11
0
Wake up,wake up.I believe you can do better.
雪    币: 30
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
三蚊雞 2015-6-10 18:57
12
0
樓主你會繼續更新嗎?
雪    币: 511
活跃值: (353)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
QQSniper 9 2015-6-10 21:32
13
0
会的,最近有事忙,加上原网站挂了,在贴图时比较麻烦,所以进度下来了
雪    币: 15937
活跃值: (1125)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
killbr 2015-7-4 16:27
14
0
希望 复出吧。。。
雪    币: 2
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
韩立l 2015-7-25 03:22
15
0
等楼主更新,好久没更新了!
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
老梨nobody 2018-5-24 19:49
16
0
楼主,能不能把原版放出来,我想看看后面的,等我翻译了,也贴出来
游客
登录 | 注册 方可回帖
返回