首页
社区
课程
招聘
[未收录]OllyDbg小改01
发表于: 2011-9-19 00:34 8718

[未收录]OllyDbg小改01

2011-9-19 00:34
8718

在家,可惜没网,闲来无事竟异想天开不自量力的想DIY一个属于自己的OD,
立即使用手机至官网下载了OllyDbg1.10,
运行,随即发觉上面的工具栏图标相比以前使用的某汉化版来说,实在是太,简陋了,

想着把上面的图标都给换换吧,至少也得看得赏心悦目才行,
找到了之前使用OllyICE,
其间想着,如果以后有实力,我得把我那DIY的结果叫做SuperOD才行,嗯,太神奇了,刚好7个字母,

然后替换开始,使用"ResHacker.exe"打开下载的OD英文原版,即可在"图标"项里看到那些清爽简洁的图标,
然后鼠标右键,替换资源,打开新图标文件,选择"OllyICE.exe",

即可在列表项里选择相应的图标进行替换,
从"ICO_AAAMAIN"至"ICO_WINDOWS"的图标全部替换完毕后,
新下载的英文原版工具栏也华丽丽的显现起来了,

另外"ICO_AAAMAIN"就是OD执行文件的图标,这个得替换成自己百看不厌的ICO才行,

同时发现下面的描述信息依然是OD什么的,本着不知廉耻的原则继续修改,
依然使用"ResHacker.exe"打开,在版本信息里进行相应修改,

随便修改一下然后单击"编译脚本"按钮,接着保存,当然"Copyright"暂时就不修改了,

再次运行修改后的原版OD,至此已经被改得面目全非了,或许已经不能称作原版了,
虽然这个OD表面上已是属于我了,但心里却依旧想着别人,比如,主窗口左下角显示着"OllyDbg v1.10",

这样子肯定是不容许的,所以直接将OD拖入"HEdit.exe",摁下"Ctrl+H",将所有"OllyDbg"字串替换为"XmPushD",
暂时就不改成"SuperOD"了,毕竟"XmPushD"也是7个字母,
再次进入,左下角状态栏和About窗口里的"OllyDbg"已改成"XmPushD v1.10",

不过About窗口标题却依然是"About OllyDbg",那么继续将厚颜无耻发挥到极致,
依然"ResHacker.exe"打开后,在对话框中的"DIA_ABOUT"子项里修改对话框的标题等等,
另外为了打开位置在OD窗口正中间,给"STYLE"加个"DS_CENTER",

然后点击"编译脚本",保存,
顺便再在对话框列表里找找看看是否还有别的对话框含有"OllyDbg"字眼,强力执行改光换光双光政策,
比如这个对话框包含,那就改掉,

修改完后编译脚本,保存,
另外"DIA_JIT"也包含"OllyDbg"字眼,
满怀期待的运行后,弹出错误提示,

看来OD执行文件无法重命名,不过OD那样的提示有两次,而OD目录里自带的插件刚好也是两个,
将插件dll文件拖入"HEdit.exe","Ctrl+H",替换全部"OllyDbg"为"XmPushD",再次运行,OK,
改替换改修改的现在都替换修改了,

看着居中的关于对话框似乎并没有多大的成就感,那英文的版权信息更是让人的虚荣心得不到一点满足,
再次使用"ResHacker.exe"打开目标OD,找到对话框列表中的"DIA_ABOUT"对话框,
那一堆英文信息似乎就显示在3701这个控件之上,那直接删掉这个控件的"WS_VISIBLE"属性,让它暂时回避一下,

然后在对话框是单击鼠标右键,可以插入控件,暂时先来个高清无码的大图吧,
选择"BITMAP"控件确认,在"ResHacker.exe"的菜单栏选择"操作",添加一个新资源,
资源类型为"BITMAP",资源名称"XMPUSH",图片资源似乎只能为"BMP"格式,

修改"BITMAP"控件前面引号里的空内容为"XMPUSH"然后"编译脚本",图片出现,

插入图片并调整下原来的控件后,

本来这样修改完后就应该可以了,没想到当载入dll文件时,
OD会先判断当前目录是否存在"loaddll.exe"如果存在则使用该exe加载dll,
否则先从资源文件里写出"loaddll.exe"再加载,
这样子的话纵然修改了"loaddll.exe"的程序图标以后也和OD生成出来的不一样,

为了节约硬盘空间,平常删掉"loaddll.exe",需要时OD写出修改图标后的"loaddll.exe",
得想办法替换OD自身资源文件里的"loaddll.exe",
使用"ResHacker.exe"查看目标OD的资源,里面有个"RES_LOADDLL",开头的两个字节为AB08,

使用"HEdit.exe"打开"loaddll.exe"发现前两个字节却是4D5A,和OD资源里的"RES_LOADDLL"不同,

如果直接使用"ResHacker.exe"的替换资源功能将"RES_LOADDLL"替换为"loaddll.exe",
当OD当前目录没有"loaddll.exe"的时候,载入dll文件进行调试的时候会弹出错误,

为了跟踪错误信息,使用OD调试OD,用中文版OllyICE加载修改的"XmPushD.exe"并F9运行,
此时删除"XmPushD.exe"目录下的"loaddll.exe",跟踪下是怎么写出"loaddll.exe"的,看为什么资源里的和实际的"loaddll.exe"不一样,
"XmPushD.exe"的"File"菜单下有个刚才载入dll文件的历史记录,虽然刚才并未载入成功但有记录,
在调试"XmPushD.exe"的OllyICE上点击工具栏上面的"W"图标,打开窗口列表,

