154
"[Console]"
FF0000
1
155
"Fetch UE3 Pointers/Addresses"
Auto Assembler Script
[ENABLE]
aobscanmodule( GObjects_AOB, ShippingPC-BmGame.exe, A1????????8B????8B????2500020000 )
label( GObjects )
registersymbol( GObjects )
[GObjects_AOB+1]:
GObjects:
aobscanmodule( GNames_AOB, ShippingPC-BmGame.exe, 8B0D????????833C810074 )
label( GNames )
registersymbol( GNames )
[GNames_AOB+2]:
GNames:
aobscanmodule( ProcessEvent_AOB, ShippingPC-BmGame.exe, 895DEC8B4B0C8B7D0883E10233C00BC1 )
label( ProcessEvent )
registersymbol( ProcessEvent )
ProcessEvent_AOB-2D:
ProcessEvent:
[DISABLE]
unregistersymbol( ProcessEvent )
unregistersymbol( GNames )
unregistersymbol( GObjects )
186
"Enable Console"
Auto Assembler Script
[ENABLE]
alloc( oConsole, 64, ShippingPC-BmGame.exe )
label( back )
oConsole:
mov ecx,[esi+24]
cmp [esp+60],C0
jne @f
push eax
push ecx
mov eax,[ebp]
lea ecx,[ecx+24] // get Console in RGFxGameViewportClient UObject
mov ecx,[ecx]
mov [ecx+7C],eax
mov eax,[ebp+28]
mov [ecx+84],eax
pop ecx
pop eax
@@:
test ecx,ecx
jmp back
// ShippingPC-BmGame.exe+ABDEE2 - 8B 4E 24 - mov ecx,[esi+24]
// ShippingPC-BmGame.exe+ABDEE5 - 85 C9 - test ecx,ecx
ShippingPC-BmGame.exe+ABDEE2:
jmp oConsole
back:
[DISABLE]
ShippingPC-BmGame.exe+ABDEE2:
mov ecx,[esi+24]
test ecx,ecx
dealloc( oConsole )
179
"Set Hook & Emulate RCheatManager UObject"
Auto Assembler Script
[ENABLE]
alloc( pCave, 1024, ShippingPC-BmGame.exe )
alloc( pObject, 64, ShippingPC-BmGame.exe )
registersymbol( pObject )
label( back )
label( szNull )
label( szRCheatManager )
label( szDefault_RCheatManager )
label( pStore )
label( pRPlayerControllerCombat )
registersymbol( pRPlayerControllerCombat )
label( szName )
label( pCave_loop )
label( pCave_next )
label( pCave_continue )
label( pCave_exit )
label( GetFullName_0 )
label( GetFullName_00 )
label( GetFullName_NULL_0 )
label( szFunctionName_0 )
pCave+500:
szNull:
db '(null)',0
pCave+520:
szRCheatManager:
db 'Class BmGame.RCheatManager',0
pCave+5C0:
szDefault_RCheatManager:
db 'RCheatManager BmGame.Default__RCheatManager',0
pStore:
dd 0
pRPlayerControllerCombat:
dd 0
szName:
db 0
pCave+700:
szFunctionName_0:
dd 0
pObject+8:
db 00 00 10 00
pCave:
mov [pRPlayerControllerCombat],eax
mov [pObject+1C],eax
push ebp
mov ebp,esp
pushad
mov eax,GObjects
xor esi,esi
cmp [eax+4],esi
jbe pCave_exit
pCave_loop:
mov ecx,[eax]
lea ecx,[ecx+esi*4]
cmp [ecx],0
je pCave_continue
mov edi,[ecx]
call GetFullName_0
mov [pStore],eax
push [pStore]
push szRCheatManager
call lstrcmpA
test eax,eax
jne short @f
mov [pObject+28],edi
jmp short pCave_next
@@:
push [pStore]
push szDefault_RCheatManager
call lstrcmpA
test eax,eax
jne short @f
mov eax,[edi]
mov [pObject],eax
@@:
pCave_next:
mov eax,GObjects
pCave_continue:
inc esi
cmp esi,[eax+4]
jb pCave_loop
mov eax,[pRPlayerControllerCombat]
mov [eax+47C],pObject
pCave_exit:
popad
mov esp,ebp
pop ebp
mov [esp+74],FFFFFFFF // original code
jmp back
db CC CC
//*********************************
//******** GetFullName ********
//*********************************
GetFullName_0:
mov eax,[edi+28] // Class
test eax,eax
je GetFullName_NULL_0
mov ecx,[edi+1C] // Outer
test ecx,ecx
je GetFullName_NULL_0
cmp [ecx+1C],0 // Outer->Outer
je GetFullName_00
mov ebx,szFunctionName_0
mov ecx,GNames // GNames pointer
mov eax,[eax+20] // FName_Index
mov edx,[ecx]
mov eax,[edx+eax*4]
add eax,10 // Class->GetName
@@:
cmp byte ptr [eax],0
je short @f
mov dl,[eax]
mov [ebx],dl
inc ebx
inc eax
jmp short @b
@@:
mov byte ptr [ebx],20 // space character
inc ebx
mov ecx,[edi+1C] // Outer
mov edx,[ecx+1C] // Outer->Outer
mov eax,[edx+20] // FName_Index
mov ecx,GNames // GNames pointer
mov edx,[ecx]
mov eax,[edx+eax*4]
add eax,10 // Outer->Outer->GetName
@@:
cmp byte ptr [eax],0
je short @f
mov dl,[eax]
mov [ebx],dl
inc ebx
inc eax
jmp short @b
@@:
mov byte ptr [ebx],2E // . character
inc ebx
mov ecx,[edi+1C] // Outer
mov edx,[ecx+20] // FName_Index
mov eax,GNames // GNames pointer
mov ecx,[eax]
mov edx,[ecx+edx*4]
add edx,10 // Outer->GetName
@@:
cmp byte ptr [edx],0
je short @f
mov al,[edx]
mov [ebx],al
inc ebx
inc edx
jmp short @b
@@:
mov byte ptr [ebx],2E // . character
inc ebx
mov ecx,GNames // GNames pointer
mov edx,[ecx]
mov eax,[edi+20] // this - FName_Index
mov eax,[edx+eax*4]
add eax,10 // this->GetName
@@:
cmp byte ptr [eax],0
je short @f
mov dl,[eax]
mov [ebx],dl
inc ebx
inc eax
jmp short @b
@@:
mov byte ptr [ebx],0
mov eax,szFunctionName_0
ret
GetFullName_00:
mov ebx,szFunctionName_0
mov edx,GNames // GNames pointer
mov ecx,[eax+20] // FName_Index
mov eax,[edx]
mov ecx,[eax+ecx*4]
add ecx,10 // Class->GetName
@@:
cmp byte ptr [ecx],0
je short @f
mov al,[ecx]
mov [ebx],al
inc ebx
inc ecx
jmp short @b
@@:
mov byte ptr [ebx],20 // space character
inc ebx
mov edx,[edi+1C] // Outer
mov eax,[edx+20] // FName_Index
mov ecx,GNames // GNames pointer
mov edx,[ecx]
mov eax,[edx+eax*4]
add eax,10 // Outer->GetName
@@:
cmp byte ptr [eax],0
je short @f
mov cl,[eax]
mov [ebx],cl
inc ebx
inc eax
jmp short @b
@@:
mov byte ptr [ebx],2E // . character
inc ebx
mov edx,GNames // GNames pointer
mov eax,[edx]
mov ecx,[edi+20] // this - FName_Index
mov ecx,[eax+ecx*4]
add ecx,10 // this->GetName
@@:
cmp byte ptr [ecx],0
je short @f
mov al,[ecx]
mov [ebx],al
inc ebx
inc ecx
jmp short @b
@@:
mov byte ptr [ebx],0
mov eax,szFunctionName_0
ret
GetFullName_NULL_0:
mov eax,szNull
ret
// ShippingPC-BmGame.exe+49A78D - C7 44 24 74 FFFFFFFF - mov [esp+74],FFFFFFFF
ShippingPC-BmGame.exe+49A78D:
jmp pCave
db 90 90 90
back:
[DISABLE]
[pRPlayerControllerCombat]+47C:
dd 0
ShippingPC-BmGame.exe+49A78D:
mov [esp+74],FFFFFFFF
unregistersymbol( pRPlayerControllerCombat )
unregistersymbol( pObject )
dealloc( pObject )
dealloc( pCave )
159
"GNames & GObjects Dumper (ASCII)"
Auto Assembler Script
[ENABLE]
alloc( DumpHandlerThread, 1024, ShippingPC-BmGame.exe )
registersymbol( DumpHandlerThread )
CreateThread( DumpHandlerThread )
alloc( DumpHandlerOff, 4, ShippingPC-BmGame.exe )
registersymbol( DumpHandlerOff )
label( ExitDumpHandler )
label( szWrite )
label( szNamesFile )
label( szObjectsFile )
label( szNamesFormat )
label( szObjectsFormat )
label( szInvalid )
label( szNull )
label( szFormat )
label( szSeparator )
label( szBuffer )
label( szFunctionName )
label( szOutputDebug )
label( DumpNames )
label( DumpNames_loop )
label( DumpNames_exit )
label( DumpObjects )
label( DumpObjects_loop )
label( DumpObjects_exit )
label( GetName )
label( GetObject )
label( FindObject )
label( FindObject_0 )
label( FindObject_1 )
label( FindObject_exit )
label( GetFullName )
label( GetFullName_0 )
label( GetFullName_NULL )
label( OutputDebug )
DumpHandlerOff:
dd 0
DumpHandlerThread+500:
szWrite:
db 'w+',0
szNamesFile:
db 'NamesDump.txt',0
szObjectsFile:
db 'ObjectsDump.txt',0
szNamesFormat:
db 'Name[%06i] %s',0A,0
szObjectsFormat:
db 'UObject[%06i] %-50s 0x%08X ( %-50s )',0A,0
szInvalid:
db 'INVALID NAME INDEX',0
szNull:
db '(null)',0
szFormat:
db '0x%08X',0
szSeparator:
db ' | ',0
szBuffer:
dd 0
dd 0
dd 0
szFunctionName:
dd 0
DumpHandlerThread+600:
szOutputDebug:
dd 0
DumpHandlerThread:
push 0A
call kernel32.Sleep
cmp [DumpHandlerOff],1
je ExitDumpHandler
push 6F //VK_NUMPAD /
call GetAsyncKeyState
test ax,ax
jne @f
jmp DumpHandlerThread
@@:
call DumpNames
call DumpObjects
push C8
call kernel32.Sleep
jmp DumpHandlerThread
// ***************
// ** DumpNames **
// ***************
DumpNames:
push ebp
mov ebp,esp
push ecx
and [ebp-4],0
push esi
push szWrite // "w+"
lea eax,[ebp-4]
push szNamesFile // "NamesDump.txt"
push eax
call msvcr80.fopen_s
mov eax,GNames
xor esi,esi
add esp,C
cmp [eax+4],esi
jbe DumpNames_exit
DumpNames_loop:
mov ecx,[eax]
lea ecx,[ecx+esi*4]
cmp [ecx],0
je short @f
mov eax,[ecx]
add eax,10
push eax
push esi
push szNamesFormat // "Name[%06i] %s\0A\00"
push [ebp-4]
call msvcr80.fprintf
mov eax,GNames
add esp,10
@@:
inc esi
cmp esi,[eax+4]
jb DumpNames_loop
DumpNames_exit:
push [ebp-4]
call msvcr80.fclose
pop ecx
pop esi
mov esp,ebp
pop ebp
ret
db CC CC
// *****************
// ** DumpObjects **
// *****************
DumpObjects:
push ebp
mov ebp,esp
push ecx
and [ebp-4],0
push esi
push szWrite // "w+"
lea eax,[ebp-4]
push szObjectsFile // "ObjectsDump.txt"
push eax
call msvcr80.fopen_s
mov eax,GObjects
xor esi,esi
add esp,C
cmp [eax+4],esi
jbe DumpObjects_exit
DumpObjects_loop:
mov ecx,[eax]
lea ecx,[ecx+esi*4]
cmp [ecx],0
je short @f
push 0
push 0
mov eax,[ecx]
mov [esp],eax
call GetObject
mov [esp+4],eax
mov eax,[esp]
call GetName
push eax
push esi
push szObjectsFormat // "UObject[%06i] %-50s 0x%08X (%-50s)\0A\00"
push [ebp-4]
call msvcr80.fprintf
mov eax,GObjects
add esp,18
@@:
inc esi
cmp esi,[eax+4]
jb DumpObjects_loop
DumpObjects_exit:
push [ebp-4]
call msvcr80.fclose
mov esp,ebp
pop ebp
ret
db CC CC
// *************
// ** GetName **
// *************
GetName:
mov ecx,[eax+20]
mov eax,GNames
mov edx,[eax+4]
cmp ecx,edx
ja short @f
mov eax,[eax]
mov eax,[eax+ecx*4]
add eax,10
ret
@@:
mov eax,szInvalid // "INVALID NAME INDEX"
ret
db CC CC
// ***************
// ** GetObject **
// ***************
GetObject:
mov edi,eax
test edi,edi
je short @f
mov eax,[edi+28]
test eax,eax
je short @f
call GetFullName
ret
@@:
mov eax,szInvalid // "INVALID NAME INDEX"
ret
db CC CC
// ****************
// ** FindObject **
// ****************
FindObject:
push ebp
mov ebp,esp
mov ecx,GObjects
push esi
push edi
xor esi,esi
cmp [ecx+4],esi
jle FindObject_exit
FindObject_0:
mov eax,[ecx]
mov edi,[eax+esi*4]
test edi,edi
je short @f
mov eax,[edi+28]
test eax,eax
je short @f
push [ebp+8]
call GetFullName
push eax
call msvcr80.stricmp
add esp,8
test eax,eax
je FindObject_1
mov ecx,GObjects
@@:
inc esi
cmp esi,[ecx+4]
jl FindObject_0
FindObject_exit:
pop edi
pop esi
mov esp,ebp
pop ebp
ret 4
FindObject_1:
mov eax,edi
pop edi
pop esi
mov esp,ebp
pop ebp
ret 4
db CC CC
//*********************************
//******** GetFullName ********
//*********************************
GetFullName:
mov eax,[edi+28] // Class
test eax,eax
je GetFullName_NULL
mov ecx,[edi+1C] // Outer
test ecx,ecx
je GetFullName_NULL
cmp [ecx+1C],0 // Outer->Outer
je GetFullName_0
mov ebx,szFunctionName
mov ecx,GNames // GNames pointer
mov eax,[eax+20] // FName_Index
mov edx,[ecx]
mov eax,[edx+eax*4]
add eax,10 // Class->GetName
@@:
cmp byte ptr [eax],0
je short @f
mov dl,[eax]
mov [ebx],dl
inc ebx
inc eax
jmp short @b
@@:
mov byte ptr [ebx],20 // space character
inc ebx
mov ecx,[edi+1C] // Outer
mov edx,[ecx+1C] // Outer->Outer
mov eax,[edx+20] // FName_Index
mov ecx,GNames // GNames pointer
mov edx,[ecx]
mov eax,[edx+eax*4]
add eax,10 // Outer->Outer->GetName
@@:
cmp byte ptr [eax],0
je short @f
mov dl,[eax]
mov [ebx],dl
inc ebx
inc eax
jmp short @b
@@:
mov byte ptr [ebx],2E // . character
inc ebx
mov ecx,[edi+1C] // Outer
mov edx,[ecx+20] // FName_Index
mov eax,GNames // GNames pointer
mov ecx,[eax]
mov edx,[ecx+edx*4]
add edx,10 // Outer->GetName
@@:
cmp byte ptr [edx],0
je short @f
mov al,[edx]
mov [ebx],al
inc ebx
inc edx
jmp short @b
@@:
mov byte ptr [ebx],2E // . character
inc ebx
mov ecx,GNames // GNames pointer
mov edx,[ecx]
mov eax,[edi+20] // this - FName_Index
mov eax,[edx+eax*4]
add eax,10 // this->GetName
@@:
cmp byte ptr [eax],0
je short @f
mov dl,[eax]
mov [ebx],dl
inc ebx
inc eax
jmp short @b
@@:
mov byte ptr [ebx],0
mov eax,szFunctionName
ret
GetFullName_0:
mov ebx,szFunctionName
mov edx,GNames // GNames pointer
mov ecx,[eax+20] // FName_Index
mov eax,[edx]
mov ecx,[eax+ecx*4]
add ecx,10 // Class->GetName
@@:
cmp byte ptr [ecx],0
je short @f
mov al,[ecx]
mov [ebx],al
inc ebx
inc ecx
jmp short @b
@@:
mov byte ptr [ebx],20 // space character
inc ebx
mov edx,[edi+1C] // Outer
mov eax,[edx+20] // FName_Index
mov ecx,GNames // GNames pointer
mov edx,[ecx]
mov eax,[edx+eax*4]
add eax,10 // Outer->GetName
@@:
cmp byte ptr [eax],0
je short @f
mov cl,[eax]
mov [ebx],cl
inc ebx
inc eax
jmp short @b
@@:
mov byte ptr [ebx],2E // . character
inc ebx
mov edx,GNames // GNames pointer
mov eax,[edx]
mov ecx,[edi+20] // this - FName_Index
mov ecx,[eax+ecx*4]
add ecx,10 // this->GetName
@@:
cmp byte ptr [ecx],0
je short @f
mov al,[ecx]
mov [ebx],al
inc ebx
inc ecx
jmp short @b
@@:
mov byte ptr [ebx],0
mov eax,szFunctionName
ret
GetFullName_NULL:
mov eax,szNull
ret
db CC CC
//*********************
//** OutputDebug **
//*********************
OutputDebug:
push ebp
mov ebp,esp
mov eax,szOutputDebug
mov ecx,ebx
@@:
cmp byte ptr [ecx],0
je short @f
mov dl,[ecx]
mov [eax],dl
inc ecx
inc eax
jmp short @b
@@:
mov byte ptr [eax],0
push szSeparator
push szOutputDebug
call lstrcatA
push [ebp+8]
push szFormat
push szBuffer
call wsprintfA
add esp,C
push szBuffer
push szOutputDebug
call lstrcatA
push szOutputDebug
call OutputDebugStringA
mov esp,ebp
pop ebp
ret 4
ExitDumpHandler:
mov [DumpHandlerOff],2
ret
[DISABLE]
{$lua}
if( syntaxcheck == false ) then --actual execution
local starttime = getTickCount()
if readInteger( "DumpHandlerOff" ) == 0 then --could be 2 already
writeInteger( "DumpHandlerOff", 1 ) --tell the thread to kill itself
end
while( getTickCount() < starttime + 1000 ) and ( readInteger( "DumpHandlerOff" ) ~= 2 ) do --wait till it has finished
sleep( 20 )
end
if( getTickCount() > starttime + 1000 ) then --could happen when the window is shown
showMessage( 'Disabling the thread failed!' )
error( 'Thread disabling failed!' )
end
sleep( 1 )
end
{$asm}
unregistersymbol( DumpHandlerOff )
dealloc( DumpHandlerOff )
unregistersymbol( DumpHandlerThread )
dealloc( DumpHandlerThread )
153
"[Debug]"
C0C0C0
1
149
"GetUE3Components"
Auto Assembler Script
[ENABLE]
aobscan( GObjects_AOB, A1????????8B????8B????2500020000 )
label( GObjects )
registersymbol( GObjects )
[GObjects_AOB+1]:
GObjects:
aobscan( GNames_AOB, 8B0D????????833C810074 )
label( GNames )
registersymbol( GNames )
[GNames_AOB+2]:
GNames:
aobscan( ProcessEvent_AOB, 895DEC8B4B0C8B7D0883E10233C00BC1 )
label( ProcessEvent )
registersymbol( ProcessEvent )
ProcessEvent_AOB-2D:
ProcessEvent:
[DISABLE]
unregistersymbol( ProcessEvent )
unregistersymbol( GNames )
unregistersymbol( GObjects )
150
"GNames"
1
4 Bytes
GNames
152
"GObjects"
1
4 Bytes
GObjects
151
"ProcessEvent"
1
4 Bytes
ProcessEvent
148
"Dump GNames & GObjects"
Auto Assembler Script
[ENABLE]
alloc( KeyHandlerThread, 4096 )
registersymbol( KeyHandlerThread )
CreateThread( KeyHandlerThread )
label( KeyHandlerOff )
registersymbol( KeyHandlerOff )
label( ExitKeyHandler )
label( szWrite )
label( szNamesFile )
label( szObjectsFile )
label( szNamesFormat )
label( szObjectsFormat )
label( szInvalid )
label( Dump )
label( Dump_exit )
label( DumpNames )
label( DumpNames_0 )
label( DumpNames_1 )
label( DumpNames_exit )
label( DumpObjects )
label( DumpObjects_0 )
label( DumpObjects_1 )
label( DumpObjects_exit )
label( GetName )
label( err )
label( GetObject )
registersymbol( GetObject )
label( GetObject_exit )
label( GetObject_err )
label( GetFullName )
registersymbol( GetFullName )
label( GetFullName_0 )
label( GetFullName_NULL )
label( GetFullName_loop_a )
label( GetFullName_next_b )
label( GetFullName_loop_b )
label( GetFullName_next_c )
label( GetFullName_loop_c )
label( GetFullName_next_d )
label( GetFullName_loop_d )
label( GetFullName_next_e )
label( GetFullName_loop_f )
label( GetFullName_next_g )
label( GetFullName_loop_g )
label( GetFullName_next_h )
label( GetFullName_loop_h )
label( GetFullName_next_i )
label( szNull )
label( szFunctionName )
label( FindObject )
registersymbol( FindObject )
label( FindObject_0 )
label( FindObject_1 )
label( FindObject_2 )
label( FindObject_exit )
label( OutputDebug )
registersymbol( OutputDebug )
label( szOutputDebug )
label( OutputDebug_0 )
label( OutputDebug_1 )
label( szFormat )
label( szSeparator )
label( szBuffer )
KeyHandlerThread+500:
KeyHandlerOff:
dd 0
szWrite:
db 'w+',0
szNamesFile:
db 'NamesDump.txt',0
szObjectsFile:
db 'ObjectsDump.txt',0
szNamesFormat:
db 'Name[%06i] %s',0A,0
szObjectsFormat:
db 'UObject[%06i] %-50s 0x%08X ( %-50s )',0A,0
szInvalid:
db 'INVALID NAME INDEX',0
szNull:
db '(null)',0
szFormat:
db '0x%08X',0
szSeparator:
db ' | ',0
szBuffer:
dd 0
dd 0
dd 0
szFunctionName:
dd 0
KeyHandlerThread+600:
szOutputDebug:
dd 0
KeyHandlerThread:
push 0a
call kernel32.Sleep
cmp [KeyHandlerOff],1
je ExitKeyHandler
push 6F //VK_NUMPAD /
call GetAsyncKeyState
test ax,ax
jne Dump
jmp KeyHandlerThread
Dump:
call DumpNames
call DumpObjects
Dump_exit:
push C8
call kernel32.Sleep
jmp KeyHandlerThread
// ***************
// ** DumpNames **
// ***************
DumpNames:
push ebp
mov ebp,esp
push ecx
and [ebp-4],0
push esi
push szWrite // "w+"
lea eax,[ebp-4]
push szNamesFile // "NamesDump.txt"
push eax
call msvcr80.fopen_s
mov eax,GNames
xor esi,esi
add esp,C
cmp [eax+4],esi
jbe DumpNames_exit
DumpNames_0:
mov ecx,[eax]
lea ecx,[ecx+esi*4]
cmp [ecx],0
je DumpNames_1
mov eax,[ecx]
add eax,10
push eax
push esi
push szNamesFormat // "Name[%06i] %s\0A\00"
push [ebp-4]
call msvcr80.fprintf
mov eax,GNames
add esp,10
DumpNames_1:
inc esi
cmp esi,[eax+4]
jb DumpNames_0
DumpNames_exit:
push [ebp-4]
call msvcr80.fclose
pop ecx
pop esi
mov esp,ebp
pop ebp
ret
db CC CC
// *****************
// ** DumpObjects **
// *****************
DumpObjects:
push ebp
mov ebp,esp
push ecx
and [ebp-4],0
push esi
push szWrite // "w+"
lea eax,[ebp-4]
push szObjectsFile // "ObjectsDump.txt"
push eax
call msvcr80.fopen_s
mov eax,GObjects
xor esi,esi
add esp,C
cmp [eax+4],esi
jbe DumpObjects_exit
DumpObjects_0:
mov ecx,[eax]
lea ecx,[ecx+esi*4]
cmp [ecx],0
je DumpObjects_1
push 0
push 0
mov eax,[ecx]
mov [esp],eax
call GetObject
mov [esp+4],eax
mov eax,[esp]
call GetName
push eax
push esi
push szObjectsFormat // "UObject[%06i] %-50s 0x%08X (%-50s)\0A\00"
push [ebp-4]
call msvcr80.fprintf
mov eax,GObjects
add esp,18
DumpObjects_1:
inc esi
cmp esi,[eax+4]
jb DumpObjects_0
DumpObjects_exit:
push [ebp-4]
call msvcr80.fclose
mov esp,ebp
pop ebp
ret
db CC CC
// *************
// ** GetName **
// *************
GetName:
mov ecx,[eax+20]
mov eax,GNames
mov edx,[eax+4]
cmp ecx,edx
ja err
mov eax,[eax]
mov eax,[eax+ecx*4]
add eax,10
ret
err:
mov eax,szInvalid // "INVALID NAME INDEX"
ret
db CC CC
// ***************
// ** GetObject **
// ***************
GetObject:
mov edi,eax
test edi,edi
je GetObject_err
mov eax,[edi+28]
test eax,eax
je GetObject_err
call GetFullName
GetObject_exit:
ret
GetObject_err:
mov eax,szInvalid
ret
db CC CC
// ****************
// ** FindObject **
// ****************
FindObject:
push ebp
mov ebp,esp
mov ecx,GObjects
push esi
push edi
xor esi,esi
cmp [ecx+4],esi
jle FindObject_exit
FindObject_0:
mov eax,[ecx]
mov edi,[eax+esi*4]
test edi,edi
je FindObject_1
mov eax,[edi+28]
test eax,eax
je FindObject_1
push [ebp+8]
call GetFullName
push eax
call msvcr80.stricmp
add esp,8
test eax,eax
je FindObject_2
mov ecx,GObjects
FindObject_1:
inc esi
cmp esi,[ecx+4]
jl FindObject_0
FindObject_exit:
pop edi
pop esi
mov esp,ebp
pop ebp
ret 4
FindObject_2:
mov eax,edi
pop edi
pop esi
mov esp,ebp
pop ebp
ret 4
db CC CC
//*********************************
//******** GetFullName ********
//*********************************
GetFullName:
mov eax,[edi+28] // Class
test eax,eax
je GetFullName_NULL
mov ecx,[edi+1C] // Outer
test ecx,ecx
je GetFullName_NULL
cmp [ecx+1C],0 // Outer->Outer
je GetFullName_0
mov ebx,szFunctionName
mov ecx,GNames // GNames pointer
mov eax,[eax+20] // FName_Index
mov edx,[ecx]
mov eax,[edx+eax*4]
add eax,10 // Class->GetName
GetFullName_loop_a:
cmp byte ptr [eax],0
je GetFullName_next_b
mov dl,[eax]
mov [ebx],dl
inc ebx
inc eax
jmp GetFullName_loop_a
GetFullName_next_b:
mov byte ptr [ebx],20 // space character
inc ebx
mov ecx,[edi+1C] // Outer
mov edx,[ecx+1C] // Outer->Outer
mov eax,[edx+20] // FName_Index
mov ecx,GNames // GNames pointer
mov edx,[ecx]
mov eax,[edx+eax*4]
add eax,10 // Outer->Outer->GetName
GetFullName_loop_b:
cmp byte ptr [eax],0
je GetFullName_next_c
mov dl,[eax]
mov [ebx],dl
inc ebx
inc eax
jmp GetFullName_loop_b
GetFullName_next_c:
mov byte ptr [ebx],2E // . character
inc ebx
mov ecx,[edi+1C] // Outer
mov edx,[ecx+20] // FName_Index
mov eax,GNames // GNames pointer
mov ecx,[eax]
mov edx,[ecx+edx*4]
add edx,10 // Outer->GetName
GetFullName_loop_c:
cmp byte ptr [edx],0
je GetFullName_next_d
mov al,[edx]
mov [ebx],al
inc ebx
inc edx
jmp GetFullName_loop_c
GetFullName_next_d:
mov byte ptr [ebx],2E // . character
inc ebx
mov ecx,GNames // GNames pointer
mov edx,[ecx]
mov eax,[edi+20] // this - FName_Index
mov eax,[edx+eax*4]
add eax,10 // this->GetName
GetFullName_loop_d:
cmp byte ptr [eax],0
je GetFullName_next_e
mov dl,[eax]
mov [ebx],dl
inc ebx
inc eax
jmp GetFullName_loop_d
GetFullName_next_e:
mov byte ptr [ebx],0
mov eax,szFunctionName
ret
GetFullName_0:
mov ebx,szFunctionName
mov edx,GNames // GNames pointer
mov ecx,[eax+20] // FName_Index
mov eax,[edx]
mov ecx,[eax+ecx*4]
add ecx,10 // Class->GetName
GetFullName_loop_f:
cmp byte ptr [ecx],0
je GetFullName_next_g
mov al,[ecx]
mov [ebx],al
inc ebx
inc ecx
jmp GetFullName_loop_f
GetFullName_next_g:
mov byte ptr [ebx],20 // space character
inc ebx
mov edx,[edi+1C] // Outer
mov eax,[edx+20] // FName_Index
mov ecx,GNames // GNames pointer
mov edx,[ecx]
mov eax,[edx+eax*4]
add eax,10 // Outer->GetName
GetFullName_loop_g:
cmp byte ptr [eax],0
je GetFullName_next_h
mov cl,[eax]
mov [ebx],cl
inc ebx
inc eax
jmp GetFullName_loop_g
GetFullName_next_h:
mov byte ptr [ebx],2E // . character
inc ebx
mov edx,GNames // GNames pointer
mov eax,[edx]
mov ecx,[edi+20] // this - FName_Index
mov ecx,[eax+ecx*4]
add ecx,10 // this->GetName
GetFullName_loop_h:
cmp byte ptr [ecx],0
je GetFullName_next_i
mov al,[ecx]
mov [ebx],al
inc ebx
inc ecx
jmp GetFullName_loop_h
GetFullName_next_i:
mov byte ptr [ebx],0
mov eax,szFunctionName
ret
GetFullName_NULL:
mov eax,szNull
ret
db CC CC
//*********************
//** OutputDebug **
//*********************
OutputDebug:
push ebp
mov ebp,esp
mov eax,szOutputDebug
mov ecx,ebx
OutputDebug_0:
cmp byte ptr [ecx],0
je OutputDebug_1
mov dl,[ecx]
mov [eax],dl
inc ecx
inc eax
jmp OutputDebug_0
OutputDebug_1:
mov byte ptr [eax],0
push szSeparator
push szOutputDebug
call lstrcatA
push [ebp+8]
push szFormat
push szBuffer
call wsprintfA
add esp,C
push szBuffer
push szOutputDebug
call lstrcatA
push szOutputDebug
call OutputDebugStringA
mov esp,ebp
pop ebp
ret 4
ExitKeyHandler:
ret
[DISABLE]
KeyHandlerOff:
dd 1
unregistersymbol( OutputDebug )
unregistersymbol( FindObject )
unregistersymbol( GetObject )
unregistersymbol( GetFullName )
unregistersymbol( KeyHandlerOff )
KeyHandlerOff
0BB30500
GetObject
0BB30151
GetFullName
0BB301D9
FindObject
0BB30174
OutputDebug
0BB30324
GObjects
026A1CA4
GNames
026A1C74
ProcessEvent
005A7040