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

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

2015-5-30 23:59
11098
收藏
免费 3
支持
分享
最新回复 (15)
雪    币: 30
活跃值: (25)
能力值: ( 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 编程经验的来给给意见.
2015-5-31 03:54
0
雪    币: 16420
活跃值: (1670)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
沙发没有了,没有抢到…………
2015-5-31 08:03
0
雪    币: 511
活跃值: (353)
能力值: ( 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,用于判断哪个资源被影响到。
2015-5-31 08:37
0
雪    币: 30
活跃值: (25)
能力值: ( 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
2015-5-31 20:35
0
雪    币: 511
活跃值: (353)
能力值: ( 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

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

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

QM_SETFONT //WM_SETFONT

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