因为"XmPushD.exe"的菜单项被单击会收到WM_COMMAND消息,所以选择"XmPushD",设置消息断点WM_COMMAND,

在目标OD即"XmPushD.exe"的File菜单的历史记录里选择刚才载入的dll文件,
随即"OllyICE.exe"中提示"XmPushD"中断暂停运行,

004323D4 >/$  55            push ebp                                 ;  设置消息断点WM_COMMAND/
004323D5  |.  8BEC          mov ebp,esp                              ;  并单击File菜单的历史记录后/
004323D7  |.  81C4 04F0FFFF add esp,-0FFC                            ;  中断在004323D4。
004323DD  |.  50            push eax
004323DE  |.  81C4 30FDFFFF add esp,-2D0
004323E4  |.  53            push ebx
004323E5  |.  56            push esi
004323E6  |.  57            push edi
004323E7  |.  8B5D 10       mov ebx,[ebp+10]                         ;  set ebx=wParam
004323EA  |.  8B45 0C       mov eax,[ebp+C]                          ;  set eax=message
004323ED  |.  3D 11010000   cmp eax,111                              ;  比较message是否为WM_COMMAND; Switch (cases 1..478)
004323F2  |.  7F 61         jg short 00432455                        ;  XmPushD.00432455
004323F4  |.  0F84 1E140000 je 00433818                              ;  条件成立跳转实现

00433818  |> \8BCB          mov ecx,ebx                              ;  set ecx=wParam; Case 111 (WM_COMMAND) of switch 004323ED
0043381A  |.  C1E9 10       shr ecx,10                               ;  右移后ecx=0
0043381D  |.  66:85C9       test cx,cx
00433820  |.  0F85 EC090000 jnz 00434212                             ;  条件不成立,跳转未实现
00433826  |.  8BC3          mov eax,ebx                              ;  set eax=wParam
00433828  |.  66:25 FFFF    and ax,0FFFF
0043382C  |.  0FB7D0        movzx edx,ax                             ;  set edx=wParam低16位
0043382F  |.  81FA 9F080000 cmp edx,89F                              ;  Switch (cases 7D1..9C8)
00433835  |.  0F8F 0A010000 jg 00433945                              ;  XmPushD.00433945
0043383B  |.  0F84 1A050000 je 00433D5B                              ;  XmPushD.00433D5B
00433841  |.  81FA 40080000 cmp edx,840
00433847  |.  0F8F 8E000000 jg 004338DB                              ;  XmPushD.004338DB
0043384D  |.  0F84 2D030000 je 00433B80                              ;  XmPushD.00433B80
00433853  |.  81FA 39080000 cmp edx,839
00433859  |.  7F 52         jg short 004338AD                        ;  XmPushD.004338AD
0043385B  |.  0F84 7C020000 je 00433ADD                              ;  XmPushD.00433ADD
00433861  |.  81FA 35080000 cmp edx,835
00433867  |.  7F 25         jg short 0043388E                        ;  XmPushD.0043388E
00433869  |.  0F84 50020000 je 00433ABF                              ;  XmPushD.00433ABF
0043386F  |.  81EA D1070000 sub edx,7D1
00433875  |.  0F84 BC010000 je 00433A37                              ;  XmPushD.00433A37
0043387B  |.  4A            dec edx
0043387C  |.  0F84 16020000 je 00433A98                              ;  XmPushD.00433A98
00433882  |.  4A            dec edx
00433883  |.  0F84 19020000 je 00433AA2                              ;  XmPushD.00433AA2
00433889  |.  E9 08090000   jmp 00434196                             ;  一直到此处跳转

00434196  |> \8BD3          mov edx,ebx                              ;  Default case of switch 0043382F
00434198  |.  66:81E2 FFFF  and dx,0FFFF                             ;  set edx=菜单项id
0043419D  |.  66:81FA DA07  cmp dx,7DA                               ;  此时edx=7DA
004341A2  |.  72 49         jb short 004341ED                        ;  XmPushD.004341ED
004341A4  |.  8BCB          mov ecx,ebx
004341A6  |.  66:81E1 FFFF  and cx,0FFFF
004341AB  |.  66:81F9 E007  cmp cx,7E0
004341B0  |.  73 3B         jnb short 004341ED                       ;  XmPushD.004341ED
004341B2  |.  68 885D4D00   push 4D5D88
004341B7  |.  8D85 E4EDFFFF lea eax,[ebp-121C]
004341BD  |.  50            push eax
004341BE  |.  8BD3          mov edx,ebx
004341C0  |.  66:81E2 FFFF  and dx,0FFFF
004341C5  |.  0FB7CA        movzx ecx,dx                             ;  set ecx=菜单id
004341C8  |.  51            push ecx
004341C9  |.  E8 B62E0400   call 00477084                            ;  F7进入跟踪

