魔剑天下 发表于 2006-6-24 13:51:23

打造自己喜欢的 Ollydbg

打造自己喜欢的 Ollydbg上次上传了个英文版 OD1.10 的 DIY,感觉很粗糙,当时由于打包压缩时误删了笔记,所以只能上传成品附件,也没空重写。近来,有些时间就重来一次,把功能稍作完善一下,本想使菜单能看见工具的图标的,美化一下的,可是脑子里没门,现在也够用,就算了。

DIY 过程如下(下面的内容多数不是为新手准备的):

首先,我们用LordPE加载 OD1.10 中文版,翻到 区段 和目录 部分,将重定位表偏移地址记住,然后擦除重定位表的所有相关信息,用16进制工具裁掉那个section的内容,因为我们要加入资源,而资源表又不是在最后的 section,或者你可以独立将重定位表保存起来,等 DIY 成功了再补回来也是可以的。另外,对于截获OD1.10的 消息流 的位置的方法,可参阅 pll621 老大的文章

在菜单资源上 添加需要的菜单“工具(&T)”,如下:
……
POPUP "帮助(&H)"
{
MENUITEM "版本信息(&A)",2501
MENUITEM "帮助内容(&C)",2502
MENUITEM SEPARATOR
MENUITEM "选择 API 帮助文件(&P)",2503
MENUITEM "打开 API 帮助文件(&H)",2504
}
POPUP "工具(&T)"
{
MENUITEM "自定义工具",2509
MENUITEM SEPARATOR
MENUITEM "计算器",2510
}
}


下面是我自己取名的对话窗口资源脚本: DIA_CFG_TOOLMENU

DIA_CFG_TOOLMENU DIALOG 80, 30, 271, 225
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "配置工具菜单"
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
FONT 9, "宋体"
{
   CONTROL "选择工具", 9099, BUTTON, BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 8, 9, 258, 191
   CONTROL "", 9041, EDIT, ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 45, 20, 160, 12
   CONTROL "", 9042, EDIT, ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 45, 38, 160, 12
   CONTROL "", 9043, EDIT, ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 45, 56, 160, 12
   CONTROL "", 9044, EDIT, ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 45, 74, 160, 12
   CONTROL "", 9045, EDIT, ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 45, 92, 160, 12
   CONTROL "", 9046, EDIT, ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 45, 110, 160, 12
   CONTROL "", 9047, EDIT, ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 45, 128, 160, 12
   CONTROL "", 9048, EDIT, ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 45, 146, 160, 12
   CONTROL "", 9049, EDIT, ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 45, 164, 160, 12
   CONTROL "", 9050, EDIT, ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 45, 182, 160, 12
   CONTROL "Tool01:", 9021, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 13, 21, 30, 9
   CONTROL "Tool02:", 9022, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 13, 39, 30, 9
   CONTROL "Tool03:", 9023, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 13, 57, 30, 9
   CONTROL "Tool04:", 9024, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 13, 75, 30, 9
   CONTROL "Tool05:", 9025, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 13, 94, 30, 9
   CONTROL "Tool06:", 9026, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 14, 112, 30, 9
   CONTROL "Tool07:", 9027, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 13, 129, 30, 9
   CONTROL "Tool08:", 9028, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 13, 147, 30, 9
   CONTROL "Tool09:", 9029, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 13, 165, 30, 9
   CONTROL "Tool10:", 9030, STATIC, SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 13, 183, 30, 9
   CONTROL "更改", 9001, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 209, 17, 50, 14
   CONTROL "更改", 9002, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 209, 36, 50, 14
   CONTROL "更改", 9003, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 209, 55, 50, 14
   CONTROL "更改", 9004, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 209, 72, 50, 14
   CONTROL "更改", 9005, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 209, 90, 50, 14
   CONTROL "更改", 9006, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 209, 108, 50, 14
   CONTROL "更改", 9007, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 209, 126, 50, 14
   CONTROL "更改", 9008, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 209, 144, 50, 14
   CONTROL "更改", 9009, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 209, 162, 50, 14
   CONTROL "更改", 9010, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 209, 180, 50, 14
   CONTROL "确定(&O)", 8888, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 205, 50, 14
   CONTROL "取消(&C)", 2, BUTTON, BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 154, 205, 50, 14
}

上面是一个我盗取一个游戏模拟器配置菜单的对话窗口模块,各控件名称和 ID(最好不存在冲突) 全改了,位置也微调好了,反正调整到自己满意就可以!
你自己可以在 ResHacker 上测试,可是用它进补成功的!

