0,0 → 1,173 |
//Asper |
char a_libdir[43] = "/sys/lib/\0"; |
|
|
//proc dll.Load, import_table:dword |
int dll_Load(dword import_table) |
{ |
$mov esi, import_table |
@next_lib: $mov edx, DSDWORD[esi] |
$or edx,edx |
$jz exit_ |
$push esi |
$mov esi,DSDWORD[esi+4] |
$mov edi,#a_libdir |
|
$push edi |
$push esi |
EAX=strlen(#a_libdir); |
$pop esi |
$pop edi |
$add edi, eax //9 |
|
@loc01: $lodsb |
$stosb |
$or al,al |
$jnz loc01 |
|
//IntToStr(EBX); |
//$push edx |
//WriteDebug(#a_libdir); |
//$pop edx |
//mcall 68,19,a_libdir |
$mov eax, 68 |
$mov ebx, 19 |
$mov ecx,#a_libdir |
$int 0x40 |
|
$or eax,eax |
$jz fail |
//stdcall dll.Link,eax,edx |
dll_Link(EAX, EDX); |
$push eax |
$mov eax, DSDWORD [eax] |
$cmp DSDWORD [eax], 'lib_' |
$pop eax |
//$jnz loc02 |
//IntToStr(EBX); |
//$push eax |
//WriteDebug(DSDWORD[EAX]); |
//$pop eax |
//stdcall dll.Init,[eax+4] |
//dll_Init(DSDWORD[EAX]); //dll_Init(DSDWORD[EAX+4]); |
@loc02: |
$pop esi |
$add esi,8 |
$jmp next_lib |
@exit_: $xor eax,eax |
return 0; |
@fail: $add esp,4 |
$xor eax,eax |
$inc eax |
return -1; |
} |
|
//proc dll.Link, exp:dword,imp:dword |
void dll_Link(dword exp, imp) |
{ |
$push eax |
$mov esi, imp |
$test esi, esi |
$jz done |
@next: $lodsd |
$test eax,eax |
$jz done |
|
//stdcall dll.GetProcAddress,[exp],eax |
dll_GetProcAddress(exp,EAX); |
$or eax,eax |
$jz loc03 |
|
$mov DSDWORD[esi-4],eax |
$jmp next |
@loc03: |
$mov DSDWORD[esp],0 |
@done: $pop eax |
} |
|
//proc dll.Init, dllentry:dword |
void dll_Init(dword dllentry) |
{ |
$pushad |
EAX=#mem_Alloc; |
EBX=#mem_Free; |
ECX=#mem_ReAlloc; |
EDX=#dll_Load; |
DSDWORD [dllentry+4] stdcall (); |
$popad |
} |
|
//proc dll.GetProcAddress, exp:dword,sz_name:dword |
dword dll_GetProcAddress(dword exp, sz_name) |
{ |
$push esi |
$mov edx, exp |
$xor eax,eax |
@next: $or edx,edx |
$jz end_ |
$cmp edx,0 |
$jz end_ |
strcmp(DSDWORD[EDX],sz_name); |
$test eax,eax |
$jz ok |
$add edx,8 |
$jmp next |
@ok: |
$mov eax, DSDWORD[edx+4] |
@end_: |
$pop esi |
return EAX; |
} |
|
|
int load_dll2(dword dllname, import_table, byte need_init) |
{ |
//dword dllentry=0; |
// load DLL |
$mov eax, 68 |
$mov ebx, 19 |
ECX=dllname; |
$int 0x40 |
$test eax, eax |
$jz exit01 |
|
// initialize import |
$mov edx,eax |
ESI=import_table; |
|
@import_loop01: |
$lodsd |
$test eax,eax |
$jz import_done01 |
$push edx |
@import_find01: |
$mov ebx,DSDWORD[EDX] |
$test ebx, ebx |
$jz exit01 |
$push eax |
@nex101: |
$mov cl,DSBYTE[EAX]; |
$cmp cl,DSBYTE[EBX]; |
$jnz import_find_next01 |
$test cl,cl |
$jz import_found01 |
$inc eax |
$inc ebx |
$jmp nex101 |
@import_find_next01: |
$pop eax |
$add edx, 8 |
$jmp import_find01 |
@import_found01: |
$pop eax |
$mov eax,DSDWORD[edx+4] |
$mov DSDWORD[esi-4],eax |
$pop edx |
|
$jmp import_loop01 |
@import_done01: |
IF (need_init) dll_Init(EDX); |
return 0; |
@exit01: |
return -1; |
} |