简易PEDIY
【目    标】:cyclotron的护肤宝(IDT Protector 1.0)
【工    具】:Olydbg1.1(diy版)、LORDPE
【任    务】:非常简单的为程序增加一个小小的功能
【操作平台】:Windows Xp sp2
【作    者】:loveboom[DFCG][FCG][US]
【简要说明】:这个软件对经常脱壳的朋友来说应该是比较熟吧,我自己是常用它,在WINDOWS XP也能工作,又能保存IDT到文件。只是有时意外发生时,要自己动手去删除注册表,不是很习惯,所以就想办法让程序自己去删除一下。(也就是如果注册表里的信息没有清除的话,程序就会报错,但不会询问是否删除,要我们自己DIY^_^)
【详细过程】:
在操作之前,我们先要清楚一下,要加什么功能,相关的功能要用到什么“家伙”。
我们要增加的功能就是:
1.删除注册表项;
2.删除后选择要不要立即重启系统。
第一个问题的相关扩展:
要删除注册表我们就起码要这么几个API:
RegOpenKeyExA
RegDeleteKeyA
RegCloseKey
程序里没有直接操作注册表,所以我们要自己手工加进去,要加进去,我们当然要有相关的键值信息,所以我们把相关的键值写到程序中。我自己是加到这么几个地方:
删除注册表相关API
RVA        API
703B        RegOpenKeyExA
703F        RegDeleteKeyA
7043        RegCloseKey
删除注册表相关键值
RVA        信息
6EB0        Enum        子项
6EB5        Security        子项
6E60        SYSTEM\CurrentControlSet\Services\IDTProt    主键
好了,第一个问题我们已经解决了。
第二个问题:
要提示当然要用MessageBoxA这个API吧,用这个API我们还要加两个值进去,一个是标题,一个是内容。
如果选择了重启还要写重启代码,这里要注意了,因为在2k/xp下不能再向WIN9X下那样可以直接发送ExitWindowsEx,EWX_REBOOT,0.要有权限等,设置权限的问题如果直接写是比较烦的,所以我选择了自己用DLL写功能,然后在程序里直接调用。
信息框内容:
RVA        信息
6E90        Restart your computer now
6EBE    Information
信息和重启的API
RVA        API
205c        MessageBoxA
8014    Reboot(这个是我自己定义的API)
收集完相关的信息后,我们开始操作了,用LORDPE添加相关的API,并用HEXEDIT添加相关的信息。那个DLL可以自己写,也可以参照我的。
打开OD加载程序,先找到那个出错地方所在的位置,因程序比较小,所以直接在CPU窗口里翻几下就可以找到的说。找到以下位置:
004011DF  |> \6A 10         PUSH 10                                  ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
004011E1  |.  6A 00         PUSH 0                                   ; |Title = NULL
004011E3  |.  68 BF304000   PUSH 004030BF                            ; |Text = "Can't register driver!
Try to Delete
HKLM\SYSTEM\CurrentControlSet\Services\IDTProt
and Restart you computer..."
004011E8  |.  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hOwner
004011EB  |.  E8 A4040000   CALL <JMP.&user32.MessageBoxA>           ; \MessageBoxA
找到后就改一下,程序原是只有一个确定按钮,我要让这里可以选择是否删除注册表。所以改一下
004011DF   > \6A 14         PUSH 14                                  ; /Style = MB_YESNO|MB_ICONHAND|MB_APPLMODAL
004011E1   .  6A 00         PUSH 0                                   ; |Title = NULL
004011E3   .  68 BF304000   PUSH 004030BF                            ; |Text = "Can't register driver!
Try to Delete'HKLM\SYSTEM\CurrentControlSet\Services\IDTProt'(must restart computer)?"
004011E8   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hOwner
004011EB   .  E8 A4040000   CALL <JMP.&user32.MessageBoxA>           ; \MessageBoxA
004011F0   .  E9 EB040000   JMP 004016E0                             ;  跳去我们自己的代码处
004011F5      90            NOP
具体的值,可以参照一下MSDN
 我们自己的代码开始:
