<?xml version="1.0"?>
<rss version="2.0">
    <channel>
        <title>OpenRCE: Blog</title>
        <link>http://www.openrce.org/rss/feeds/blog</link>
        <description>OpenRCE: The Open Reverse Code Engineering Community</description>
                <item>
            <title>HASP HL Envelope IAT Fixer</title>
                            <pubDate>Sun, 09 Nov 2008 22:36:56 -0600</pubDate>
                                        <link>https://www.openrce.org/blog/view/1304/HASP_HL_Envelope_IAT_Fixer</link>
                                        <author>mfeng &lt;email-suppressed@example.com&gt;</author>
                                                    <description>/*************************************************&lt;br /&gt;
HASP HL Envelope IAT Fixer&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &lt;br /&gt;
Author: mfeng&lt;br /&gt;
Email: mfengol@gmail.com&lt;br /&gt;
Homepage: hvaonline.net&lt;br /&gt;
&lt;br /&gt;
History:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+ v0.0.1: November 08, 2008.&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &lt;br /&gt;
Tools: WinXP SP2, OllyICE, OllyDbg Script 1.64.3&lt;br /&gt;
Notes:&lt;br /&gt;
 - Use this script after stop at OEP.&lt;br /&gt;
 - Some emulated functions need to be resolved manually:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GetCommandLineA&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GetProcAddress&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GetCurrentProcess&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GetStartupInfoA&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GetCurrentProcessId&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GetCurrentThreadId&lt;br /&gt;
**************************************************/&lt;br /&gt;
&lt;br /&gt;
var saveEIP&lt;br /&gt;
var modulebase&lt;br /&gt;
var addrGetTickCount&lt;br /&gt;
var numCallGTC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
var iatStart&lt;br /&gt;
var iatSize&lt;br /&gt;
var iatEnd&lt;br /&gt;
var iatEntry&lt;br /&gt;
var addrBP&lt;br /&gt;
var addrAPIEntry&lt;br /&gt;
var protectSectionBase&lt;br /&gt;
var addr&lt;br /&gt;
var opcode&lt;br /&gt;
&lt;br /&gt;
mov saveEIP, eip&lt;br /&gt;
&lt;br /&gt;
gpa &amp;quot;GetTickCount&amp;quot;, &amp;quot;kernel32.dll&amp;quot;&lt;br /&gt;
mov addrGetTickCount, $RESULT&lt;br /&gt;
&lt;br /&gt;
gmi eip, MODULEBASE&lt;br /&gt;
mov modulebase, $RESULT&lt;br /&gt;
&lt;br /&gt;
ask &amp;quot;Enter RVA of IAT&amp;quot;&lt;br /&gt;
cmp $RESULT, 0&lt;br /&gt;
je @exit&lt;br /&gt;
mov iatStart, $RESULT&lt;br /&gt;
add iatStart, modulebase&lt;br /&gt;
&lt;br /&gt;
ask &amp;quot;IAT Size&amp;quot;&lt;br /&gt;
cmp $RESULT, 0&lt;br /&gt;
je @exit&lt;br /&gt;
mov iatSize, $RESULT&lt;br /&gt;
&lt;br /&gt;
ask &amp;quot;Start address of `.protect` section&amp;quot;&lt;br /&gt;
cmp $RESULT, 0&lt;br /&gt;
je @exit&lt;br /&gt;
mov protectSectionBase, $RESULT&lt;br /&gt;
&lt;br /&gt;
find protectSectionBase, #668BC087D387DA558BEC#&lt;br /&gt;
cmp&amp;nbsp;&amp;nbsp;$RESULT, 0&lt;br /&gt;
je @signature_not_found&lt;br /&gt;
mov addrAPIEntry, $RESULT&lt;br /&gt;
mov addrBP, addrAPIEntry&lt;br /&gt;
sub addrBP, 20&lt;br /&gt;
mov opcode, [addrBP]&lt;br /&gt;
and opcode, FFFF&lt;br /&gt;
cmp opcode, C35D&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// POP EBP, RETN opcodes&lt;br /&gt;
jne @signature_not_found&lt;br /&gt;
inc addrBP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // point to retn opcode&lt;br /&gt;
&lt;br /&gt;
log addrBP&lt;br /&gt;
log addrAPIEntry&lt;br /&gt;
&lt;br /&gt;
mov iatEnd, iatStart&lt;br /&gt;
add iatEnd, iatSize&lt;br /&gt;
&lt;br /&gt;
mov iatEntry, iatStart&lt;br /&gt;
&lt;br /&gt;
@search:&lt;br /&gt;
cmp iatEntry, iatEnd&lt;br /&gt;
jae @exit&lt;br /&gt;
cmp [iatEntry], 00000000&lt;br /&gt;
je @next&lt;br /&gt;
&lt;br /&gt;
mov addr, [iatEntry]&lt;br /&gt;
mov opcode, [addr]&lt;br /&gt;
and opcode, 0FF&lt;br /&gt;
cmp opcode, E8&lt;br /&gt;
jne @next&lt;br /&gt;
&lt;br /&gt;
inc addr&lt;br /&gt;
mov offset, [addr]&lt;br /&gt;
add offset, addr&lt;br /&gt;
add offset, 4&lt;br /&gt;
cmp offset, addrAPIEntry&lt;br /&gt;
jne @next&lt;br /&gt;
&lt;br /&gt;
bphws addrBP, &amp;quot;x&amp;quot;&lt;br /&gt;
mov eip, [iatEntry]&lt;br /&gt;
&lt;br /&gt;
mov numCallGTC, 0&lt;br /&gt;
@run:&lt;br /&gt;
run&lt;br /&gt;
sti&lt;br /&gt;
cmp numCallGTC, 1&lt;br /&gt;
je @fix&lt;br /&gt;
cmp eip, addrGetTickCount&lt;br /&gt;
jne @next&lt;br /&gt;
inc numCallGTC&lt;br /&gt;
jmp @run&lt;br /&gt;
&lt;br /&gt;
@fix:&lt;br /&gt;
mov numCallGTC, 0&lt;br /&gt;
eval &amp;quot;[{iatEntry}] &amp;lt;- {eip}&amp;quot;&lt;br /&gt;
log $RESULT&lt;br /&gt;
mov [iatEntry], eip&lt;br /&gt;
&lt;br /&gt;
@next:&lt;br /&gt;
bphwc addrBP&lt;br /&gt;
add iatEntry, 4&lt;br /&gt;
jmp @search&lt;br /&gt;
&lt;br /&gt;
@signature_not_found:&lt;br /&gt;
msg &amp;quot;Signature's not found!&amp;quot;&lt;br /&gt;
jmp @exit&lt;br /&gt;
&lt;br /&gt;
@exit:&lt;br /&gt;
bphwc&lt;br /&gt;
mov eip, saveEIP&lt;br /&gt;
an eip&lt;br /&gt;
pause&lt;br /&gt;
ret&lt;br /&gt;
</description>
                    </item>
            </channel>
</rss>
