• 标 题: XP记事本被我PE成垃圾,~~~~
  • 作 者:qiweixue
  • 时 间:004-10-20,21:04
  • 链 接:http://bbs.pediy.com

XP记事本被我PE成垃圾,~~~~~~高手别进了,浪费时间~~~
最近时间比较忙,只是敢兴趣~~偶是一只菜鸟~~~
界面很难看,没有加菜单,很简单,但也很垃圾~~(有时间加入菜单)
让我的Xp的记事本打开一个事例,没有别的意思,只是看到满屏幕的记事本有些烦,顺便改一改(好像有一篇QQ单开受启发吧,自己搞了一下,玩完,);用到的API函数,如FindWindowA来检测记事本的事例是否存在,IsDebuggerPresent检验NT调试器,同时,检测了OD的的存在用的是FindWindowA,用ShellExecuteA打开了htt:\\www.pediy.com 的网址,用打开了本地一OUTlook,可以同时到看雪,同时发邮件; 还可以编辑文本(可是倒贴钱也没有人要,要是有兴趣,那自己做了一 个吧,:=)很简单;什么别的意思,代码不多
我在记事本里用到API函数,这里就不一一声明了,
用到是FindwindowA,LoadLibraryA GetProcAddress ShellExecuteA MessageBoxA等在www.baidu.com很好找到它们的声明;

工具:lordpe,  od,  Hex workshop
声明:不可以增强自己的调试能力,不有利于(不知道)···就是加几个API函数,相信你也能~~~
第一步,先用lordpe加入我们要引入的函数
第二步,再用od写代码;

下面要讲到;写入的代码不是很多;

第一步:
用lordpe就可以加你要的函数,(也可以用hex的写输入表,在引入函数,)不多说了;
对了,先把记事本的BoundImport表清0(不要绑定输入,我们好引入函数),lordpe打开记事本
选ImportTable表,add import 表,加入一个USER32.DLL库,在加上FindWindowA与MessageBoxA
选上这个view always Firstthunk,如下:
ThunkRva  ThunkOFfset  ThunkValue  Hint    APIName
00013027   00010227    0001300b    0000    FindWindowA   
0001302b   0001022b    00013019    0000    MessageBoxA
再加入一个kernel32.dll库,加一个ExitProcess ,API

ThunkRVA          Thunkoffset    ThunkValue   Hint       APIName
0001304e           0001024e      00013040     0000        ExitProcess
00013083           0001024e      0001024e     0000        LoadLibraryA
00013087           0001024e      0001024e     0000        GetProcAddress 
                   

好保存,ThunkRva(记好引入函数的RVA) 对我们有用,一会将用到;

