-
-
简易PEDIY
-
发表于:
2004-11-9 19:35
7448
-
简易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附件:pediy.rar
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)