<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Delphi Engineering</title>
	<atom:link href="http://www.ebonk.org/delphi/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ebonk.org/delphi</link>
	<description>Notes about Software Engineering with CodeGear Delphi</description>
	<pubDate>Tue, 12 Feb 2008 23:55:15 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Nicolas Falliere: Windows Anti-Debug Reference</title>
		<link>http://www.ebonk.org/delphi/2008/02/13/nicolas-falliere-windows-anti-debug-reference/</link>
		<comments>http://www.ebonk.org/delphi/2008/02/13/nicolas-falliere-windows-anti-debug-reference/#comments</comments>
		<pubDate>Tue, 12 Feb 2008 23:53:45 +0000</pubDate>
		<dc:creator>ebonk</dc:creator>
		
		<category><![CDATA[reverse engineering]]></category>

		<category><![CDATA[]]></category>

		<guid isPermaLink="false">http://www.ebonk.org/delphi/2008/02/13/nicolas-falliere-windows-anti-debug-reference/</guid>
		<description><![CDATA[Windows Anti-Debug ReferenceNicolas Falliere
This paper classifies and presents several anti-debugging techniques used on Windows NT-based operating systems. Anti-debugging techniques are ways for a program to detect if it runs under control of a debugger. They are used by commercial executable protectors, packers and malicious software, to prevent or slow-down the process of reverse-engineering. We&#8217;ll suppose [...]]]></description>
			<content:encoded><![CDATA[<p><b><span class="headline">Windows Anti-Debug Reference<br /></span></b><i>Nicolas Falliere</i></p>
<p>This paper classifies and presents several anti-debugging techniques used on Windows NT-based operating systems. Anti-debugging techniques are ways for a program to detect if it runs under control of a debugger. They are used by commercial executable protectors, packers and malicious software, to prevent or slow-down the process of reverse-engineering. We&#8217;ll suppose the program is analyzed under a ring3 debugger, such as OllyDbg on Windows platforms. The paper is aimed towards reverse-engineers and malware analysts. Note that we will talk purely about generic anti-debugging and anti-tracing techniques. Specific debugger detection, such as window or processes enumeration, registry scanning, etc. will not be addressed here.<br /><span id="more-10"></span><br /><b>[1] Intro</b></p>
<p>This paper classifies and presents several anti-debugging techniques used on Windows NT-based operating systems.<br />Anti-debugging techniques are ways for a program to detect if it runs under control of a debugger. They are used by commercial executable protectors, packers and malicious software, to prevent or slow-down the process of reverse-engineering.</p>
<p>We&#8217;ll suppose the program is analyzed under a ring3 debugger, such as OllyDbg on Windows platforms. The paper is aimed towards reverse-engineers and malware analysts.<br />Note that we will talk purely about generic anti-debugging and anti-tracing techniques. Specific debugger detection, such as window or processes enumeration, registry scanning, etc. will not be addressed here.</p>
<p><b>[2] Anti-debugging and anti-tracing techniques</b></p>
<p>- Exploiting memory discrepancies</p>
<p><i>(1) kernel32!IsDebuggerPresent</i></p>
<p>IsDebuggerPresent returns 1 if the process is being debugged, 0 otherwise. This API simply reads the PEB!BeingDebugged byte-flag (located at offset 2 in the PEB structure).<br />Circumventing it is as easy as setting PEB!BeingDebugged to 0.<br />Example:<br />call IsDebuggerPresent<br />test eax, eax<br />jne @DebuggerDetected<br />&#8230;</p>
<p><i>(2) PEB!IsDebugged</i></p>
<p>This field refers to the second byte in the Process Environment Block of the process. It is set by the system when the process is debugged.<br />This byte can be reset to 0 without consequences for the course of execution of the program (it is an informative flag).</p>
<p>Example:<br />mov eax, fs:[30h]<br />mov eax, byte [eax+2]<br />test eax, eax<br />jne @DebuggerDetected<br />&#8230;</p>
<p><i>(3) PEB!NtGlobalFlags</i></p>
<p>When a process is created, the system sets some flags that will define how various APIs will behave for this program. Those flags can be read in the PEB, in the DWORD located at offset 0&#215;68 (see the reference).<br />By default, different flags are set depending if the process is created under a debugger or not. If the process is debugged, some flags controlling the heap manipulation routines in ntdll will be set: FLG_HEAP_ENABLE_TAIL_CHECK, FLG_HEAP_ENABLE_FREE_CHECK and FLG_HEAP_VALIDATE_PARAMETERS.<br />This anti-debug can be bypassed by resetting the NtGlobalFlags field.</p>
<p>Example:<br />mov eax, fs:[30h]<br />mov eax, [eax+68h]<br />and eax, 0&#215;70<br />test eax, eax<br />jne @DebuggerDetected<br />&#8230;</p>
<p><i>(4) Heap flags</i></p>
<p>As explained previously, NtGlobalFlags informs how the heap routines will behave (among other things). Though it is easy to modify the PEB field, if the heap does not behave the same way as it should when the process is not debugged, this could be problematic. It is a powerful anti-debug, as process heaps are numerous, and their chunks can be individually affected by the FLG_HEAP_* flags (such as chunk tails). Heap headers would be affected as well. For instance, checking the field ForceFlags in a heap header (offset 0&#215;10) can be used to detect the presence of a debugger.</p>
<p>There are two easy ways to circumvent it:</p>
<ul>
<li>Create a non-debugged process, and attach the debugger once the process has been created (an easy solution is to create the process suspended, run until the entry-point is reached, patch it to an infinite loop, resume the process, attach the debugger, and restore the original entry-point).</li>
<li>Force the NtGlobalFlags for the process that we want to debug, via the registry key &#8220;HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options&#8221;: Create a subkey (not value) named as your process name, and under this subkey, a String value &#8220;GlobalFlags&#8221; set to nothing.</li>
</ul>
<p>Example:<br />mov eax, fs:[30h]<br />mov eax, [eax+18h] ;process heap<br />mov eax, [eax+10h] ;heap flags<br />test eax, eax<br />jne @DebuggerDetected<br />&#8230;</p>
<p><i>(5) Vista anti-debug (no name)</i></p>
<p>Here&#8217;s an anti-debug specific to Windows Vista that I found by comparing memory dumps of a program running with and without control of a debugger. I&#8217;m not sure of its realiability, but it&#8217;s worth mentionning (tested on Windows Vista 32 bits, SP0, English version).</p>
<p>When a process is debugged, its main thread TEB, at offset 0xBFC, contains a pointer to a unicode string referencing a system dll. Moreover, the string follows this pointer (therefore, located at offset 0xC00 in the TEB). If the process is not debugged, the pointer is set to NULL and the string is not present.</p>
<p>Example:<br />call GetVersion<br />cmp al, 6<br />jne @NotVista<br />push offset _seh<br />push dword fs:[0]<br />mov fs:[0], esp<br />mov eax, fs:[18h] ; teb<br />add eax, 0BFCh<br />mov ebx, [eax] ; pointer to a unicode string<br />test ebx, ebx ; (ntdll.dll, gdi32.dll,&#8230;)<br />je @DebuggerNotFound<br />sub ebx, eax ; the unicode string follows the<br />sub ebx, 4 ; pointer<br />jne @DebuggerNotFound<br />;debugger detected if it reaches this point<br />;&#8230;</p>
<p>- Exploiting system discrepancies</p>
<p><i>(1) NtQueryInformationProcess</i></p>
<p>ntdll!NtQueryInformationProcess is a wrapper around the ZwQueryInformationProcess syscall. Its prototype is the following:</p>
<p>NTSYSAPI NTSTATUS NTAPI NtQueryInformationProcess(<br />IN HANDLE ProcessHandle,<br />IN PROCESS_INFORMATION_CLASS ProcessInformationClass,<br />OUT PVOID ProcessInformation,<br />IN ULONG ProcessInformationLength,<br />OUT PULONG ReturnLength<br />);</p>
<p>When called with ProcessInformationClass set to 7 (ProcessDebugPort constant), the system will set ProcessInformation to -1 if the process is debugged.<br />It is a powerful anti-debug, and there is no easy way to circumvent it. However, if the program is traced, ProcessInformation can be modified when the syscall returns.</p>
<p>Another solution is to use a system driver that would hook the ZwNtQueryInformationProcess syscall.<br />Circumventing NtQueryInformationProcess will bypass many anti-debug techniques (such as CheckRemoteDebuggerPresent or UnhandledExceptionFilter).</p>
<p>Example:<br />push 0<br />push 4<br />push offset isdebugged<br />push 7 ;ProcessDebugPort<br />push -1<br />call NtQueryInformationProcess<br />test eax, eax<br />jne @ExitError<br />cmp isdebugged, 0<br />jne @DebuggerDetected<br />&#8230;</p>
<p><i>(2) kernel32!CheckRemoteDebuggerPresent</i></p>
<p>This API takes two parameters: a process handle, and a pointer to a DWORD. If the call is successful, the DWORD value will be set to 1 if the process is being debugged.<br />Internally, this API calls ntdll!NtQueryInformationProcess with ProcessInformationClass set to ProcessDebugPort (7).</p>
<p>Example:<br />push offset isdebugged<br />push -1<br />call CheckRemoteDebuggerPresent<br />test eax, eax<br />jne @DebuggerDetected<br />&#8230;</p>
<p><i>(3) UnhandledExceptionFilter</i></p>
<p>When an exception occurs, with Windows XP SP&gt;=2, Windows 2003, and Windows Vista, the usual way the OS processes the exception is:</p>
<p>- If any, pass control to the per-process Vectored Exception Handlers.<br />- If the exception is not processed, pass the control to the per-thread top SEH handler, pointed by FS:[0] in the thread that generated the exception. SEH are chained and called in turn if the exception is not processed by the previous in the chain.<br />- If the exception has not been processed by any of the previous handlers, the final SEH handler (set by the system), will call kernel32!UnhandledExceptionFilter. This function will decide what it should do depending if the process is debugged or not.<br />- If it is not debugged, it will call the user-defined filter function (set via kernel32!SetUnhandledExceptionFilter).<br />- If it debugged, the program will be terminated.</p>
<p>The debugger detection in UnhandledExceptionFilter is made with ntdll!NtQueryInformationProcess.</p>
<p>Example:<br />push @not_debugged<br />call SetUnhandledExceptionFilter<br />xor eax, eax<br />mov eax, dword [eax] ; trigger exception<br />;program terminated if debugged<br />;&#8230;<br />@not_debugged:<br />;process the exception<br />;continue the execution<br />;&#8230;</p>
<p>(4) NtSetInformationThread<br />ntdll!NtSetInformationThread is a wrapper around the ZwSetInformationThread syscall. Its prototype is the following:<br />NTSYSAPI NTSTATUS NTAPI NtSetInformationThread(<br />IN HANDLE ThreadHandle,<br />IN THREAD_INFORMATION_CLASS ThreadInformationClass,<br />IN PVOID ThreadInformation,<br />IN ULONG ThreadInformationLength<br />);</p>
<p>When called with ThreadInformationClass set to 0&#215;11 (ThreadHideFromDebugger constant), the thread will be detached from the debugger.</p>
<p>Similarly to ZwQueryInformationProcess, circumventing this anti-debug requires either modifying ZwSetInformationThread parameters before it&#8217;s called, or hooking the syscall directly with the use of a kernel driver.</p>
<p>Example:<br />push 0<br />push 0<br />push 11h ;ThreadHideFromDebugger<br />push -2<br />call NtSetInformationThread<br />;thread detached if debugged<br />;&#8230;</p>
<p><i>(5) kernel32!CloseHandle and NtClose</i></p>
<p>APIs making user of the ZwClose syscall (such as CloseHandle, indirectly) can be used to detect a debugger. When a process is debugged, calling ZwClose with an invalid handle will generate a STATUS_INVALID_HANDLE (0xC0000008) exception.</p>
<p>As with all anti-debugs that rely on information made directly available from the kernel (therefore involving a syscall), the only proper way to bypass the &#8220;CloseHandle&#8221; anti-debug is to either modify the syscall data from ring3, before it is called, or set up a kernel hook.</p>
<p>This anti-debug, though extremely powerful, does not seem to be widely used by malicious programs.</p>
<p>Example:<br />push offset @not_debugged<br />push dword fs:[0]<br />mov fs:[0], esp<br />push 1234h ;invalid handle<br />call CloseHandle<br />; if fall here, process is debugged<br />;&#8230;<br />@not_debugged:<br />;&#8230;</p>
<p><i>(6) Self-debugging</i></p>
<p>A process can detect it is being debugged by trying to debug itself, for instance by creating a new process, and calling kernel32!DebugActiveProcess(pid) on the parent process.</p>
<p>In turn, this API calls ntdll!DbgUiDebugActiveProcess which will call the syscall ZwDebugActiveProcess. If the process is already debugged, the syscall fails. Note that retrieving the parent process PID can be done with the toolhelp32 APIs (field th32ParentProcessID in the PROCESSENTRY32 structure.</p>
<p><i>(7) Kernel-mode timers</i></p>
<p>kernel32!QueryPerformanceCounter is an efficent anti-debug. This API calls ntdll!NtQueryPerformanceCounter which wraps the ZwQueryPerformanceCounter syscall.</p>
<p>Again, there is no easy way to circumvent this anti-tracing trick.</p>
<p><i>(8) User-mode timers</i></p>
<p>An API such as kernel32!GetTickCount returns the number of milliseconds ellapsed since the system started. The interesting thing is that it does not make use of kernel-related service to perform its duties. A user-mode process has this counter mapped in its address space. For 8Gb user-mode spaces, the value returned would be:</p>
<p>d[0x7FFE0000] * d[0x7FFE0004] / (2^24)</p>
<p><i>(9) kernel32!OutputDebugStringA</i></p>
<p>This anti-debug is quite original, I have encountered it only once, in files packed with ReCrypt v0.80. The trick consists of calling OutputDebugStringA, with a valid ASCII string. If the program is run under control of a debugger, the return value will be the address of the string passed as a parameter. In normal conditions, the return value should be 1.</p>
<p>Example:<br />xor eax, eax<br />push offset szHello<br />call OutputDebugStringA<br />cmp eax, 1<br />jne @DebuggerDetected<br />&#8230;</p>
<p><i>(10) Ctrl-C</i></p>
<p>When a console program is debugged, a Ctrl-C signal will throw a EXCEPTION_CTL_C exception, whereas the signal handler would be called directly is the program is not debugged.</p>
<p>Example:<br />push offset exhandler<br />push 1<br />call RtlAddVectoredExceptionHandler<br />push 1<br />push sighandler<br />call SetConsoleCtrlHandler<br />push 0<br />push CTRL_C_EVENT<br />call GenerateConsoleCtrlEvent<br />push 10000<br />call Sleep<br />push 0<br />call ExitProcess<br />exhandler:<br />;check if EXCEPTION_CTL_C, if it is,<br />;debugger detected, should exit process<br />;&#8230;<br />sighandler:<br />;continue<br />;&#8230;</p>
<p>- CPU anti-debug</p>
<p><i>(1) Rogue Int3</i></p>
<p>This is a classic anti-debug to fool weak debuggers. It consists of inserting an INT3 opcode in the middle of a valid sequence of instructions. When the INT3 is executed, if the program is not debugged, control will be given to the exception handler of the protection and execution will continue.</p>
<p>As INT3 instructions are used by debuggers to set software breakpoints, inserting INT3 opcodes can be used to trick the debugger into believing that it is one his breakpoints. Therefore, the control would not be given to the exception handler, and the course of the program would be modified. Debuggers should track where they set software breakpoints to avoid falling for this one.</p>
<p>Similarly, note that INT3 may be encoded as 0xCD, 0&#215;03.</p>
<p>Example:<br />push offset @handler<br />push dword fs:[0]<br />mov fs:[0], esp<br />;&#8230;<br />db 0CCh<br />;if fall here, debugged<br />;&#8230;<br />@handler:<br />;continue execution<br />;&#8230;</p>
<p><i>(2) &#8220;Ice&#8221; Breakpoint</i></p>
<p>The so-called &#8220;Ice breakpoint&#8221; is one of Intel&#8217;s undocumented instruction, opcode 0xF1. It is used to detect tracing programs.</p>
<p>Executing this instruction will generate a SINGLE_STEP exception. Therefore, if the program is already traced, the debugger will think it is the normal exception generated by executing the instruction with the SingleStep bit set in the Flags registers. The associated exception handler won&#8217;t be executed, and execution will not continue as expected.<br />Bypassing this trick is easy: one can run over the instruction, instead and single-stepping on it. The exception will be generated, but since the program is not traced, the debugger should understand that it has to pass control to the exception handler.</p>
<p>Example:<br />push offset @handler<br />push dword fs:[0]<br />mov fs:[0], esp<br />;&#8230;<br />db 0F1h<br />;if fall here, traced<br />;&#8230;<br />@handler:<br />;continue execution<br />;&#8230;</p>
<p><i>(3) Interrupt 2Dh</i></p>
<p>Executing this interrupt if the program is not debugged will raise a breakpoint exception. If the program is debugged, and the instruction is not executed with the trace flag, no exception will be generated, and execution will carry on normally. If the program is debugged and the instruction traced, the following byte will be skipped, and execution will continue. Therefore, using INT 2Dh can be used as a powerful anti-debug and anti-tracer mechanism.<br />Example:<br />push offset @handler<br />push dword fs:[0]<br />mov fs:[0], esp<br />;&#8230;<br />db 02Dh<br />mov eax, 1 ;anti-tracing<br />;&#8230;<br />@handler:<br />;continue execution<br />;&#8230;</p>
<p><i>(4) Timestamp counters</i></p>
<p>High precision counters, storing the current number of CPU cycles executed since the machine started, can be queried with the RDTSC instruction. Classic anti-debugs consist of measuring time deltas at key points in the program, usually around exception handlers. If the delta is too large, that would mean the program runs under control of a debugger (processing the exception in the debugger, and giving control back to the debuggee is a lengthy task).</p>
<p>Example:<br />push offset handler<br />push dword ptr fs:[0]<br />mov fs:[0],esp<br />rdtsc<br />push eax<br />xor eax, eax<br />div eax ;trigger exception<br />rdtsc<br />sub eax, [esp] ;ticks delta<br />add esp, 4<br />pop fs:[0]<br />add esp, 4<br />cmp eax, 10000h ;threshold<br />jb @not_debugged<br />@debugged:<br />&#8230;<br />@not_debugged:<br />&#8230;<br />handler:<br />mov ecx, [esp+0Ch]<br />add dword ptr [ecx+0B8h], 2 ;skip div<br />xor eax, eax<br />ret</p>
<p><i>(5) Popf and the trap flag</i></p>
<p>The trap flag, located in the Flags register, controls the tracing of a program. If this flag is set, executing an instruction will also raise a SINGLE_STEP exception. The trap flag can be manipulated in order to thwart tracers. For instance, this sequence of instructions will set the trap flag:</p>
<p>pushf<br />mov dword [esp], 0&#215;100<br />popf</p>
<p>If the program is being traced, this will have no real effect on the flags register, and the debugger will process the exception, believing it comes from regular tracing. The exception handler won&#8217;t be executed. Circumventing this anti-tracer trick simply require to run over the pushf instruction.</p>
<p><i>(6) Stack Segment register</i></p>
<p>Here&#8217;s a very original anti-tracer. I encountered it in a packer called MarCrypt. I believe it is not widely known, not to mention, used.<br />It consists of tracing over this sequence of instructions:</p>
<p>push ss<br />pop ss<br />pushf<br />nop</p>
<p>When tracing over pop ss, the next instruction will be executed but the debugger will not break on it, therefore stopping on the following instruction (NOP in this case).<br />Marcrypt uses this anti-debug the following way:</p>
<p>push ss<br />; junk<br />pop ss<br />pushf<br />; junk<br />pop eax<br />and eax, 0&#215;100<br />or eax, eax<br />jnz @debugged<br />; carry on normal execution</p>
<p>The trick here is that, if the debugger is tracing over that sequence of instructions, popf will be excuted implicitly, and the debugger will not be able to unset the trapflag in the pushed value on the stack. The protection checks for the trap flag and terminates the program if it&#8217;s found.<br />One simple way to circumvent this anti-tracing is to breakpoint on popf and run the program (to avoid using the TF flag).</p>
<p><i>(7) Debug registers manipulation</i></p>
<p>Debug registers (DR0 through DR7) are used to set hardware breakpoints. A protection can manipulate them to either detect that hardware breakpoints have been set (and therefore, that it is being debugged), reset them or set them to particular values used to perform code checks later. A packer such as tElock makes use of the debug registers to prevent reverse-engineers from using them.<br />From a user-mode perspective, debug registers cannot be set using the privileged &#8216;mov drx, &#8230;&#8217; instruction. Other ways exist:</p>
<p>- An exception can be generated, the thread context modified (it contains the CPU registers at the time the exception was thrown), and then resumed to normal execution with the new context.</p>
<p>- The other way is to use the NtGetContextThread and NtSetContextThread syscalls (available in kernel32 with GetThreadContext and SetThreadContext).</p>
<p>Most protectors use the first, &#8220;unofficial&#8221; way.</p>
<p>Example:<br />push offset handler<br />push dword ptr fs:[0]<br />mov fs:[0],esp<br />xor eax, eax<br />div eax ;generate exception<br />pop fs:[0]<br />add esp, 4<br />;continue execution<br />;&#8230;<br />handler:<br />mov ecx, [esp+0Ch] ;skip div<br />add dword ptr [ecx+0B8h], 2 ;skip div<br />mov dword ptr [ecx+04h], 0 ;clean dr0<br />mov dword ptr [ecx+08h], 0 ;clean dr1<br />mov dword ptr [ecx+0Ch], 0 ;clean dr2<br />mov dword ptr [ecx+10h], 0 ;clean dr3<br />mov dword ptr [ecx+14h], 0 ;clean dr6<br />mov dword ptr [ecx+18h], 0 ;clean dr7<br />xor eax, eax<br />ret</p>
<p><i>(8) Context modification</i></p>
<p>As with debug registers manipulation, the context can also be used to modify in an unconventionnal way the execution stream of a program. Debuggers can get easily confused!<br />Note that another syscall, NtContinue, can be used to load a new context in the current thread (for instance, this syscall is used by the exception handler manager).</p>
<p>- Uncategorized anti-debug</p>
<p><i>(1) TLS-callback</i></p>
<p>This anti-debug was not so well-known a few years ago. It consists to instruct the PE loader that the first entry point of the program is referenced in a Thread Local Storage entry (10th directory entry number in the PE optional header). By doing so, the program entry-point won&#8217;t be executed first. The TLS entry can then perform anti-debug checks in a stealthy way.<br />Note that in practice, this technique is not widely used.<br />Though older debuggers (including OllyDbg) are not TLS-aware, counter-measures are quite easy to take, by the means of plugins of custom patcher tools.</p>
<p><i>(2) CC scanning</i></p>
<p>A common protection feature used by packers is the CC-scanning loop, aimed at detecting software breakpoints set by a debugger. If you want to avoid that kind of troubles, you may want to use either hardware breakpoints or a custom type of software breakpoint. CLI (0xFA) is a good candidate to replace the classic INT3 opcode. This instruction does have the requirements for the job: it raises a privileged instruction exception if executed by a ring3 program, and occupies only 1 byte of space.</p>
<p><i>(3) EntryPoint RVA set to 0</i></p>
<p>Some packed files have their entry point RVA set to 0, which means they will start executing &#8216;MZ&#8230;&#8217; which corresponds to &#8216;dec ebx / pop edx &#8230;&#8217;.</p>
<p>This is not an anti-debug trick in itself, but can be annoying if you want to break on the entry-point by using a software breakpoint.</p>
<p>If you create a suspended process, then set an INT3 at RVA 0, you will erase part of the magic MZ value (&#8217;M'). The magic was checked when the process was created, but it will get checked again by ntdll when the process is resumed (in the hope of reaching the entry-point). In that case, an INVALID_IMAGE_FORMAT exception will be raised.</p>
<p>If you create your own tracing or debugging tool, you will want to use hardware breakpoint to avoid this problem.</p>
<p><b>[3] Conclusion</b></p>
<p>Knowing anti-debugging and anti-tracing techniques (un)commonly used by malware or protectors is useful knowledge for a reverse-engineer. A program will always have ways to find it is run in a debugger - the same applies for virtual or emulated environments, but since ring3 debuggers are some of the most common analysis tools used, knowing common tricks, and how to bypass them, will always prove useful.</p>
<p><b>[4] Links</b></p>
<p><a href="http://msdn2.microsoft.com/en-us/default.aspx">MSDN</a><br /><a href="http://msdn.microsoft.com/msdnmag/issues/02/02/PE/default.aspx">Portable Executable Tutorial, Matt Pietrek</a><br /><a href="http://metasploit.com/users/opcode/syscalls.html">Syscall Reference, The Metasploit Project</a><br /><a href="http://undocumented.ntinternals.net/">Undocumented Functions for MS Windows NT/2K</a><br /><a href="http://www.intel.com/products/processor/manuals/index.htm">Intel Manuals</a>
<ul>
<li>Common exception codes - Microsoft Windows SDK, ntdll.h</li>
<li>Status codes list (including common exception codes) - Microsoft Windows DDK, ntstatus.h</li>
<li>Context Structures documentation - Microsoft Windows SDK, ntdll.h</li>
</ul>
<p><b>[5] Data reference</b></p>
<p>- CONTEXT structure for IA32 processors<br />struct CONTEXT_IA32<br />{<br />// ContextFlags must be set to the appropriate CONTEXT_* flag<br />// before calling (Set|Get)ThreadContext<br />DWORD ContextFlags;</p>
<p>// CONTEXT_DEBUG_REGISTERS (not included in CONTEXT_FULL)<br />DWORD Dr0; // 04h<br />DWORD Dr1; // 08h<br />DWORD Dr2; // 0Ch<br />DWORD Dr3; // 10h<br />DWORD Dr6; // 14h<br />DWORD Dr7; // 18h</p>
<p>// CONTEXT_FLOATING_POINT<br />FLOATING_SAVE_AREA FloatSave;</p>
<p>// CONTEXT_SEGMENTS<br />DWORD SegGs; // 88h<br />DWORD SegFs; // 90h<br />DWORD SegEs; // 94h<br />DWORD SegDs; // 98h</p>
<p>// CONTEXT_INTEGER<br />DWORD Edi; // 9Ch<br />DWORD Esi; // A0h<br />DWORD Ebx; // A4h<br />DWORD Edx; // A8h<br />DWORD Ecx; // ACh<br />DWORD Eax; // B0h</p>
<p>// CONTEXT_CONTROL<br />DWORD Ebp; // B4h<br />DWORD Eip; // B8h<br />DWORD SegCs; // BCh (must be sanitized)<br />DWORD EFlags; // C0h<br />DWORD Esp; // C4h<br />DWORD SegSs; // C8h</p>
<p>// CONTEXT_EXTENDED_REGISTERS (processor-specific)<br />BYTE ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];<br />};</p>
<p>- Process Environment Block structure (from The Wine Project)<br />struct PEB<br />{<br />BOOLEAN InheritedAddressSpace; // 00<br />BOOLEAN ReadImageFileExecOptions; // 01<br />BOOLEAN BeingDebugged; // 02<br />BOOLEAN SpareBool; // 03<br />HANDLE Mutant; // 04<br />HMODULE ImageBaseAddress; // 08<br />PPEB_LDR_DATA LdrData; // 0c<br />RTL_UPROCESS_PARAMETERS *ProcessParameters; // 10<br />PVOID SubSystemData; // 14<br />HANDLE ProcessHeap; // 18<br />PRTL_CRITICAL_SECTION FastPebLock; // 1c<br />PVOID /*PPEBLOCKROUTI*/ FastPebLockRoutine; // 20<br />PVOID /*PPEBLOCKROUTI*/ FastPebUnlockRoutine; // 24<br />ULONG EnvironmentUpdateCount; // 28<br />PVOID KernelCallbackTable; // 2c<br />PVOID EventLogSection; // 30<br />PVOID EventLog; // 34<br />PVOID /*PPEB_FREE_BLO*/ FreeList; // 38<br />ULONG TlsExpansionCounter; // 3c<br />PRTL_BITMAP TlsBitmap; // 40<br />ULONG TlsBitmapBits[2]; // 44<br />PVOID ReadOnlySharedMemoryBase; // 4c<br />PVOID ReadOnlySharedMemoryHeap; // 50<br />PVOID *ReadOnlyStaticServerData; // 54<br />PVOID AnsiCodePageData; // 58<br />PVOID OemCodePageData; // 5c<br />PVOID UnicodeCaseTableData; // 60<br />ULONG NumberOfProcessors; // 64<br />ULONG NtGlobalFlag; // 68<br />BYTE Spare2[4]; // 6c<br />LARGE_INTEGER CriticalSectionTimeout; // 70<br />ULONG HeapSegmentReserve; // 78<br />ULONG HeapSegmentCommit; // 7c<br />ULONG HeapDeCommitTotalFreeTh; // 80<br />ULONG HeapDeCommitFreeBlockTh; // 84<br />ULONG NumberOfHeaps; // 88<br />ULONG MaximumNumberOfHeaps; // 8c<br />PVOID *ProcessHeaps; // 90<br />PVOID GdiSharedHandleTable; // 94<br />PVOID ProcessStarterHelper; // 98<br />PVOID GdiDCAttributeList; // 9c<br />PVOID LoaderLock; // a0<br />ULONG OSMajorVersion; // a4<br />ULONG OSMinorVersion; // a8<br />ULONG OSBuildNumber; // ac<br />ULONG OSPlatformId; // b0<br />ULONG ImageSubSystem; // b4<br />ULONG ImageSubSystemMajorVersion; // b8<br />ULONG ImageSubSystemMinorVersion; // bc<br />ULONG ImageProcessAffinityMask; // c0<br />ULONG GdiHandleBuffer[34]; // c4<br />ULONG PostProcessInitRoutine; // 14c<br />PRTL_BITMAP TlsExpansionBitmap; // 150<br />ULONG TlsExpansionBitmapBits[32]; // 154<br />ULONG SessionId; // 1d4<br />};</p>
<p>- Thread Environment Block structure (from The Wine Project)<br />struct TEB<br />{<br />NT_TIB Tib; // 000 Info block<br />PVOID EnvironmentPointer; // 01c<br />CLIENT_ID ClientId; // 020 PID,TID<br />PVOID ActiveRpcHandle; // 028<br />PVOID ThreadLocalStoragePointer; // 02c<br />PEB *Peb; // 030<br />DWORD LastErrorValue; // 034<br />ULONG CountOfOwnedCriticalSections; // 038<br />PVOID CsrClientThread; // 03c<br />PVOID Win32ThreadInfo; // 040<br />ULONG Win32ClientInfo[0x1f]; // 044<br />PVOID WOW32Reserved; // 0c0<br />ULONG CurrentLocale; // 0c4<br />ULONG FpSoftwareStatusRegister; // 0c8<br />PVOID SystemReserved1[54]; // 0cc<br />PVOID Spare1; // 1a4<br />LONG ExceptionCode; // 1a8<br />BYTE SpareBytes1[40]; // 1ac<br />PVOID SystemReserved2[10]; // 1d4<br />DWORD num_async_io; // 1fc<br />ULONG_PTR dpmi_vif; // 200<br />DWORD vm86_pending; // 204<br />DWORD pad6[309]; // 208<br />ULONG gdiRgn; // 6dc<br />ULONG gdiPen; // 6e0<br />ULONG gdiBrush; // 6e4<br />CLIENT_ID RealClientId; // 6e8<br />HANDLE GdiCachedProcessHandle; // 6f0<br />ULONG GdiClientPID; // 6f4<br />ULONG GdiClientTID; // 6f8<br />PVOID GdiThreadLocaleInfo; // 6fc<br />PVOID UserReserved[5]; // 700<br />PVOID glDispachTable[280]; // 714<br />ULONG glReserved1[26]; // b74<br />PVOID glReserved2; // bdc<br />PVOID glSectionInfo; // be0<br />PVOID glSection; // be4<br />PVOID glTable; // be8<br />PVOID glCurrentRC; // bec<br />PVOID glContext; // bf0<br />ULONG LastStatusValue; // bf4<br />UNICODE_STRING StaticUnicodeString; // bf8<br />WCHAR StaticUnicodeBuffer[261]; // c00<br />PVOID DeallocationStack; // e0c<br />PVOID TlsSlots[64]; // e10<br />LIST_ENTRY TlsLinks; // f10<br />PVOID Vdm; // f18<br />PVOID ReservedForNtRpc; // f1c<br />PVOID DbgSsReserved[2]; // f20<br />ULONG HardErrorDisabled; // f28<br />PVOID Instrumentation[16]; // f2c<br />PVOID WinSockData; // f6c<br />ULONG GdiBatchCount; // f70<br />ULONG Spare2; // f74<br />ULONG Spare3; // f78<br />ULONG Spare4; // f7c<br />PVOID ReservedForOle; // f80<br />ULONG WaitingOnLoaderLock; // f84<br />PVOID Reserved5[3]; // f88<br />PVOID *TlsExpansionSlots; // f94<br />};</p>
<p>- NtGlobalFlags<br />FLG_STOP_ON_EXCEPTION 0&#215;00000001<br />FLG_SHOW_LDR_SNAPS 0&#215;00000002<br />FLG_DEBUG_INITIAL_COMMAND 0&#215;00000004<br />FLG_STOP_ON_HUNG_GUI 0&#215;00000008<br />FLG_HEAP_ENABLE_TAIL_CHECK 0&#215;00000010<br />FLG_HEAP_ENABLE_FREE_CHECK 0&#215;00000020<br />FLG_HEAP_VALIDATE_PARAMETERS 0&#215;00000040<br />FLG_HEAP_VALIDATE_ALL 0&#215;00000080<br />FLG_POOL_ENABLE_TAIL_CHECK 0&#215;00000100<br />FLG_POOL_ENABLE_FREE_CHECK 0&#215;00000200<br />FLG_POOL_ENABLE_TAGGING 0&#215;00000400<br />FLG_HEAP_ENABLE_TAGGING 0&#215;00000800<br />FLG_USER_STACK_TRACE_DB 0&#215;00001000<br />FLG_KERNEL_STACK_TRACE_DB 0&#215;00002000<br />FLG_MAINTAIN_OBJECT_TYPELIST 0&#215;00004000<br />FLG_HEAP_ENABLE_TAG_BY_DLL 0&#215;00008000<br />FLG_IGNORE_DEBUG_PRIV 0&#215;00010000<br />FLG_ENABLE_CSRDEBUG 0&#215;00020000<br />FLG_ENABLE_KDEBUG_SYMBOL_LOAD 0&#215;00040000<br />FLG_DISABLE_PAGE_KERNEL_STACKS 0&#215;00080000<br />FLG_HEAP_ENABLE_CALL_TRACING 0&#215;00100000<br />FLG_HEAP_DISABLE_COALESCING 0&#215;00200000<br />FLG_VALID_BITS 0&#215;003FFFFF<br />FLG_ENABLE_CLOSE_EXCEPTION 0&#215;00400000<br />FLG_ENABLE_EXCEPTION_LOGGING 0&#215;00800000<br />FLG_ENABLE_HANDLE_TYPE_TAGGING 0&#215;01000000<br />FLG_HEAP_PAGE_ALLOCS 0&#215;02000000<br />FLG_DEBUG_WINLOGON 0&#215;04000000<br />FLG_ENABLE_DBGPRINT_BUFFERING 0&#215;08000000<br />FLG_EARLY_CRITICAL_SECTION_EVT 0&#215;10000000<br />FLG_DISABLE_DLL_VERIFICATION 0&#215;80000000</p>
<p>&#8211;<br />Taken from the original location here:<br /><a href="http://www.securityfocus.com/infocus/1893">http://www.securityfocus.com/infocus/1893</a></p>
<p>Technorati Tags: <a class="performancingtags" href="http://technorati.com/tag/reverse-engineering" rel="tag">reverse-engineering</a>, <a class="performancingtags" href="http://technorati.com/tag/debug" rel="tag">debug</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ebonk.org/delphi/2008/02/13/nicolas-falliere-windows-anti-debug-reference/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Codegear Delphi/C++ Programmer Required</title>
		<link>http://www.ebonk.org/delphi/2007/12/10/codegear-delphic-programmer-required/</link>
		<comments>http://www.ebonk.org/delphi/2007/12/10/codegear-delphic-programmer-required/#comments</comments>
		<pubDate>Mon, 10 Dec 2007 01:24:34 +0000</pubDate>
		<dc:creator>ebonk</dc:creator>
		
		<category><![CDATA[vacancy]]></category>

		<category><![CDATA[]]></category>

		<guid isPermaLink="false">http://www.ebonk.org/delphi/2007/12/10/codegear-delphic-programmer-required/</guid>
		<description><![CDATA[Kami mencari beberapa programmer untuk dikontrak dalam sebuah proyek
jangka panjang. Pendidikan tidak diutamakan. Curriculum Vitae tidak
menjadi acuan. Lokasi di Jakarta &#38; sekitarnya. Kalau selain
Jakarta, harus terbiasa bekerja secara remote.
Jika kamu termasuk dalam ciri-ciri orang yang kami cari:

Senang utak-atik kode dengan Codegear (formerly known as Borland) Delphi or C++.
Mampu membuat VCL component from scratch.
Familiar dengan XML [...]]]></description>
			<content:encoded><![CDATA[<p>Kami mencari beberapa programmer untuk dikontrak dalam sebuah proyek<br />
jangka panjang. Pendidikan tidak diutamakan. Curriculum Vitae tidak<br />
menjadi acuan. Lokasi di Jakarta &amp; sekitarnya. Kalau selain<br />
Jakarta, harus terbiasa bekerja secara remote.</p>
<p>Jika kamu termasuk dalam ciri-ciri orang yang kami cari:
<ul>
<li>Senang utak-atik kode dengan Codegear (formerly known as Borland) Delphi or C++.</li>
<li>Mampu membuat VCL component from scratch.</li>
<li>Familiar dengan XML (XML Schema, DTD)</li>
<li>Familiar dengan HTML, terutama XHTML 1.0</li>
<li>Familiar dengan socket programming (eg: Winsock, atau IndySocket)</li>
</ul>
<p>  Jika kamu memiliki ciri-ciri ini akan lebih disukai:
<ul>
<li>Mengikuti perkembangan salah satu dari kedua programming language tersebut.</li>
<li>Familiar dengan UML</li>
<li>Mampu menggunakan Win32 API</li>
<li>Familiar dengan software open source seperti Linux, Apache, PHP, MySQL, PostgreSQL, etc.</li>
<li>Mampu bekerja dengan sistem target.</li>
</ul>
<p>Kirim email ke <b>recruitment [at] uc.web.id</b> dengan mencantumkan:
<ul>
<li>Subyek email: UC-08</li>
<li>Proyek terbaik yang pernah dikerjakan dan deskripsinya.</li>
<li>Screenshot program yang pernah dikerjakan.</li>
<li>Link ke halaman web atau blog (opsional)</li>
<li>Tempat kamu bekerja sekarang (khusus selain freelancer)</li>
<li>Alamat dan Nomor handphone atau telepon PSTN.</li>
</ul>
<p>Email kamu akan kami follow up jika dikirim sebelum 31 Januari 2008 pukul 12.00 siang.</p>
<p>Salam,</p>
<p>Catatan: Jika kamu tidak memenuhi ciri-ciri tersebut, jangan kirim aplikasi.</p>
<p>Technorati Tags: <a class="performancingtags" href="http://technorati.com/tag/delphi" rel="tag">delphi</a>, <a class="performancingtags" href="http://technorati.com/tag/c++" rel="tag">c++</a>, <a class="performancingtags" href="http://technorati.com/tag/vacancy" rel="tag">vacancy</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ebonk.org/delphi/2007/12/10/codegear-delphic-programmer-required/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Bedah Buku Seputar SOFT-COMPUTING</title>
		<link>http://www.ebonk.org/delphi/2007/11/16/bedah-buku-seputar-soft-computing/</link>
		<comments>http://www.ebonk.org/delphi/2007/11/16/bedah-buku-seputar-soft-computing/#comments</comments>
		<pubDate>Fri, 16 Nov 2007 14:17:18 +0000</pubDate>
		<dc:creator>ebonk</dc:creator>
		
		<category><![CDATA[event]]></category>

		<category><![CDATA[]]></category>

		<category><![CDATA[softcomputing]]></category>

		<guid isPermaLink="false">http://www.ebonk.org/delphi/2007/11/16/bedah-buku-seputar-soft-computing/</guid>
		<description><![CDATA[Sebagai bagian rangkaian acara International Conference on Computational Science 2007 (ICCS2007), http://seminar.fmipa.itb.ac.id/index.php/iccs/2007
kami mengadakan acara:
BEDAH BUKU SEPUTAR SOFT-COMPUTING
tgl/hari : selasa, 4 Desember 2007
tempat : Basic Science Center ITB
pukul : 13.00-15.00 WIB
susunan acara:
&#8220;Soft-Computing: sebuah bahasa untuk multi-ilmu&#8221;
 Dr.Anto S. Nugroho (BPPT dan vice president Komunitas Soft Computing Indonesia)
A tribute to Prof. The:
&#8220;Fisika dan Komputasi Cerdas&#8221;
 Prof. The [...]]]></description>
			<content:encoded><![CDATA[<p>Sebagai bagian rangkaian acara International Conference on Computational Science 2007 (ICCS2007), <a href="http://seminar.fmipa.itb.ac.id/index.php/iccs/2007">http://seminar.fmipa.itb.ac.id/index.php/iccs/2007</a><br />
kami mengadakan acara:</p>
<p><strong>BEDAH BUKU SEPUTAR SOFT-COMPUTING</strong><br />
tgl/hari : selasa, 4 Desember 2007<br />
tempat : Basic Science Center ITB<br />
pukul : 13.00-15.00 WIB</p>
<p>susunan acara:</p>
<p>&#8220;Soft-Computing: sebuah bahasa untuk multi-ilmu&#8221;<br />
<strong> Dr.Anto S. Nugroho</strong> (BPPT dan vice president Komunitas Soft Computing Indonesia)</p>
<p>A tribute to Prof. The:<br />
&#8220;Fisika dan Komputasi Cerdas&#8221;<br />
<strong> Prof. The Houw Liong</strong> (Fisika Sistem Kompleks, ITB)</p>
<p><strong>BEDAH BUKU:</strong><br />
&#8220;Kendali Cerdas: teori dan aplikasinya&#8221; karya Son Kuswadi<br />
Penyaji : <strong>Dr. Son Kuswadi</strong> (Robotics and Automation Based on Biologically Inspired Technology RABBIT, ITS)</p>
<p>Pengulas aspek Kendali:<br />
<strong> Dr. Bambang Riyanto</strong> (Pakar Sistem Kendali EL-ITB)</p>
<p>Pengulas aspek Cerdas:<br />
<strong> Dr.Andriyan B. Suksmono</strong> (Pakar Sistem Cerdas EL-ITB dan Dosen Berprestasi Tk Nasional 2007)</p>
<p>Diskusi umum dan tanya jawab</p>
<p>Peserta:<br />
terbuka untuk mahasiswa, pelajar dan umum tanpa dipungut biaya (gratis).</p>
<p>Panitia Bedah buku<br />
Acep Purqon</p>
<p>info lebih lanjut:<br />
acep@fi.itb.ac.id<br />
acep@wriron1.s.kanazawa-u.ac.jp</p>
<p>Technorati Tags: <a href="http://technorati.com/tag/softcomputing" class="performancingtags" rel="tag">softcomputing</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ebonk.org/delphi/2007/11/16/bedah-buku-seputar-soft-computing/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Delphi 2007 and C++Builder 2007 update #2 is now available</title>
		<link>http://www.ebonk.org/delphi/2007/08/10/delphi-2007-and-cbuilder-2007-update-2-is-now-available/</link>
		<comments>http://www.ebonk.org/delphi/2007/08/10/delphi-2007-and-cbuilder-2007-update-2-is-now-available/#comments</comments>
		<pubDate>Fri, 10 Aug 2007 10:29:37 +0000</pubDate>
		<dc:creator>ebonk</dc:creator>
		
		<category><![CDATA[delphi 2007]]></category>

		<category><![CDATA[cppbuilder 2007]]></category>

		<guid isPermaLink="false">http://www.ebonk.org/delphi/2007/08/10/delphi-2007-and-cbuilder-2007-update-2-is-now-available/</guid>
		<description><![CDATA[Codegear telah merilis update #2 untuk Delphi 2007 dan C++ Builder 2007. Update tersebut telah siap didownload untuk para registered user di websitenya.
http://www.codegear.com/downloads/regusers/delphi
http://www.codegear.com/downloads/regusers/cppbuilder.
Petunjuk singkat untuk melakukan update bisa dilihat di sini:
http://blogs.codegear.com/davidi/archive/2007/08/09/38067.aspx
Technorati Tags: delphi-2007
]]></description>
			<content:encoded><![CDATA[<p>Codegear telah merilis update #2 untuk Delphi 2007 dan C++ Builder 2007. Update tersebut telah siap didownload untuk para registered user di websitenya.</p>
<p><a href="http://www.codegear.com/downloads/regusers/delphi">http://www.codegear.com/downloads/regusers/delphi</a></p>
<p><a href="http://www.codegear.com/downloads/regusers/cppbuilder.">http://www.codegear.com/downloads/regusers/cppbuilder.</a></p>
<p>Petunjuk singkat untuk melakukan update bisa dilihat di sini:<br />
<a href="http://blogs.codegear.com/davidi/archive/2007/08/09/38067.aspx">http://blogs.codegear.com/davidi/archive/2007/08/09/38067.aspx</a></p>
<p>Technorati Tags: <a href="http://technorati.com/tag/delphi-2007" class="performancingtags" rel="tag">delphi-2007</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ebonk.org/delphi/2007/08/10/delphi-2007-and-cbuilder-2007-update-2-is-now-available/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Teknologi Anti-Piracy dari Microsoft</title>
		<link>http://www.ebonk.org/delphi/2007/07/16/teknologi-anti-piracy-dari-microsoft/</link>
		<comments>http://www.ebonk.org/delphi/2007/07/16/teknologi-anti-piracy-dari-microsoft/#comments</comments>
		<pubDate>Sun, 15 Jul 2007 18:18:50 +0000</pubDate>
		<dc:creator>ebonk</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[Activation]]></category>

		<category><![CDATA[Anti-piracy]]></category>

		<category><![CDATA[OGA]]></category>

		<category><![CDATA[WGA]]></category>

		<guid isPermaLink="false">http://www.ebonk.org/delphi/2007/07/16/teknologi-anti-piracy-dari-microsoft.html</guid>
		<description><![CDATA[Microsoft akan merilis teknologi Anti-Pircay yang disebutnya Software Licensing and Protection Services (SLP). Teknologi ini membantu para ISV untuk membuat lisensi dengan mudah dan fleksibel.
Teknologi yang dikembangkan oleh Secured Dimensions, yang diakuisisi oleh Microsoft sejak Januari 2007 lalu itu terdiri dari tiga bagian utama:

Code Protector SDK.
Software development kit yang dilengkapi dengan API, sample, dan antarmuka [...]]]></description>
			<content:encoded><![CDATA[<p>Microsoft akan merilis teknologi Anti-Pircay yang disebutnya <a href="http://www.microsoft.com/presspass/features/2007/jul07/07-10slpservices.mspx?rss_fdn=Top%20Stories">Software Licensing and Protection Services (SLP)</a>. Teknologi ini membantu para ISV untuk membuat lisensi dengan mudah dan fleksibel.</p>
<p>Teknologi yang dikembangkan oleh Secured Dimensions, yang diakuisisi oleh Microsoft sejak Januari 2007 lalu itu terdiri dari tiga bagian utama:</p>
<ol>
<li><strong>Code Protector SDK.</strong><br />
Software development kit yang dilengkapi dengan API, sample, dan antarmuka grafis yang intuitif. SDK ini dapat didownload secara gratis di Microsoft Download Center. Code Protector SDK akan dimasukkan dalam Visual Studio code-named &#8220;Orcas:.</li>
<li><strong>Software Licensing and Protection Server.</strong><br />
ISV dapat mengelola license server, membuat license produknya untuk partner mereka. SLP tersedia dalam edisi standard dan enterprise.</li>
<li><strong>SLP Online Service.</strong><br />
Partner dapat mengelola license tanpa memiliki server sendiri. Mulai Oktober ini, semua pelanggan MSDN Premium mendapatkan SLP Online Service Basic edition secara gratis.</li>
</ol>
<p>Bagaimana cara kerja teknologi ini? Simak selengkapnya di sini:<br />
<a href="http://www.microsoft.com/presspass/features/2007/jul07/07-10slpservices.mspx?rss_fdn=Top%20Stories">Microsoft Announces SLP Services to Streamline Software Development and Sales<br />
</a><br />
Baca juga:<br />
<a href="http://blogs.zdnet.com/microsoft/?p=575">Mary Jo Foley: Microsoft to offer code protection, validation to other software developers</a><br />
<a href="http://www.securelm.net/">Microsoft Software Licensing &amp; Protection Services, SecureLM</a><br />
<a href="http://www.softwarepotential.com/">Microsoft Software Licensing and Protection Services - Building a Bridge Between Software and Software Business</a></p>
<p>Technorati Tags: <a href="http://technorati.com/tag/Anti-piracy" class="performancingtags" rel="tag">Anti-piracy</a>, <a href="http://technorati.com/tag/WGA" class="performancingtags" rel="tag">WGA</a>, <a href="http://technorati.com/tag/OGA" class="performancingtags" rel="tag">OGA</a>, <a href="http://technorati.com/tag/Activation" class="performancingtags" rel="tag">Activation</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ebonk.org/delphi/2007/07/16/teknologi-anti-piracy-dari-microsoft/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Dokumentasi VCL for PHP</title>
		<link>http://www.ebonk.org/delphi/2007/03/28/dokumentasi-vcl-for-php/</link>
		<comments>http://www.ebonk.org/delphi/2007/03/28/dokumentasi-vcl-for-php/#comments</comments>
		<pubDate>Wed, 28 Mar 2007 14:45:34 +0000</pubDate>
		<dc:creator>ebonk</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[delphi for php]]></category>

		<guid isPermaLink="false">http://www.ebonk.org/delphi/2007/03/28/dokumentasi-vcl-for-php.html</guid>
		<description><![CDATA[Delphi for PHP kini memiliki dokumentasi online yang bisa dikunjungi di sini:
 VCL for PHP documentation
Untuk mendownload Delphi for PHP Trial version, silakan klik link berikut:
Download Delphi for PHP Trial
Technorati Tags: delphi-for-php
Powered by ScribeFire.
]]></description>
			<content:encoded><![CDATA[<p>Delphi for PHP kini memiliki dokumentasi online yang bisa dikunjungi di sini:</p>
<p> <a href="http://vcl4php.sourceforge.net/vcldoc/li_VCL.html">VCL for PHP documentation</a></p>
<p>Untuk mendownload Delphi for PHP Trial version, silakan klik link berikut:</p>
<p><a href="http://www.codegear.com/Downloads/TrialandFreeVersions/Delphi/DelphiforPHP/tabid/250/Default.aspx">Download Delphi for PHP Trial</a></p>
<p>Technorati Tags: <a class="performancingtags" href="http://technorati.com/tag/delphi-for-php" rel="tag">delphi-for-php</a></p>
<p class="poweredbyperformancing">Powered by <a href="http://scribefire.com/">ScribeFire</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ebonk.org/delphi/2007/03/28/dokumentasi-vcl-for-php/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Vista patch untuk Delphi 7</title>
		<link>http://www.ebonk.org/delphi/2007/03/28/vista-patch-untuk-delphi-7/</link>
		<comments>http://www.ebonk.org/delphi/2007/03/28/vista-patch-untuk-delphi-7/#comments</comments>
		<pubDate>Wed, 28 Mar 2007 13:53:10 +0000</pubDate>
		<dc:creator>ebonk</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[delphi]]></category>

		<category><![CDATA[vista]]></category>

		<guid isPermaLink="false">http://www.ebonk.org/delphi/2007/03/28/vista-patch-untuk-delphi-7.html</guid>
		<description><![CDATA[Barusan baca blognya Brian Layman, The Code Cave, Microsoft Releases a Vista patch for Delphi 7 Uninstall process.
Saya belum pernah mencoba uninstall Delphi 7 maupun Delphi 2007 dari Windows Vista.
Jika Anda mendapatkan pesan kesalahan berikut ini:
The device is not working properly because Windows cannot load the drivers required for this device (Code 31).
A driver for [...]]]></description>
			<content:encoded><![CDATA[<p>Barusan baca blognya Brian Layman, <a href="http://www.thecodecave.com/">The Code Cave</a>, <a href="http://www.thecodecave.com/article356">Microsoft Releases a Vista patch for Delphi 7 Uninstall process.</a></p>
<p>Saya belum pernah mencoba uninstall Delphi 7 maupun Delphi 2007 dari Windows Vista.</p>
<p>Jika Anda mendapatkan pesan kesalahan berikut ini:</p>
<blockquote><p>The device is not working properly because Windows cannot load the drivers required for this device (Code 31).</p></blockquote>
<blockquote><p>A driver for this device was not required, and has been disabled (Code 32 or Code 31).</p></blockquote>
<blockquote><p>Your registry might be corrupted. (Code 19)</p></blockquote>
<blockquote><p>Windows successfully loaded the device driver for this hardware but cannot find the hardware device. (Code 41)</p></blockquote>
<p>Sebaiknya Anda memasang patch untuk Windows Vista di sini:<br />
<a href="http://support.microsoft.com/default.aspx/kb/932246">http://support.microsoft.com/default.aspx/kb/932246</a></p>
<p>Technorati Tags: <a href="http://technorati.com/tag/delphi" class="performancingtags" rel="tag">delphi</a></p>
<p class="poweredbyperformancing">Powered by <a href="http://scribefire.com/">ScribeFire</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ebonk.org/delphi/2007/03/28/vista-patch-untuk-delphi-7/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Delphi 2007 for Win32</title>
		<link>http://www.ebonk.org/delphi/2007/03/21/delphi-2007-for-win32/</link>
		<comments>http://www.ebonk.org/delphi/2007/03/21/delphi-2007-for-win32/#comments</comments>
		<pubDate>Thu, 01 Jan 1970 07:00:00 +0000</pubDate>
		<dc:creator>ebonk</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[borland]]></category>

		<category><![CDATA[codegear]]></category>

		<category><![CDATA[delphi 2007]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Delphi 2007 for Win32, Windows Vista]]></description>
			<content:encoded><![CDATA[<p>Codegear from Borland mengumumkan bahwa Delphi 2007 for Win32 telah tersedia. Edisi Delphi terbaru ini mendukung pengembangan aplikasi untuk Microsoft Windows Vista dan AJAX.</p>
<p><a href="http://codegear.com/AboutUs/News/DelphiForWin32NowAvailable/tabid/249/Default.aspx"><span id="dnn_ctr869_dnnTITLE_lblTitle" class="Head">CodeGearâ„¢ Announces General Availability of DelphiÂ® 2007 for Windows Vistaâ„¢ and AJAX</span></a></p>
<p>Delphi 2007 for Win32 tersedia dalam bahasa Inggris, Jerman, Jepang dan Prancis dan dilepas dengan harga $899 untuk versi Professional, dan $1999 untuk versi Enterprise.</p>
<p>Informasi lengkapnya bisa dilihat di situs resmi Codegear.</p>
<p><a href="http://www.codegear.com/products/delphiwin32">http://www.codegear.com/products/delphiwin32.</a></p>
<p>Technorati Tags: <a href="http://technorati.com/tag/delphi" class="performancingtags" rel="tag">delphi</a>, <a href="http://technorati.com/tag/codegear" class="performancingtags" rel="tag">codegear</a>, <a href="http://technorati.com/tag/borland" class="performancingtags" rel="tag">borland</a><br />
<!--adsense#bawah--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ebonk.org/delphi/2007/03/21/delphi-2007-for-win32/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