浏览资源得知,“确定”和“取消”的 ID 分别是 2 和 1 ,我这里确定改为 8888,希望它发落去!

我找了这对话窗口(消息流较少的进行“盗版”)--> “版本信息”菜单


代码:--------------------------------------------------------------------------------
00440C3C   push ebp
00440C3D   mov ebp,esp
00440C3F   add esp,-480
00440C45   mov eax,dword ptr ss:
00440C48   mov edx,dword ptr ss:
00440C4B   sub edx,110                     ;Switch (cases 110..112)
00440C51   je short 00440C62               ;NEWHAND.00440C62
00440C53   dec edx
00440C54   je short 00440CB2               ;NEWHAND.00440CB2
00440C56   dec edx
00440C57   je 00440CF7                     ;NEWHAND.00440CF7
00440C5D   jmp 00440D0E                  ;NEWHAND.00440D0E
00440C62   mov byte ptr ss:,0   ;Case 110 (WM_INITDIALOG) of switch 00440C4B
00440C69   mov byte ptr ss:,0
00440C70   lea eax,dword ptr ss:
00440C76   lea ecx,dword ptr ss:
00440C7C   push eax                        ; /Arg6
00440C7D   push ecx                        ; |Arg5
00440C7E   push 0A                         ; |Arg4 = 0000000A
00440C80   push 1                        ; |Arg3 = 00000001
00440C82   lea eax,dword ptr ss:; |
00440C88   push 4B9073                     ; |Arg2 = 004B9073 ASCII 0A,"NewHand v%"
00440C8D   push eax                        ; |Arg1
00440C8E   call 004A6C2C                   ; \NEWHAND.004A6C2C
00440C93   add esp,18
00440C96   lea edx,dword ptr ss:
00440C9C   push edx                        ; /Text
00440C9D   push 0E75                     ; |ControlID = E75 (3701.)
00440CA2   mov ecx,dword ptr ss:    ; |
00440CA5   push ecx                        ; |hWnd
00440CA6   call 004AF58E                   ; \SetDlgItemTextA
00440CAB   call 00546360                   ;// 原指令 mov eax,1
00440CB0   jmp short 00440D10            ;NEWHAND.00440D10
00440CB2   mov edx,eax                     ;Case 111 (WM_COMMAND) of switch 00440C4B
00440CB4   and dx,0FFFF
00440CB9   cmp dx,1
00440CBD   je short 00440CC5               ;NEWHAND.00440CC5
00440CBF   cmp dx,2
00440CC3   jnz short 00440CD2            ;NEWHAND.00440CD2
00440CC5   push 0                        ; /Result = 0
00440CC7   mov ecx,dword ptr ss:    ; |
00440CCA   push ecx                        ; |hWnd
00440CCB   call 004AF3EA                   ; \EndDialog
00440CD0   jmp short 00440D0E            ;NEWHAND.00440D0E
00440CD2   call 00546206                   ;// 原指令 cmp dx,0e76
00440CD7   jnz short 00440D0E            ;NEWHAND.00440D0E
00440CD9   push 0                        ; /IsShown = 0
00440CDB   push 4B91A4                     ; |DefDir = "."
00440CE0   push 0                        ; |Parameters = NULL
00440CE2   push 4B917F                     ; |FileName = "http://home.t-online.de/home/NewHand"
00440CE7   push 4B917A                     ; |Operation = "open"
00440CEC   mov eax,dword ptr ss:    ; |
00440CEF   push eax                        ; |hWnd
00440CF0   call 004AF342                   ; \ShellExecuteA
00440CF5   jmp short 00440D0E            ;NEWHAND.00440D0E
00440CF7   and eax,0FFF0                   ;Case 112 (WM_SYSCOMMAND) of switch 00440C4B
00440CFC   cmp eax,0F060
00440D01   jnz short 00440D0E            ;NEWHAND.00440D0E
00440D03   push 0                        ; /Result = 0
00440D05   mov edx,dword ptr ss:    ; |
00440D08   push edx                        ; |hWnd
00440D09   call 004AF3EA                   ; \EndDialog
00440D0E   xor eax,eax                     ;Default case of switch 00440C4B
00440D10   mov esp,ebp
00440D12   pop ebp
00440D13   retn 10
00440D16   nop
00440D17   nop
00440D18   push 0                        ; /lParam = NULL
00440D1A   mov eax,dword ptr ds:   ; |
00440D1F   push 440C3C                     ; |DlgProc = NEWHAND.00440C3C //借用一下这里
00440D24   push eax                        ; |hOwner => NULL
00440D25   mov edx,dword ptr ds:   ; |
00440D2B   push 4B91A6                     ; |pTemplate = "DIA_ABOUT"
00440D30   push edx                        ; |hInst => NULL
00440D31   call 004AF3C6                   ; \DialogBoxParamA
00440D36   retn--------------------------------------------------------------------------------