00477084  /$  55            push ebp
00477085  |.  8BEC          mov ebp,esp
00477087  |.  81C4 00FFFFFF add esp,-100
0047708D  |.  53            push ebx
0047708E  |.  56            push esi
0047708F  |.  8B75 10       mov esi,[ebp+10]                         ;  set esi=4D5D88
00477092  |.  8B5D 0C       mov ebx,[ebp+C]
00477095  |.  8B45 08       mov eax,[ebp+8]                          ;  set eax=菜单id
00477098  |.  85DB          test ebx,ebx
0047709A  |.  74 6E         je short 0047710A                        ;  XmPushD.0047710A
0047709C  |.  2D DA070000   sub eax,7DA                              ;  7DA-7DA=0
004770A1  |.  85C0          test eax,eax
004770A3  |.  7C 05         jl short 004770AA                        ;  小于转移,条件不成立
004770A5  |.  83F8 06       cmp eax,6
004770A8  |.  7C 05         jl short 004770AF                        ;  0<6,条件成立,跳转
004770AA  |>  C603 00       mov byte ptr [ebx],0
004770AD  |.  EB 5B         jmp short 0047710A                       ;  XmPushD.0047710A
004770AF  |>  50            push eax
004770B0  |.  68 C61D4C00   push 4C1DC6                              ;  ASCII "Executable[%i]"
004770B5  |.  8D85 00FFFFFF lea eax,[ebp-100]
004770BB  |.  50            push eax
004770BC  |.  E8 6BFB0200   call 004A6C2C                            ;  似乎是将Executable[%i]格式化为Executable[%0],放入[ebp-

100]
004770C1  |.  83C4 0C       add esp,0C
004770C4  |.  8D95 00FFFFFF lea edx,[ebp-100]
004770CA  |.  68 A4534D00   push 4D53A4                              ; /IniFileName = "C:\Documents and 

Settings\Administrator\",D7,"烂鎈XmDbg\XmPushD.ini"
004770CF  |.  68 04010000   push 104                                 ; |BufSize = 104 (260.)
004770D4  |.  53            push ebx                                 ; |ReturnBuffer
004770D5  |.  68 00174C00   push 4C1700                              ; |Default = ""
004770DA  |.  52            push edx                                 ; |读取OD配置文件的历史记录,通过下标获取路径放入ebx
004770DB  |.  68 D51D4C00   push 4C1DD5                              ; |Section = "History"
004770E0  |.  E8 A57F0300   call 004AF08A                            ; \GetPrivateProfileStringA
最后程序返回到004341C9下面一条指令即004341CE处,
OD的配置文件"History"节点,


004341CE  |.  83C4 0C       add esp,0C
004341D1  |.  80BD E4EDFFFF>cmp byte ptr [ebp-121C],0                ;  从配置文件读取的历史记录Executable[0]的字串存放在[ebp-

121c]
004341D8  |.  74 38         je short 00434212                        ;  等于跳转,条件不成立
004341DA  |.  6A FF         push -1
004341DC  |.  8D85 E4EDFFFF lea eax,[ebp-121C]                       ;  历史路径放入eax
004341E2  |.  50            push eax
004341E3  |.  E8 34310400   call 0047731C                            ;  F7进入

0047731C >/$  55            push ebp
0047731D  |.  8BEC          mov ebp,esp
0047731F  |.  81C4 04F0FFFF add esp,-0FFC
00477325  |.  50            push eax
00477326  |.  81C4 D4F2FFFF add esp,-0D2C
0047732C  |.  53            push ebx
0047732D  |.  56            push esi
0047732E  |.  57            push edi
0047732F  |.  8B5D 08       mov ebx,[ebp+8]                          ;  set ebx=历史路径
00477332  |.  BE EC164C00   mov esi,4C16EC                           ;  ASCII "Table of DLL handles"
00477337  |.  33C0          xor eax,eax
00477339  |.  8945 F8       mov [ebp-8],eax
0047733C  |.  8D95 D8FAFFFF lea edx,[ebp-528]
00477342  |.  52            push edx                                 ;  edx=12DB84
00477343  |.  6A 00         push 0
00477345  |.  6A 00         push 0
00477347  |.  6A 00         push 0
00477349  |.  53            push ebx                                 ;  历史路径
0047734A  |.  E8 6DDE0200   call 004A51BC                            ;  F7进入

004A51BC   $ /E9 3F180000   jmp 004A6A00                             ;  进入后只有一个jmp孤零零的在这里