第二步:
打开od改入口,让指令跳到我们的代码出,再找空隙;以下是我的及时本的OEP,要保留好,改完要用到;
01006AE0 N> $  6A 70             push 70
01006AE2    .  68 88180001       push NOTEPAD.01001888
01006AE7    .  E8 BC010000       call NOTEPAD.01006CA8
01006AEC    .  33DB              xor ebx,ebx
01006AEE    .  53                push ebx                                        ; /pModule => NULL
01006AEF    .  8B3D 4C110001     mov edi,dword ptr ds:[<&KERNEL32.GetModuleHandl>; |kernel32.GetModuleHandleA
01006AF5    .  FFD7              call edi                                        ; \GetModuleHandleA
                                 
好,原来没有改oep要记好了,改完要用到;

一下是我找的第一快空隙,空隙很好找;看到都是0000的大都就可以用,不都说了;
01007D71       00                db 00
01007D72       00                db 00
01007D73       00                db 00
01007D74       00                db 00
01007D75       00                db 00
01007D76       00                db 00
01007D77       00                db 00
01007D78       00                db 00
01007D79       00                db 00
01007D7A       00                db 00
01007D7B       00                db 00
01007D7C       00                db 00
01007D7D       00                db 00
01007D7E       00                db 00


这里我改好了所有代码,改好的OEP
我改了入口之后:
01006AE0 N> $  60                pushad
01006AE1    .  9C                pushfd
01006AE2    .  E9 8A120000       jmp NOTEPAD.01007D71  跳到找到的空隙
01006AE7    >  E8 BC010000       call NOTEPAD.01006CA8
01006AEC    .  33DB              xor ebx,ebx
01006AEE    .  53                push ebx                                        ; e 
01006AEF    .  8B3D 4C110001     mov edi,dword ptr ds:[<&KERNEL32.GetModuleHandl>; 
01006AF5    .  FFD7              call edi                                        ; 


空隙要找足够大,第一次的时候,我就是空隙不足,很严重~我用加了新区块物理地址大小1000,够大了~~其实都浪费了:=()以下是我在空隙该里写入的代码:
01007D71    > \6A 00           push 0                                         ; /Title = NULL
01007D73    .  68 E0810001     push NOTEPAD.010081E0                          ; |Class = "Notepad"
01007D78    .  FF15 27300101   call dword ptr ds:[<&user32.FindWindowA>]      ; \FindWindowA
01007D7E    .  83F8 00         cmp eax,0
01007D81    .  74 1D           je short NOTEPAD.01007DA0
01007D83    .  90              nop
01007D84    .  6A 00           push 0                                         ; /Style = MB_OK|MB_APPLMODAL
01007D86    .  68 F0810001     push NOTEPAD.010081F0                          ; |Title = " Only Run One; "
01007D8B    .  68 00820001     push NOTEPAD.01008200                          ; |Text = "Warning Only runing One~"
01007D90    .  6A 00           push 0                                         ; |hOwner = NULL
01007D92    .  FF15 2B300101   call dword ptr ds:[<&user32.MessageBoxA>]      ; \MessageBoxA
01007D98    >  6A 00           push 0                                         ; /ExitCode = 0
01007D9A    .  FF15 4E300101   call dword ptr ds:[101304E]                    ; \ExitProcess
01007DA0    >  90              nop
01007DA1    .  6A 00           push 0                                         ; /Style = MB_OK|MB_APPLMODAL
01007DA3    .  68 20820001     push NOTEPAD.01008220                          ; |Title = "First Runing Me"
01007DA8    .  68 40820001     push NOTEPAD.01008240                          ; |Text = "Hello,GoodLuck~"
01007DAD    .  6A 00           push 0                                         ; |hOwner = NULL
01007DAF    .  FF15 2B300101   call dword ptr ds:[<&user32.MessageBoxA>]      ; \MessageBoxA
01007DB5    .  90              nop
01007DB6    .  68 50820001     push NOTEPAD.01008250                          ; /pModule = "KERNEL32.dll"
01007DBB    .  FF15 4C110001   call dword ptr ds:[<&KERNEL32.GetModuleHandleA>; \GetModuleHandleA
01007DC1    .  8BD0            mov edx,eax
01007DC3    .  68 60820001     push NOTEPAD.01008260                          ; /ProcNameOrOrdinal = "IsDebuggerPresent"
01007DC8    .  52              push edx                                       ; |hModule
01007DC9    .  FF15 83300101   call dword ptr ds:[1013083]                    ; \GetProcAddress
01007DCF    .  8BD8            mov ebx,eax
01007DD1    .  90              nop
01007DD2    .  6A 00           push 0
01007DD4    .  FFD3            call ebx
01007DD6    .  83F8 00         cmp eax,0
01007DD9    .  74 17           je short NOTEPAD.01007DF2
01007DDB    .  6A 00           push 0                                         ; /Style = MB_OK|MB_APPLMODAL
01007DDD    .  68 30820001     push NOTEPAD.01008230                          ; |Title = "Warning!!!"
01007DE2    .  68 74820001     push NOTEPAD.01008274                          ; |Text = "Can not debug me!!!:=("
01007DE7    .  6A 00           push 0                                         ; |hOwner = NULL
01007DE9    .  FF15 2B300101   call dword ptr ds:[<&user32.MessageBoxA>]      ; \MessageBoxA
01007DEF    .  90              nop
01007DF0    .^ EB A6           jmp short NOTEPAD.01007D98
01007DF2    >- E9 09A20000     jmp NOTEPAD.01012000   ==》》跳到我另一个空隙以为在往下写会pp的(很难看啊~~)

又一个空隙这一块代码就是上边条过来的(代码大多od都注释了,不在一一注释了)
01012000     68 90820001       push NOTEPAD.01008290                          ; ASCII "SHELL32.dll"
01012005     FF15 87300101     call dword ptr ds:[1013087]                    ; kernel32.LoadLibraryA
0101200B     8BD0              mov edx,eax
0101200D     90                nop
0101200E     68 9C820001       push NOTEPAD.0100829C                          ; ASCII "ShellExecuteA"
01012013     52                push edx
01012014     FF15 83300101     call dword ptr ds:[1013083]                    ; kernel32.GetProcAddress
0101201A     8BD0              mov edx,eax
0101201C     90                nop
0101201D     6A 05             push 5
0101201F     6A 00             push 0
01012021     6A 00             push 0
01012023     68 B0820001       push NOTEPAD.010082B0                          ; ASCII "http:\\www.pediy.com:80"
01012028     68 AB820001       push NOTEPAD.010082AB                          ; ASCII "open"
0101202D     6A 00             push 0
0101202F     FFD2              call edx
01012031     68 90820001       push NOTEPAD.01008290                          ; ASCII "SHELL32.dll"
01012036     FF15 4C110001     call dword ptr ds:[<&KERNEL32.GetModuleHandleA>; kernel32.GetModuleHandleA
0101203C     8BD0              mov edx,eax
0101203E     90                nop
0101203F     68 9C820001       push NOTEPAD.0100829C                          ; ASCII "ShellExecuteA"
01012044     52                push edx
01012045     FF15 83300101     call dword ptr ds:[1013083]                    ; kernel32.GetProcAddress
0101204B     8BD0              mov edx,eax
0101204D     90                nop
0101204E     6A 01             push 1
01012050     6A 00             push 0
01012052     6A 00             push 0
01012054     68 C8820001       push NOTEPAD.010082C8                          ; ASCII "mailto:YouMailAddr@WebSite.com"
01012059     68 AB820001       push NOTEPAD.010082AB                          ; ASCII "open"
0101205E     6A 00             push 0
01012060     FFD2              call edx
01012062     90                nop
01012063     EB 04             jmp short NOTEPAD.01012069
01012065     90                nop
01012066     90                nop
01012067     90                nop
01012068     90                nop
01012069     68 50820001       push NOTEPAD.01008250                          ; ASCII "KERNEL32.dll"
0101206E     FF15 4C110001     call dword ptr ds:[<&KERNEL32.GetModuleHandleA>; kernel32.GetModuleHandleA
01012074     90                nop
01012075     8BD0              mov edx,eax
01012077     68 10830001       push NOTEPAD.01008310                          ; ASCII "CloseHandle"
0101207C     52                push edx
0101207D     FF15 83300101     call dword ptr ds:[1013083]                    ; kernel32.GetProcAddress
01012083     A3 20830001       mov dword ptr ds:[1008320],eax
01012088     6A 00             push 0
0101208A     68 30830001       push NOTEPAD.01008330                          ; ASCII "Ollydbg"
0101208F     A1 27300101       mov eax,dword ptr ds:[<&user32.FindWindowA>]
01012094     FFD0              call eax
01012096     83F8 00           cmp eax,0
01012099   - 0F85 3C5DFFFF     jnz NOTEPAD.01007DDB
0101209F     6A 00             push 0
010120A1     68 38830001       push NOTEPAD.01008338                          ; ASCII "eXpLoRer"
010120A6     A1 27300101       mov eax,dword ptr ds:[<&user32.FindWindowA>]
010120AB     FFD0              call eax
010120AD     83F8 00           cmp eax,0
010120B0   - 0F85 255DFFFF     jnz NOTEPAD.01007DDB
010120B6     6A 00             push 0
010120B8     68 E8820001       push NOTEPAD.010082E8                          ; ASCII "Tankes:=)"
010120BD     68 F2820001       push NOTEPAD.010082F2                          ; ASCII "Program runing,Thank you!:=)"
010120C2     6A 00             push 0
010120C4     FF15 2B300101     call dword ptr ds:[<&user32.MessageBoxA>]      ; USER32.MessageBoxA
010120CA     9D                popfd             ;恢复栈
010120CB     61                popad
010120CC     6A 70             push 70              ;这就是原来的oep要恢复
010120CE     68 88180001       push NOTEPAD.01001888
010120D3   - E9 0F4AFFFF       jmp NOTEPAD.01006AE7      
010120D8     90                nop
010120D9     50                push eax
010120DA     8B1D 20830001     mov ebx,dword ptr ds:[1008320]
010120E0     FFD3              call ebx
010120E2   - E9 F45CFFFF       jmp NOTEPAD.01007DDB




原理很简单,不多说了!!!
~~~~很菜的,别见笑~~~~谢谢,你的支持~~~
GOOD LUCK FOR YOU AND FOR ME