接下来为刚才处理过的 OD1.10 中文版增加一个 1000h 长度的 section,作为编写运行代码(数据)的空间

下面是 DIY 我们自己需要的代码,对于修改消息流的指令就不贴了,已有注释,代码很乱,边改边写的,没办法了,下面看到的 API 都是从OD1.10里面找到的。。。代码区定为 va: 546000 - 5463FF

代码:--------------------------------------------------------------------------------
00546000   nop
00546001   nop
00546002   nop
00546003   nop
00546004   nop
00546005   nop
00546006   nop
00546007   nop
00546008   nop
00546009   nop
0054600A   nop
0054600B   push ebp                         ; // 激活启动 计算器 功能
0054600C   mov ebp,esp
0054600E   pushad
0054600F   add esp,-120
00546015   push 104
0054601A   lea eax,dword ptr ss:
0054601E   push eax
0054601F   call 004AF0EA                  ; <jmp.&KERNEL32.GetWindowsDirectoryA>
00546024   add eax,esp
00546026   inc eax
00546027   mov dword ptr ds:,636C6143
0054602D   mov dword ptr ds:,6578652>
00546034   mov byte ptr ds:,0
00546038   mov ebx,esp
0054603A   push 0
0054603C   push ebx
0054603D   push 0
0054603F   push eax
00546040   push 4B917A                      ; ASCII "open"
00546045   mov eax,dword ptr ss:
00546048   push eax
00546049   call 004AF342                  ; <jmp.&SHELL32.ShellExecuteA>
0054604E   add esp,120
00546054   popad
00546055   mov esp,ebp
00546057   pop ebp
00546058   jmp 00434212                     ; // 返回执行结束的应该到达的地方
0054605D   nop
0054605E   cmp dx,9CE                     ; // 来自: 433A1F 的 sub edx,9C7
00546063   je short 0054600B                ; // ID 相等 则跳往 执行 计算器
00546065   sub eax,9CD
0054606A   je 005461E0                      ; // 自定义工具菜单 ID
00546070   cmp eax,0B
00546073   ja short 0054607E                ; // 是否 新添加菜单的ID
00546075   cmp eax,2
00546078   jnb 005461A8                     ; NEWHAND.005461A8
0054607E   sub edx,9C7
00546084   jmp 00433A25                     ; // 返回原来的 消息检测队列
00546089   nop
0054608A   nop
0054608B   nop
0054608C   nop
0054608D   nop
0054608E   nop
0054608F   nop
00546090   nop
00546091   nop
00546092   nop
00546093   nop
00546094   push ebx                         ; // 初始化“工具”菜单
00546095   push ebp
00546096   mov ebp,esp
00546098   xor ebx,ebx
0054609A   push 0                           ; // 为重建菜单准备
0054609C   lea eax,dword ptr ds:
005460A2   push eax
005460A3   mov edx,dword ptr ss:
005460A6   push edx
005460A7   call 004AF55E                  ; <jmp.&USER32.RemoveMenu>
005460AC   inc ebx
005460AD   cmp ebx,0A
005460B0   jl short 0054609A                ; NEWHAND.0054609A
005460B2   xor ebx,ebx
005460B4   xor edi,edi
005460B6   push 4D53A4                      ; // Ollydbg.ini 路径
005460BB   push 100                         ; // 定义缓冲区大小
005460C0   push dword ptr ds:       ; // 缓冲区,用于读取所对应的数据
005460C6   push 4C1700
005460CB   push dword ptr ds:       ; NEWHAND.00546E08
005460D1   push 546E00                      ; ASCII "Tools"
005460D6   call 004AF08A                  ; <jmp.&KERNEL32.GetPrivateProfileStringA>
005460DB   cmp eax,0
005460DE   je short 0054614C                ; NEWHAND.0054614C
005460E0   mov eax,dword ptr ds:
005460E5   mov esi,eax
005460E7   push 0
005460E9   push 80
005460EE   push 3
005460F0   push 0
005460F2   push 3
005460F4   push 0
005460F6   push eax
005460F7   call 004AEFCA                  ; <jmp.&KERNEL32.CreateFileA>
005460FC   xor ebx,ebx
005460FE   cmp eax,-1
00546101   je short 0054610A                ; // 检测文件的存在有效性
00546103   inc ebx
00546104   push eax
00546105   call 004AEFB8                  ; <jmp.&KERNEL32.CloseHandle>
0054610A   cmp bl,1
0054610D   je short 00546117                ; NEWHAND.00546117
0054610F   mov eax,dword ptr ds:
00546114   mov byte ptr ds:,0
00546117   cmp byte ptr ds:,0
0054611A   je short 0054614C                ; NEWHAND.0054614C
0054611C   inc esi
0054611D   cmp byte ptr ds:,0
00546120   jnz short 0054611C               ; NEWHAND.0054611C
00546122   dec esi
00546123   cmp byte ptr ds:,5C
00546126   je short 0054612A                ; NEWHAND.0054612A
00546128   jmp short 00546122               ; NEWHAND.00546122
0054612A   mov byte ptr ds:,0
0054612D   inc esi
0054612E   nop
0054612F   nop
00546130   nop
00546131   nop
00546132   nop
00546133   nop
00546134   nop
00546135   nop
00546136   nop
00546137   nop
00546138   nop
00546139   push esi
0054613A   lea eax,dword ptr ds:   ; // 根据消息 ID 偏移量进行计算
00546140   push eax
00546141   push 0
00546143   mov ecx,dword ptr ss:
00546146   push ecx
00546147   call 004AF34E                  ; <jmp.&USER32.AppendMenuA>
0054614C   inc edi
0054614D   add byte ptr ds:,1       ; // 调整 Key
00546154   nop
00546155   nop
00546156   nop
00546157   nop
00546158   nop
00546159   nop
0054615A   add dword ptr ds:,100    ; // 调整对应的缓冲区指针
00546164   cmp edi,0A
00546167   jl 005460B6                      ; // 10 个为限
0054616D   mov esp,ebp
0054616F   pop ebp
00546170   pop ecx
00546171   call 00546370                  ; // 还原初始变量值(全局)
00546176   jmp 00434247                     ; // 返回循环点
0054617B   nop
0054617C   nop
0054617D   nop
0054617E   nop
0054617F   nop
00546180   nop
00546181   nop
00546182   nop
00546183   nop
00546184   nop
00546185   nop
00546186   cmp ax,9CD                     ; // 来自 43359C 的 jne 434247
0054618A   jnz 00434247                     ; NEWHAND.00434247
00546190   call 00546370                  ; // 还原初始变量值(全局)
00546195   mov edi,546400
0054619A   mov ecx,0A00
0054619F   xor eax,eax
005461A1   rep stos byte ptr es:
005461A3   jmp 00546094                     ; NEWHAND.00546094
005461A8   sub al,2                         ; // 执行 exe 工具
005461AA   imul ebx,eax,100
005461B0   add ebx,dword ptr ds:    ; NEWHAND.00546400
005461B6   mov ecx,ebx
005461B8   inc ecx
005461B9   cmp byte ptr ds:,0
005461BC   jnz short 005461B8               ; NEWHAND.005461B8
005461BE   inc ecx
005461BF   nop
005461C0   push 0
005461C2   push ebx
005461C3   push 0
005461C5   push ecx
005461C6   push 4B917A                      ; ASCII "open"
005461CB   mov eax,dword ptr ss:
005461CE   push eax
005461CF   call 004AF342                  ; <jmp.&SHELL32.ShellExecuteA>
005461D4   jmp 00434212                     ; NEWHAND.00434212
005461D9   nop
005461DA   nop
005461DB   nop
005461DC   nop
005461DD   nop
005461DE   nop
005461DF   nop
005461E0   push 434212                      ; // 压入返回地址
005461E5   push 0
005461E7   mov eax,dword ptr ds:
005461EC   push 440C3C
005461F1   push eax
005461F2   mov edx,dword ptr ds:
005461F8   push 4B8FDA                      ; ASCII "DIA_CFG_TOOLMENU"
005461FD   push edx
005461FE   call 004AF3C6                  ; <jmp.&USER32.DialogBoxParamA>
00546203   retn
00546204   nop
00546205   nop
00546206   cmp dx,0E76                      ; // 来自 440CD2 的 cmp dx,0e76
0054620B   jnz short 0054620E               ; NEWHAND.0054620E
0054620D   retn
0054620E   cmp dx,22B8
00546213   je 0054630E                      ; // 是否点击了DIY的 “确定”按钮
00546219   sub eax,2328
0054621E   cmp eax,0A
00546221   ja short 00546298                ; NEWHAND.00546298
00546223   cmp eax,1
00546226   jb short 00546298                ; NEWHAND.00546298
00546228   nop                              ; // 是否点击了DIY的 “更改”按钮
00546229   nop
0054622A   pushad
0054622B   push eax
0054622C   push 546E20                      ; // 结构
00546231   call 004AF268                  ; <jmp.&COMDLG32.GetOpenFileNameA>
00546236   test eax,eax
00546238   jnz short 0054623F               ; NEWHAND.0054623F
0054623A   pop eax
0054623B   jmp short 00546297               ; // 没有选择则不登记,直接回到 消息队列
0054623D   nop
0054623E   nop
0054623F   push 2030
00546244   push 546E9F                      ; // 标题
00546249   push 546EAA                      ; // 提示 更改信息
0054624E   mov eax,dword ptr ds:
00546253   push eax
00546254   call 004AF516                  ; <jmp.&USER32.MessageBoxA>
00546259   pop eax
0054625A   nop
0054625B   nop
0054625C   dec eax                        ; // ***这里不即时登记 “更新”也是可以的
0054625D   add al,30                        ; // 计算所对应的 工具序列
0054625F   mov byte ptr ds:,al
00546264   push 4D53A4
00546269   push dword ptr ds:       ; NEWHAND.00546F00
0054626F   push dword ptr ds:       ; // ***登记所选择的
00546275   push 546E00                      ; ASCII "Tools"
0054627A   call 004AF21C                  ; <jmp.&KERNEL32.WritePrivateProfileStringA>
0054627F   popad
00546280   pushad
00546281   lea ecx,dword ptr ds:; // 对应的 Edit 控件 id
00546287   mov eax,dword ptr ds:    ; // 对应的工具路径
0054628C   mov edx,dword ptr ss:   ; // 窗口句柄
0054628F   push eax
00546290   push ecx
00546291   push edx
00546292   call 004AF58E                  ; // 更新对应的 Edit 控件内容
00546297   popad
00546298   mov al,1
0054629A   test al,al
0054629C   retn
0054629D   nop
0054629E   nop
0054629F   nop
005462A0   nop
005462A1   nop
005462A2   nop
005462A3   pushad                           ; // 初始化对话框 Edit控件 的内容
005462A4   xor edi,edi
005462A6   lea eax,dword ptr ds:
005462A9   mov byte ptr ds:,al
005462AE   push 4D53A4
005462B3   push 100
005462B8   push dword ptr ds:       ; // 缓冲区读取所对应的数据
005462BE   push 4C1700
005462C3   push dword ptr ds:       ; NEWHAND.00546E08
005462C9   push 546E00                      ; ASCII "Tools"
005462CE   call 004AF08A                  ; <jmp.&KERNEL32.GetPrivateProfileStringA>
005462D3   cmp al,0
005462D5   je short 005462ED                ; // 为 0 不进行刷新数据
005462D7   lea ecx,dword ptr ds:
005462DD   mov eax,dword ptr ds:
005462E2   mov edx,dword ptr ss:
005462E5   push eax                         ; // 下面是读取并设置各工具菜单路径
005462E6   push ecx
005462E7   push edx
005462E8   call 004AF58E                  ; <jmp.&USER32.SetDlgItemTextA>
005462ED   inc edi
005462EE   add dword ptr ds:,100    ; // 调整对应的缓冲区指针
005462F8   cmp edi,0A
005462FB   jl short 005462A6                ; // 10 个为限
005462FD   popad
005462FE   retn
005462FF   nop
00546300   nop
00546301   nop
00546302   nop
00546303   nop
00546304   nop
00546305   nop
00546306   nop
00546307   nop
00546308   nop
00546309   nop
0054630A   nop
0054630B   nop
0054630C   nop
0054630D   nop
0054630E   pushad                           ; // 点按了“确定”按钮,登记所有对应的内容
0054630F   xor edi,edi
00546311   lea eax,dword ptr ds:
00546314   mov byte ptr ds:,al
00546319   lea ecx,dword ptr ds:
0054631F   mov eax,dword ptr ds:
00546324   mov edx,dword ptr ss:
00546327   push 100
0054632C   push eax
0054632D   push ecx
0054632E   push edx
0054632F   call 004AF45C                  ; <jmp.&USER32.GetDlgItemTextA>
00546334   push 4D53A4
00546339   push dword ptr ds:       ; NEWHAND.00546F00
0054633F   push dword ptr ds:       ; NEWHAND.00546E08
00546345   push 546E00                      ; ASCII "Tools"
0054634A   call 004AF21C                  ; <jmp.&KERNEL32.WritePrivateProfileStringA>
0054634F   inc edi
00546350   cmp edi,0A
00546353   jl short 00546311                ; NEWHAND.00546311
00546355   popad
00546356   pop eax
00546357   jmp 00440CC5                     ; // 返回到 点击“确定”按钮应该返回的地方
0054635C   nop
0054635D   nop
0054635E   nop
0054635F   nop
00546360   cmp al,1
00546362   jnz 005462A0                     ; // 由于借用别的 Dia 的事件,当它初始失败,al为0,就是应该属于我们的初始化
00546368   retn
00546369   nop
0054636A   nop
0054636B   nop
0054636C   nop
0054636D   nop
0054636E   nop
0054636F   nop
00546370   mov byte ptr ds:,30      ; // 还原变量初值
00546377   mov dword ptr ds:,546400
00546381   retn
00546382   nop
--------------------------------------------------------------------------------