004A6A00  /$  55            push ebp
004A6A01  |.  8BEC          mov ebp,esp
004A6A03  |.  81C4 F8FEFFFF add esp,-108
004A6A09  |.  53            push ebx
004A6A0A  |.  56            push esi
004A6A0B  |.  57            push edi
004A6A0C  |.  33FF          xor edi,edi
004A6A0E  |.  837D 0C 00    cmp dword ptr [ebp+C],0                  ;  此时[ebp+c]=0
004A6A12  |.  74 06         je short 004A6A1A                        ;  等于判断,成立跳转
004A6A14  |.  8B45 0C       mov eax,[ebp+C]
004A6A17  |.  C600 00       mov byte ptr [eax],0
004A6A1A  |>  837D 10 00    cmp dword ptr [ebp+10],0
004A6A1E  |.  74 06         je short 004A6A26                        ;  同样等于0,成立跳转
004A6A20  |.  8B55 10       mov edx,[ebp+10]
004A6A23  |.  C602 00       mov byte ptr [edx],0
004A6A26  |>  837D 14 00    cmp dword ptr [ebp+14],0
004A6A2A  |.  74 06         je short 004A6A32                        ;  成立
004A6A2C  |.  8B4D 14       mov ecx,[ebp+14]
004A6A2F  |.  C601 00       mov byte ptr [ecx],0
004A6A32  |>  837D 18 00    cmp dword ptr [ebp+18],0
004A6A36  |.  74 06         je short 004A6A3E                        ;  不等于0,条件不成立
004A6A38  |.  8B45 18       mov eax,[ebp+18]
004A6A3B  |.  C600 00       mov byte ptr [eax],0
004A6A3E  |>  8D9D F8FEFFFF lea ebx,[ebp-108]
004A6A44  |.  8B45 08       mov eax,[ebp+8]
004A6A47  |.  50            push eax
004A6A48  |.  E8 87CCFFFF   call 004A36D4                            ;  未得到啥可用信息
004A6A4D  |.  59            pop ecx
004A6A4E  |.  8BF0          mov esi,eax
004A6A50  |.  3D 04010000   cmp eax,104
004A6A55  |.  7E 05         jle short 004A6A5C                       ;  XmPushD.004A6A5C
004A6A57  |.  BE 04010000   mov esi,104
004A6A5C  |>  C603 00       mov byte ptr [ebx],0
004A6A5F  |.  56            push esi
004A6A60  |.  8B45 08       mov eax,[ebp+8]
004A6A63  |.  43            inc ebx
004A6A64  |.  50            push eax
004A6A65  |.  53            push ebx
004A6A66  |.  E8 49540000   call 004ABEB4                            ;  同样没啥可关注的信息
004A6A6B  |.  83C4 0C       add esp,0C
004A6A6E  |.  03DE          add ebx,esi
004A6A70  |.  C603 00       mov byte ptr [ebx],0
004A6A73  |.  33F6          xor esi,esi
004A6A75  |>  8D43 FF       /lea eax,[ebx-1]                         ;  Default case of switch 004A6A9E
004A6A78  |.  8D95 F9FEFFFF |lea edx,[ebp-107]
004A6A7E  |.  2BC2          |sub eax,edx
004A6A80  |.  50            |push eax
004A6A81  |.  8D8D F9FEFFFF |lea ecx,[ebp-107]
004A6A87  |.  51            |push ecx
004A6A88  |.  E8 F7530000   |call 004ABE84                           ;  没啥关注的
004A6A8D  |.  83C4 08       |add esp,8
004A6A90  |.  83F8 02       |cmp eax,2
004A6A93  |.  75 05         |jnz short 004A6A9A                      ;  XmPushD.004A6A9A
004A6A95  |.  83EB 02       |sub ebx,2
004A6A98  |.^ EB DB         |jmp short 004A6A75                      ;  XmPushD.004A6A75
004A6A9A  |>  4B            |dec ebx
004A6A9B  |.  0FBE03        |movsx eax,byte ptr [ebx]
004A6A9E  |.  83F8 2F       |cmp eax,2F                              ;  Switch (cases 0..5C)
004A6AA1  |.  7F 1F         |jg short 004A6AC2                       ;  XmPushD.004A6AC2
004A6AA3  |.  0F84 B2000000 |je 004A6B5B                             ;  XmPushD.004A6B5B
004A6AA9  |.  83E8 01       |sub eax,1
004A6AAC  |.  0F82 84000000 |jb 004A6B36                             ;  XmPushD.004A6B36
004A6AB2  |.  83E8 29       |sub eax,29
004A6AB5  |.  0F84 E5000000 |je 004A6BA0                             ;  XmPushD.004A6BA0
004A6ABB  |.  83E8 04       |sub eax,4
004A6ABE  |.  74 1B         |je short 004A6ADB                       ;  XmPushD.004A6ADB
004A6AC0  |.^ EB B3         |jmp short 004A6A75                      ;  XmPushD.004A6A75
004A6AC2  |>  83E8 3A       |sub eax,3A
004A6AC5  |.  74 61         |je short 004A6B28                       ;  XmPushD.004A6B28
004A6AC7  |.  83E8 05       |sub eax,5
004A6ACA  |.  0F84 D0000000 |je 004A6BA0                             ;  XmPushD.004A6BA0
004A6AD0  |.  83E8 1D       |sub eax,1D
004A6AD3  |.  0F84 82000000 |je 004A6B5B                             ;  XmPushD.004A6B5B
004A6AD9  |.^ EB 9A         |jmp short 004A6A75                      ;  XmPushD.004A6A75
后面一直都是没啥可关注的,

因为

直到这,
0040F48B  |.  52            push edx                                 ; /edx=当前OD路径+"loaddll.exe"
0040F48C  |.  E8 B1FB0900   call 004AF042                            ; \GetFileAttributesA
0040F491  |.  83F8 FF       cmp eax,-1
0040F494  |.  74 07         je short 0040F49D                        ;  因为把"loaddll.exe"手动删掉了,此时条件成立
0040F496  |.  33C0          xor eax,eax
0040F498  |.  E9 9E000000   jmp 0040F53B                             ;  XmPushD.0040F53B
0040F49D  |>  68 91134B00   push 4B1391                              ; /KNOWNRESTYPE
0040F4A2  |.  68 81174B00   push 4B1781                              ; |在OD执行文件的资源里寻找RES_LOADDLL
0040F4A7  |.  6A 00         push 0                                   ; |hModule = NULL
0040F4A9  |.  E8 52FB0900   call 004AF000                            ; \FindResourceA
0040F4AE  |.  85C0          test eax,eax
0040F4B0  |.  75 08         jnz short 0040F4BA                       ;  XmPushD.0040F4BA
0040F4B2  |.  83C8 FF       or eax,FFFFFFFF
0040F4B5  |.  E9 81000000   jmp 0040F53B                             ;  XmPushD.0040F53B
0040F4BA  |>  50            push eax                                 ; /hResource
0040F4BB  |.  6A 00         push 0                                   ; |hModule = NULL
0040F4BD  |.  E8 7CFC0900   call 004AF13E                            ; \LoadResource
0040F4C2  |.  85C0          test eax,eax
0040F4C4  |.  75 05         jnz short 0040F4CB                       ;  XmPushD.0040F4CB
0040F4C6  |.  83C8 FF       or eax,FFFFFFFF
0040F4C9  |.  EB 70         jmp short 0040F53B                       ;  XmPushD.0040F53B
0040F4CB  |>  50            push eax                                 ; /hResource
0040F4CC  |.  E8 73FC0900   call 004AF144                            ; \LockResource
0040F4D1  |.  85C0          test eax,eax
0040F4D3  |.  75 05         jnz short 0040F4DA                       ;  XmPushD.0040F4DA
0040F4D5  |.  83C8 FF       or eax,FFFFFFFF
0040F4D8  |.  EB 61         jmp short 0040F53B                       ;  XmPushD.0040F53B
0040F4DA  |>  68 00400000   push 4000
0040F4DF  |.  8D9424 0C0200>lea edx,[esp+20C]
0040F4E6  |.  52            push edx
0040F4E7  |.  8B08          mov ecx,[eax]
0040F4E9  |.  51            push ecx
0040F4EA  |.  83C0 04       add eax,4
0040F4ED  |.  50            push eax
0040F4EE  |.  E8 8D8FFFFF   call 00408480                            ;  前面做了那么多准备工作,估计这里就是写出loaddll.exe了

