![]() |
|
|
|
#1
|
||||
|
||||
|
Looks nice (logic). Anyway, won't work on 9x family.
Now, all hardcore maniacs, tell me why? ![]() Regards. |
|
#2
|
||||
|
||||
|
give me a kernel32.dll from 9x and i'll answer you hehe
(i dont have any laying around here and dont have any docs about win9x TIB, PEB(?!?) either). |
|
#3
|
||||
|
||||
|
Hey, that would be too easy
![]() You are accessing segment register to obtain the address of PEB and read process data. Since TEB (or TIB if you like) and PEB are well settled on WinNT clones but not on Win9x family, you have to be familiar with Win9x/WinNT kernels. TEB is not a problem here because its field is the same on all Windows. The problematic topic in your example is PEB. By using two additional APIs you will be able to add Win9x compatibility to the method you presented. I made my homework. Who's next (to tell us which APIs I'm talking about or/and present another solution)? Regards. |
|
#4
|
|||
|
|||
|
upb you want 9x IsDebuggerPresent raw code in kernel32.dll ??
her it is if you wanted that Code:
BFF946F6 IsDebuggerPresent A1 E49CFCBF MOV EAX,DWORD PTR DS:[BFFC9CE4] BFF946FB 8B08 MOV ECX,DWORD PTR DS:[EAX] BFF946FD 8379 54 01 CMP DWORD PTR DS:[ECX+54],1 BFF94701 1BC0 SBB EAX,EAX BFF94703 40 INC EAX BFF94704 C3 RETN Code:
DS:[BFFC9CE4]=C00309C8 EAX=00401000 (OLLYDBG.<ModuleEntryPoint>) Code:
DS:[C00309C8]=81752074 ECX=81752094 Code:
817520B4 3C 21 75 81 B0 A0 5F C1 80 0B 75 81 80 26 75 81 <!u���_��u��&u� 817520C4 BC 47 74 81 0C D0 5B 83 00 00 00 00 00 00 00 00 �Gt�.�[�........ flag position on compare Code:
EAX C00309C8 ECX 81752074 EDX 817520D4 EBX 00680000 ESP 0078FE38 EBP 0078FF78 ESI 81752074 EDI 00000000 EIP BFF946FD KERNEL32.BFF946FD C 0 ES 016F 32bit 0(97A0) P 1 CS 0167 32bit 0(FFFFFFFF) A 0 SS 016F 32bit 0(97A0) Z 0 DS 016F 32bit 0(97A0) S 1 FS 3517 16bit 81752270(37) T 0 GS 0000 NULL D 0 O 1 LastErr ERROR_INVALID_NAME (0000007B) EFL 00200A86 (O,NB,NE,A,S,PE,GE,G) Code:
EAX C00309C8 ECX 81752074 EDX 817520D4 EBX 00680000 ESP 0078FE38 EBP 0078FF78 ESI 81752074 EDI 00000000 EIP BFF94701 KERNEL32.BFF94701 C 0 ES 016F 32bit 0(97A0) P 0 CS 0167 32bit 0(FFFFFFFF) A 0 SS 016F 32bit 0(97A0) Z 0 DS 016F 32bit 0(97A0) S 1 FS 3517 16bit 81752270(37) T 0 GS 0000 NULL D 0 O 0 LastErr ERROR_INVALID_NAME (0000007B) EFL 00200282 (NO,NB,NE,A,S,PO,L,LE) on return Return to 00401005 (OLLYDBG.00401005) Code:
registers and flag on return EAX 00000001 ECX 81752074 EDX 817520D4 EBX 00680000 ESP 0078FE38 EBP 0078FF78 ESI 81752074 EDI 00000000 EIP BFF94704 KERNEL32.BFF94704 C 0 ES 016F 32bit 0(97A0) P 0 CS 0167 32bit 0(FFFFFFFF) A 0 SS 016F 32bit 0(97A0) Z 0 DS 016F 32bit 0(97A0) S 0 FS 3517 16bit 81752270(37) T 0 GS 0000 NULL D 0 O 0 LastErr ERROR_INVALID_NAME (0000007B) EFL 00200202 (NO,NB,NE,A,NS,PO,GE,G) now ollydbg cant see the address 0xc00309c8 |
|
#5
|
||||
|
||||
|
well damn...
i started reading the MSJ may 1996 article and found another thing that can be used to check for a debugger in win9x:
Quote:
Dno, after researching for 30 mins, i dont have enough motivation to add support for this ancient architecture :P anyone who does, read this article: hxxp://www.microsoft.com/msj/archive/S2CE.aspx Quote:
Last edited by upb; 03-01-2005 at 22:08. |
|
#6
|
|||
|
|||
|
well what you posted about fs:[20] was documented some where in wasm.ru
when i searched here is a snippet from there i had saved Code:
mov ecx,fs:[20h]
jecxz not_being_debugger
as i love my w2k the article is here http://wasm.ru/article.php?article=1017001 also there was some mention of fs:[60] in a japanese page ��OllyDbg������ʾ���롸����Υ���`���Υ���`���`�ɤϡ�FS:[34]��(Win2k/XP)�ޤ��ϡ�FS:[60]��(Win9x/Me)���Ǥ��������������Υ���`���`�ɤ���GetLastError�v���Α��ꂎ��һ�¤��ʤ����`���⤢��ޤ����ؤ�Windows2000/XP�ǤΤ�GetLastError�v���ǥ���`���`�ɤ�ȡ�ÿ��ܤ�API�v����ע some more storage of info here is an url to the code i pasted if some one want to test it in 9x http://www.powerbasic.com/support/forums/Forum6/HTML/004517.html Code:
Function IsDebuggerAttached() as Long
Local vi As OSVERSIONINFO
Local IsWin9x As Long
Local Dw As Dword
Local i As Dword
vi.dwOsVersionInfoSize = SizeOf(vi)
GetVersionEx vi
IsWin9x = ((vi.dwPlatformId = %VER_PLATFORM_WIN32_WINDOWS) And (vi.dwMinorVersion = 0)) Or _
((vi.dwPlatformId = %VER_PLATFORM_WIN32_WINDOWS) And (vi.dwMinorVersion <> 0))
If IsWin9x Then
!push eax '// Preserve the registers
!mov eax, fs:[&h18] '// Get the TIB's linear address
!mov eax, dword ptr [eax + &h20] '// Debugger Contex for Win9x
!mov dword ptr dw, eax '// Save it
!pop eax '// Restore the registers
If Dw Then
Function = -1
Else
Function = 0
End If
Else
!push eax '// Preserve the registers
!push ecx
!mov eax, fs:[&h18] '// Get the TIB's linear address
!mov eax, dword ptr [eax + &h30]
!mov ecx, dword ptr [eax] '// Get the whole DWORD
!mov dword ptr dw, ecx '// Save it
!pop ecx '// Restore the registers
!pop eax
'// The 3rd byte is the byte we really need to check for the
'// presence of a debugger.
'// Check the 3rd byte
i= dw And &h00010000???
If i Then
Function = -1
Else
Function = 0
End If
End If
Last edited by JuneMouse; 03-02-2005 at 00:01. |
|
#7
|
||||
|
||||
|
Quote:
Quote:
"Thread Information Block (TIB)" with it is the local housing territory of the thread which is called. As for the first address of this data block making use of the segmented register, "FS: [ 18 ] "With it can acquire. Furthermore, with NT system OS originally this data block is called "Thread Environment Block (TEB)" with, but both between the reverse engineer is called TIB. ' OllyDbg ' it indicates as for "the error cord/code of" last error "FS: [ 34 ] "(Win2k/XP) or" FS: [ 60 ] "(Win9x/Me) it is value. However, there is also a case where value of this error cord/code does not match the return value of GetLastError function. With only especially Windows2000/XP the error cord/code please pay attention to acquisition possible API function with GetLastError function. Furthermore, don't you think? ' special frame is �� 57 ' the function which converts the error cord/code to the Japanese descriptive text is mounted, (inside "the application control" window). By the way, with the main thread of �ǥХå��` "FS: [ 04 ] "With" FS: [ 08 ] "The stacked area it is possible also from value to specify.
__________________
Even as darkness envelops and consumes us, wrapping around our personal worlds like the hand that grips around our necks and suffocates us, we must realize that life really is beautiful and the shadows of despair will scurry away like the fleeting roaches before the light. Last edited by D-Jester; 03-02-2005 at 00:04. |
|
#8
|
|||
|
|||
|
Code:
; debug api test ;================ mov eax,cs cmp ax,0FFh setg Is9x .if Is9x ;; structures are documented by EliCZ mov eax,fs:[20h];TIB.DebugContext test eax,eax setnz al or Detected,al mov ebx,fs:[30h];TIB.pParentPDB mov eax,[ebx+20h];[ebx].PDB.flags and eax,1;fDebugSingle equ 1 or Detected,al mov eax,[ebx+54h];[ebx].PDB.DebuggeeCB :IsDebuggerPresent test eax,eax setnz al or Detected,al .else ;; ddk mov eax,fs:[30h];TEB.pPEB ; pointer to PEB movzx eax,byte ptr [eax+2];[eax].PEB.BeingDebugged :IsDebuggerPresent or Detected,al .endif while BeingDebugged you can (upb's 1st post) debug api in 9x suck for example try to trace (single step) not esp not esp *crash* forget about 9x, support only NT (it's only a unpacker, unpacked exe must work on both) |
![]() |
| Thread Tools | |
| Display Modes | |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Beating a two session max! | abitofboth | General Discussion | 6 | 04-14-2005 09:07 |