004016E0   > \83F8 06       CMP EAX,6                                ;  判断是不是点了确定按钮
004016E3   .  74 0B         JE SHORT 004016F0                        ;  如果是则增加删除注册表代码
004016E5   >  FF35 E0374000 PUSH DWORD PTR DS:[4037E0]               ;  如果选择的否则退回去到原程序中
004016EB   .^ E9 06FBFFFF   JMP 004011F6
004016F0   >  68 00184000   PUSH 00401800                            ; /pHandle = IDTProtm.00401800
004016F5   .  68 3F000F00   PUSH 0F003F                              ; |Access = KEY_ALL_ACCESS
004016FA   .  6A 00         PUSH 0                                   ; |Reserved = 0
004016FC   .  68 606E4000   PUSH 00406E60                            ; |Subkey = "SYSTEM\CurrentControlSet\Services\IDTProt"
00401701   .  68 02000080   PUSH 80000002                            ; |hKey = HKEY_LOCAL_MACHINE
00401706   .  FF15 3B704000 CALL DWORD PTR DS:[<&advapi32.RegOpenKey>; \打开注册表
0040170C   .  68 B06E4000   PUSH 00406EB0                            ; /删除Enum子键
00401711   .  FF35 00184000 PUSH DWORD PTR DS:[401800]               ; |hKey = 0
00401717   .  FF15 3F704000 CALL DWORD PTR DS:[<&advapi32.RegDeleteK>; \RegDeleteKeyA
0040171D   .  68 B56E4000   PUSH 00406EB5                            ; /删除子项Security
00401722   .  FF35 00184000 PUSH DWORD PTR DS:[401800]               ; |hKey = 0
00401728   .  FF15 3F704000 CALL DWORD PTR DS:[<&advapi32.RegDeleteK>; \RegDeleteKeyA
0040172E   .  68 10184000   PUSH 00401810                            ; /因为RegDeleteKey不能删除里面有子项的键,所以我们要先删除子项
00401733   .  FF35 00184000 PUSH DWORD PTR DS:[401800]               ; |hKey = 0
00401739   .  FF15 3F704000 CALL DWORD PTR DS:[<&advapi32.RegDeleteK>; \RegDeleteKeyA
0040173F   .  FF35 00184000 PUSH DWORD PTR DS:[401800]               ; /删除后关闭注册表
00401745   .  FF15 43704000 CALL DWORD PTR DS:[<&advapi32.RegCloseKe>; \RegCloseKey
0040174B   .  6A 21         PUSH 21                                  ; /这里开始提示是否立即重启
0040174D   .  68 BE6E4000   PUSH 00406EBE                            ; |Title = "Information"
00401752   .  68 906E4000   PUSH 00406E90                            ; |Text = "Restart your computer now?"
00401757   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]                ; |hOwner
0040175A   .  FF15 5C204000 CALL DWORD PTR DS:[<&user32.MessageBoxA>>; \MessageBoxA
00401760   .  83F8 02       CMP EAX,2
00401763   .^ 74 80         JE SHORT 004016E5                        ;  如果选择了否则返回程序原过程
00401765   .  FF35 E0374000 PUSH DWORD PTR DS:[4037E0]               ;  先关闭,然后重启
0040176B   .  E8 42FFFFFF   CALL <JMP.&advapi32.CloseServiceHandle>
00401770   .  FF15 14804000 CALL DWORD PTR DS:[408014]               ;  进入我们自己写的重启DLL中
00401776   .^ E9 B1FEFFFF   JMP 0040162C                             ;  这里,其实可以不写的,因为上面都已经重启了
写完这些代码后,我们保存文件。
OK,就写这么一点了,文章内容对高手们来说就没什么意思了。也没有什么参照价值.
Greetz:
 Fly.Jingulong,yock,tDasm.David.ahao.UFO(brother).alan(sister).all of my friends and you!

By loveboom[DFCG][FCG]
Email:bmd2chen@tom.com
本代码的着色效果由xTiNt自动完成
下载xTiNt http://211.90.75.84/web/kanaun/download/xTiNt.rar