00408480 >/$  55            push ebp
00408481  |.  8BEC          mov ebp,esp
00408483  |.  53            push ebx
00408484  |.  56            push esi
00408485  |.  57            push edi
00408486  |.  8B75 14       mov esi,[ebp+14]
00408489  |.  8B7D 0C       mov edi,[ebp+C]
0040848C  |.  8B5D 08       mov ebx,[ebp+8]
0040848F  |.  85DB          test ebx,ebx
00408491  |.  74 0F         je short 004084A2                        ;  XmPushD.004084A2
00408493  |.  837D 10 00    cmp dword ptr [ebp+10],0
00408497  |.  74 09         je short 004084A2                        ;  XmPushD.004084A2
00408499  |.  83FF 08       cmp edi,8
0040849C  |.  76 04         jbe short 004084A2                       ;  XmPushD.004084A2
0040849E  |.  85F6          test esi,esi
004084A0  |.  75 07         jnz short 004084A9                       ;  XmPushD.004084A9
004084A2  |>  33C0          xor eax,eax
004084A4  |.  E9 DF010000   jmp 00408688                             ;  XmPushD.00408688
004084A9  |>  813B 0A437064 cmp dword ptr [ebx],6470430A             ;  取OD资源RES_LOADDLL里的第5-8四个字节进行比较
004084AF  |.  74 07         je short 004084B8                        ;  因为之前使用修改图标过的loaddll.exe替换过资源RES_LOADDLL

所以不等于
004084B1  |.  33C0          xor eax,eax
004084B3  |.  E9 D0010000   jmp 00408688                             ;  跳出

最后迫不得已来到这里,
00477777  |.  8D86 D4080000 lea eax,[esi+8D4]
;Unable to extract XmPushL.EXE. If XmPushD directory is write-protected...
0047777D  |.  50            push eax
0047777E  |.  E8 99C8FDFF   call 0045401C                            ;  XmPushD._Error

也就是说OD在写出资源里RES_LOADDLL作为"loaddll.exe"加载dll文件的时候首先先判断第5-8四个字节,
观察原版OD或者OllyICE资源里的RES_LOADDLL,第5-8个字节均为0A437064,按从高位到低位正是6470430A,


如果手动将RES_LOADDLL修改为0A437064后载入dll依然提示错误,
难道那个loaddll.exe是经过作者压缩之后放进资源里面的,释放的时候进行解压缩来着,
下次看能不能把那些给修改掉,直接不要判断6470430A,统统的直接给释放出来...
诶,F7F8大半夜,白整了,睡觉,


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 6
支持
分享
最新回复 (18)
雪    币: 130
活跃值: (1005)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
哇塞 都是高手 顶个
2011-9-19 01:31
0
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
路过支持一下,继续努力。
2011-9-19 01:39
0
雪    币: 768
活跃值: (535)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
4
楼主,你强呀。

不过这么个改法,不太安全吧,指不定哪天出个Bug