Ok,数据区定为 va: 546400 - 546FFF,以下是部分初始的数据区:

代码:--------------------------------------------------------------------------------
Offset      01234567   89ABCDEF

变量和指针:
00105400   54 6F 6F 6C73 00 00 0054 6F 6F 6C5B 30 5D 00   Tools...Tool.
00105410   08 6E 54 0000 64 54 0000 6F 54 0000 00 00 00   .nT..dT..oT.....

OpenFileNameA结构:
00105420   4C 00 00 0000 00 00 0000 00 00 0070 6E 54 00   L...........pnT.
00105430   00 00 00 0000 00 00 0000 00 00 0000 6F 54 00   .............oT.
00105440   04 01 00 0000 00 00 0000 00 00 0000 00 00 00   ................
00105450   90 6E 54 0006 28 28 0000 00 00 0000 00 00 00   恘T..((.........
00105460   00 00 00 0000 00 00 0000 00 00 0000 00 00 00   ................

字符串常量:
00105470   BF C9 D6 B4D0 D0 CE C4BC FE 20 282A 2E 65 78   可执行文件 (*.ex
00105480   65 29 00 2A2E 65 78 6500 00 00 0000 00 00 00   e).*.exe........
00105490   D1 A1 D4 F165 78 65 B9A4 BE DF 0000 00 00 B8   选择exe工具....?
001054A0   FC B8 C4 CCE1 CA BE A3BA 00 C4 E3B5 C4 B8 FC   ?奶崾荆?你的更
001054B0   B8 C4 BC B4BD AB BC A4BB EE A3 A100 00 00 00   改即将激活!....
--------------------------------------------------------------------------------

注意找出主窗口句柄(参看一下其它窗口使用的函数参数是如何实现叫出来的,模拟一下指令就行了),测试中注意堆栈平衡,这个出错会很麻烦的,修修补补到现在,保存所有,运行测试通过了!特写下这篇文章,以慰已劳,Enjoy!
:lol:lol:lol:lol:lol我怎么看不懂

ljj3346 发表于 2007-5-1 02:23:32

看了之后,受益匪浅啊,难得的资料!

qing0408 发表于 2007-5-2 18:24:38

楼主太强的。偶现成的都不会用,别说要打造了

lsb2002 发表于 2007-5-3 21:57:09

真的很佩服楼主

dh0807 发表于 2007-5-14 16:19:51

一个字强,可惜偶是菜鸟看不懂。郁闷。学习学习偶在来看吧/:09

deletex 发表于 2007-5-15 13:26:04

牛人。。。

我连看都看不懂

aad 发表于 2007-5-17 08:36:27

真的很佩服楼主
这样改了好用多了

极飞游侠 发表于 2007-5-18 13:18:02

楼主太强的

电子高手 发表于 2007-12-23 13:47:07

看不懂呀,不过还是谢谢楼主

txjian 发表于 2007-12-24 10:49:35

^_^ ,幸亏自己有点儿基础 。。/:011
页: [1] 2 3 4
查看完整版本: 打造自己喜欢的 Ollydbg