友情支持 DIYer
2011-9-19 08:32
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
5
能调试就行了,外观怎样都无所谓。
2011-9-19 08:40
0
雪    币: 9
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
昨天发现OD在释放loaddll.exe的时候并不是规规矩矩的写出,
好像还做了什么解压缩的工作类似的,
总之资源里的RES_LOADDLL和实际loaddll.exe不一样,
里面那边好多好多判断,看不懂了,
今天看能不能直接写出,
同样删除目的OD目录里的loaddll.exe,在File菜单历史里点击历史dll,
设置消息断点WM_COMMAND,
会先判断dll是否存在,然后判断当前目录是否存在loaddll.exe,
如果不存在则从资源里提取RES_LOADDLL,
直接此处设置断点,
0040F48B  |.  52            push edx                                 ; /edx=当前OD路径+"loaddll.exe"
0040F48C  |.  E8 B1FB0900   call 004AF042                            ; \GetFileAttributesA
0040F491  |.  83F8 FF       cmp eax,-1
0040F494  |.  74 07         je short 0040F49D                        ;  因为把"loaddll.exe"手动删掉了,此时条件成立
0040F496  |.  33C0          xor eax,eax
0040F498  |.  E9 9E000000   jmp 0040F53B                             ;  XmPushD.0040F53B
0040F49D  |>  68 91134B00   push 4B1391                              ; /KNOWNRESTYPE
0040F4A2  |.  68 81174B00   push 4B1781                              ; |RES_LOADDLL
0040F4A7  |.  6A 00         push 0                                   ; |hModule = NULL
0040F4A9  |.  E8 52FB0900   call 004AF000                            ; \FindResourceA
0040F4AE  |.  85C0          test eax,eax                             ;  eax=hResInfo
0040F4B0  |.  75 08         jnz short 0040F4BA                       ;  XmPushD.0040F4BA
0040F4B2  |.  83C8 FF       or eax,FFFFFFFF
0040F4B5  |.  E9 81000000   jmp 0040F53B                             ;  XmPushD.0040F53B
0040F4BA  |>  50            push eax                                 ; /hResource
0040F4BB  |.  6A 00         push 0                                   ; |hModule = NULL
0040F4BD  |.  E8 7CFC0900   call 004AF13E                            ; \LoadResource
0040F4C2  |.  85C0          test eax,eax                             ;  eax=hResData
0040F4C4  |.  75 05         jnz short 0040F4CB                       ;  XmPushD.0040F4CB
0040F4C6  |.  83C8 FF       or eax,FFFFFFFF
0040F4C9  |.  EB 70         jmp short 0040F53B                       ;  XmPushD.0040F53B
0040F4CB  |>  50            push eax                                 ; /hResource
0040F4CC  |.  E8 73FC0900   call 004AF144                            ; \LockResource
前面的准备工作已经做好,
试试在下面进行CreateFile和WriteFile,
直接写入这些代码,
0040F4DA  |> \6A 00         push 0                                   ; /hTemplateFile = NULL
0040F4DC  |.  68 80000000   push 80                                  ; |Attributes = NORMAL
0040F4E1  |.  6A 02         push 2                                   ; |Mode = CREATE_ALWAYS
0040F4E3  |.  6A 00         push 0                                   ; |pSecurity = NULL
0040F4E5  |.  6A 00         push 0                                   ; |ShareMode = 0
0040F4E7  |.  68 00000040   push 40000000                            ; |Access = GENERIC_WRITE
0040F4EC  |.  68 F8F44000   push 40F4F8                              ; |FileName = "XmPushL.exe"
0040F4F1  |.  E8 D4FA0900   call 004AEFCA                            ; \CreateFileA
0040F4F6  |.  EB 0E         jmp short 0040F506                       ;  XmPush2.0040F506
0040F4F8  |   58            db 58                                    ;  CHAR 'X'
0040F4F9  |   6D            db 6D                                    ;  CHAR 'm'
0040F4FA  |   50            db 50                                    ;  CHAR 'P'
0040F4FB  |   75            db 75                                    ;  CHAR 'u'
0040F4FC  |   73            db 73                                    ;  CHAR 's'
0040F4FD  |   68            db 68                                    ;  CHAR 'h'
0040F4FE  |   4C            db 4C                                    ;  CHAR 'L'
0040F4FF  |   2E            db 2E                                    ;  CHAR '.'
0040F500  |   65            db 65                                    ;  CHAR 'e'
0040F501  |   78            db 78                                    ;  CHAR 'x'
0040F502  |.  65004B00      dd XmPush2.004B0065                      ;  填充出一个字符串"XmPushL.exe"

接下来保存所有修改,OD重新载入,在0040F4F1处摁下F2断点,
可以发现随着CreateFileA的执行会在OD目录生成出"XmPushL.exe",

但只是0个字节,因为资源里的RES_LOADDLL还未写入,
loaddll.exe的大小为34816,


接下来再重新编码直接写出RES_LOADDLL资源
0040F4D1   .  85C0          test eax,eax
0040F4D3      75 48         jnz short 0040F51D                       ;  XmPush3.0040F51D
0040F4D5   .  83C8 FF       or eax,FFFFFFFF
0040F4D8   .  EB 61         jmp short 0040F53B                       ;  XmPush3.0040F53B
0040F4DA   >  6A 00         push 0                                   ; /hTemplateFile = NULL
0040F4DC   .  68 80000000   push 80                                  ; |Attributes = NORMAL
0040F4E1   .  6A 02         push 2                                   ; |Mode = CREATE_ALWAYS
0040F4E3   .  6A 00         push 0                                   ; |pSecurity = NULL
0040F4E5      6A 03         push 3
0040F4E7      68 000000C0   push C0000000
0040F4EC   .  68 F8F44000   push 40F4F8                              ; |FileName = "XmPushL.exe"
0040F4F1   .  E8 D4FA0900   call 004AEFCA                            ; \CreateFileA
0040F4F6   .  EB 0E         jmp short 0040F506                       ;  跳过下面的字符串,因为下面的不是指令不可执行
0040F4F8      58            db 58                                    ;  CHAR 'X'
0040F4F9      6D            db 6D                                    ;  CHAR 'm'
0040F4FA      50            db 50                                    ;  CHAR 'P'
0040F4FB      75            db 75                                    ;  CHAR 'u'
0040F4FC      73            db 73                                    ;  CHAR 's'
0040F4FD      68            db 68                                    ;  CHAR 'h'
0040F4FE      4C            db 4C                                    ;  CHAR 'L'
0040F4FF      2E            db 2E                                    ;  CHAR '.'
0040F500      65            db 65                                    ;  CHAR 'e'
0040F501      78            db 78                                    ;  CHAR 'x'
0040F502   .  65004B00      dd XmPush3.004B0065                      ;  拼凑出"XmPushL.exe"这个字符串
0040F506      6A 00         push 0
0040F508      68 21F54000   push 40F521
0040F50D      68 00880000   push 8800
0040F512      53            push ebx
0040F513      50            push eax
0040F514      8BD8          mov ebx,eax                              ;  将文件句柄备份到ebx后面释放
0040F516      E8 FBFC0900   call 004AF216                            ;  <jmp.&KERNEL32.WriteFile>
0040F51B      EB 0A         jmp short 0040F527                       ;  XmPush3.0040F527
0040F51D      8BD8          mov ebx,eax                              ;  将资源里的RES_LOADDLL保存在ebx
0040F51F    ^ EB B9         jmp short 0040F4DA                       ;  转到上面的CreateFileA
0040F521      90            nop
0040F522      90            nop
0040F523      90            nop
0040F524      90            nop
0040F525      90            nop
0040F526      90            nop
0040F527      53            push ebx                                 ;  完成RES_LOADDLL写出
0040F528      E8 8BFA0900   call 004AEFB8                            ;  <jmp.&KERNEL32.CloseHandle>
0040F52D      90            nop
0040F52E      90            nop
0040F52F      90            nop
0040F530      90            nop
0040F531      90            nop
0040F532      90            nop
0040F533      90            nop
0040F534      90            nop
0040F535      90            nop
0040F536      90            nop
0040F537      90            nop
0040F538      90            nop
0040F539      33C0          xor eax,eax
0040F53B   >  81C4 08420000 add esp,4208
0040F541   .  5E            pop esi
0040F542   .  5B            pop ebx
0040F543   .  C3            ret
因为WriteFile的参数需要,所以将40F521-40F526作为一段不放代码的空间,
当WriteFile执行完毕后直接跳过nop至0040F527,
接着保存所有修改点击OD里File菜单的历史dll,
系统提示错误,


可能是因为代码区是不可写所致,因为WriteFile会在0040F51F这个地址写入6个字节的值,
打开"LordPE.exe",PE编辑器,选择目标OD,区段".text"勾选可写入并保存,


然后再次点击OD菜单File的历史dll,OD目录成功写出34816字节的"XmPushL.exe",


现在OD已经可以实现无论当前目录是否存在"loaddll.exe"都能够载入dll文件了,

如果不存在先写出RES_LOADDLL生成"loaddll.exe"再载入,
因为之前将OD拖入了"HEdit.exe"把"loaddll.exe"修改为了"XmPushL.exe",
所以我的这个OD,即"XmPushD.exe"载入dll的时候会将RES_LOADDLL写出为"XmPushL.exe",
至此终于将OD内资源RES_LOADDLL替换完毕,
最后临睡觉之前来张OD全家福,
2011-9-19 20:48
0
雪    币: 255
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
呵呵!清晰···支持下!
2011-9-19 21:18
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
不错的,本人要好好学习的,谢谢分享
2011-9-20 19:12
0
雪    币: 599
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这个申请邀请码很靠谱了。
2011-9-20 19:19
0
雪    币: 9
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
进行调试的时候好像常会用到Windows上计算器的进制转换和用记事本记些临时数据,
虽然摁下Win+R然后输入"calc"或是"notepad"并不需要多长时间,
不过有时候天气太冷,冷得在OD里F7F8都要用鼠标点的时候,
就希望着要是能在OD里直接点击一下便能运行计算器或是记事本,
看了一下原版英文OD里有个Help菜单,
里面的"Contents"和"Select A&PI help file"子菜单一般还真用不到,
相对与中文版来说也就是"帮助"菜单里的"帮助内容"和"选择帮助文件",
要是点击它们能够运行计算器和记事本就好了,
先试试,
将目标OD拖入"ResHacker.exe",然后找到菜单,


在下面可以发现这样的菜单,


随便进行一下修改,然后编译脚本并保存,


同时记录下每个子菜单后面的数字,方便之后跟踪调试,
Calc-2502,NotePad-2503,

使用另外一个OD打开这个目标OD然后F9运行,
在工具栏上面单击"W"按钮,并在目标OD的主窗口上设置消息断点111-WM_COMMAND,


然后在目标OD上单击Help菜单里面的"Calc"子菜单,
然后调试目标OD的OD就断了下来,
004323D4 >/$  55            push ebp
004323D5  |.  8BEC          mov ebp,esp
004323D7      81C4 04F0FFFF add esp,-0FFC
004323DD  |.  50            push eax
004323DE  |.  81C4 30FDFFFF add esp,-2D0
004323E4  |.  53            push ebx
004323E5  |.  56            push esi
004323E6  |.  57            push edi
004323E7  |.  8B5D 10       mov ebx,[ebp+10]                         ;  set ebx=wParam
004323EA  |.  8B45 0C       mov eax,[ebp+C]                          ;  set eax=message
004323ED  |.  3D 11010000   cmp eax,111                              ;  比较message是否为WM_COMMAND; Switch (cases 1..478)
004323F2  |.  7F 61         jg short 00432455                        ;  XmPushD.00432455
004323F4  |.  0F84 1E140000 je 00433818                              ;  条件成立跳转实现

00433818  |> \8BCB          mov ecx,ebx                              ;  Case 111 (WM_COMMAND) of switch 004323ED
0043381A  |.  C1E9 10       shr ecx,10
0043381D  |.  66:85C9       test cx,cx
00433820  |.  0F85 EC090000 jnz 00434212                             ;  条件不成立,跳转未实现
00433826  |.  8BC3          mov eax,ebx
00433828  |.  66:25 FFFF    and ax,0FFFF
0043382C  |.  0FB7D0        movzx edx,ax                             ;  下面就开始比较菜单的编号了
0043382F  |.  81FA 9F080000 cmp edx,89F                              ;  Switch (cases 7D1..9C8)
00433835  |.  0F8F 0A010000 jg 00433945                              ;  因为点击的calc,十六进制为9C6,此时条件成立跳转

00433945  |> \81FA AD080000 cmp edx,8AD
0043394B  |.  7F 50         jg short 0043399D                        ;  大于,再跳转

0043399D  |> \81FA 63090000 cmp edx,963
004339A3  |.  7F 4B         jg short 004339F0                        ;  大于跳转

004339F0  |> \81FA C6090000 cmp edx,9C6                              ;  calc-2502,也就是9C6
004339F6  |.  7F 27         jg short 00433A1F                        ;  不大于,条件不成立,跳转未实现
004339F8  |.  0F84 4A070000 je 00434148                              ;  等于,成功跳转

到这里也就成功找到了calc被单击后的处理事件,
00434148  |> \6A 00         push 0                                   ; /Data = NULL; Case 9C6 of switch 0043382F
0043414A  |.  6A 03         push 3                                   ; |Command = HELP_INDEX
0043414C  |.  68 3D5A4B00   push 4B5A3D                              ; |XmPushD.hlp
00434151  |.  8B0D 7C3B4D00 mov ecx,[4D3B7C]                         ; |
00434157  |.  51            push ecx                                 ; |hWnd => 00050376 ('XmPushD',class='fengyue')
00434158  |.  E8 9DB40700   call 004AF5FA                            ; \WinHelpA
0043415D  |.  E9 B0000000   jmp 00434212                             ;  XmPushD.00434212
本来是准备使用OD导入函数里面的"ShellExecuteA"来运行calc的,
只不过这段区域好小,"ShellExecuteA"好像有6个参数,
而且还需要构建一个"calc"的文本字串,这段空间完全不够用,
只能想办法令找一段其它空间,先记下来calc处理事件的首地址00434148,
通过PEiD打开目标OD也就是"XmPushD.exe",然后点击EP段旁边的箭头按钮,
在".text"上点击鼠标右键单击"搜索全0处",找到一处可以写入代码的区域,


然后发现004AF642之后的区域都是空白的,准备在这个地方开始写入运行calc的代码,
为了确保安全先在004AF642这里下一个内存访问断点看会不会被断下,
F9后发觉似乎没有什么影响,- -,也不知道这样是否真的能够确保安全,
没办法,就算掩耳盗铃自欺欺人好了,
先在004AF642-004AF647的区域构建一个"calc"的字符串,
然后构建出这样的代码,
004AF642   .  63 61 6C 63 0>ascii "calc",0
004AF647      6A 00         push 0
004AF649      68 A4914B00   push 4B91A4
004AF64E      6A 00         push 0
004AF650      68 42F64A00   push 4AF642                              ;  ASCII "calc"
004AF655      68 7A914B00   push 4B917A                              ;  ASCII "open"
004AF65A      8B45 08       mov eax,[ebp+8]                          ;  [ebp+8]存放的是OD窗口的句柄
004AF65D      50            push eax
004AF65E      E8 DFFCFFFF   call 004AF342                            ;  <jmp.&SHELL32.ShellExecuteA>
004AF663    ^ E9 E54AF8FF   jmp 0043414D                             ;  XmPushD.0043414D

将前面calc被单击后处理事件里的代码起始地址00434148改为,
00434148     /E9 FAB40700            jmp 004AF647                             ;  XmPushD.004AF647
0043414D     |90                     nop
0043414E     |90                     nop
0043414F     |90                     nop
00434150     |90                     nop
00434151     |90                     nop                                      
00434152     |90                     nop
00434153     |90                     nop
00434154     |90                     nop
00434155     |90                     nop
00434156     |90                     nop
00434157     |90                     nop                                      
00434158     |90                     nop                                      
00434159     |90                     nop
0043415A     |90                     nop
0043415B     |90                     nop
0043415C     |90                     nop

这样子然后保存所有修改至文件,
接着果然单击菜单后能够运行计算器了,
2011-9-20 20:50
0
雪    币: 152
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
楼主确实是强人。。哈哈。。。不过好像有OD的插件,直接可以调用计算器的。
2011-9-20 21:01
0
雪    币: 768
活跃值: (535)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
12
楼主最近热衷于修改OD呀:) 不错支持一个
2011-9-20 21:54
0
雪    币: 120
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
虽说有现成的插件,但手动修改也未尝不是一件好事啊。哈哈。学习楼主分享的知识。
2011-9-20 22:38
0
雪    币: 245
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
楼主强人!!!
手动修改涉及不少知识
收藏学习……
2011-9-21 00:15
0
雪    币: 204
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
没多大意思  你直接把 计算器等实用工具 放在快速启动栏 不就OK了

  不过青菜萝卜各有所爱

我还以为是教怎么修改OD  让OD变得强大起来。免得经常遇到饭调试 烦啊

虽然有很多反调试的现成OD  不过能自己做个反调试的还是相当不错的。希望楼主能放雪
2011-9-21 08:54
0
雪    币: 345
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
学习修改方法,不过还是直接用计算工具好些哦。。。
2011-9-21 09:27
0
雪    币: 9
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
给OD加上,加上反反调试的功能?或许若干年后才有能力发表那样的帖子,现今我只是一个win32汇编的初学者,对于OD都没有用过多少次,OD未进行一些代码保护之类的加密操作实乃万幸,为获得邀请码一睹其他版块之风采斗胆写下三篇杂乱的修改记录,或是我的锲而不舍终打动版主勉强获得邀请码有幸正式成为看雪一员,在看雪各大版块浩瀚的知识海洋里那些帖子里颇多的各类专业词汇均乃未所闻见,同时也意识到自己井底之蛙能力之低下,希望若干年后打造一个属于自己的"SuperOD"并非痴人说梦吧,
2011-9-21 11:19
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
顶一下楼主,好帖!
2011-9-21 11:54
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
进来学习一下,多向老手学习
2011-9-21 17:43
0
游客
登录 | 注册 方可回帖
返回
//