Pull to refresh
1
0
Send message
На хлебзаводе арендовали цех с особыми грузинскими печами. При этом КИПовцы хлебзавода по договору продолжают обслуживать печи. С нашей маленькой пекарни замешанные булочки доставляются к печи, где проходят финальный этап выпечки.
А это вообще легально насколько возможно — вторгаться в адресное пространство другой программы? Я как-то читал, что все программы исполняются в своей «песочнице», и менеджер памяти контроллирует, чтобы другой процесс не лез куда его не просят.
Майнер должен оставлять как минимум 50% свободных ресурсов вне зависимости от нагрузки системы. Если система уже загружена на 50%, майнер не должен работать.

JavaScript-код сейчас исполняется в своей «песочнице» (мне так кажется) и доступ к такой информации о системе очень ограничен
Майнер должен посылать браузеру специальное уведомление о майнинге. Данное уведомление браузер отобразит значком в адресной строке, а также на самой вкладке, как это уже делается с проигрыванием аудио.

Отличная идея, вот это точно нужно реализовать, как была реализована опция «Не отслеживать»
Майнер не должен работать, если пользователь запретил майнинг на всех сайтах или на текущем сайте.

Это уже поддержка такой опции в браузерах.
Майнер не должен работать при работе от батареи.

Получается, что JavaScript код сможет получать гораздо больше информации о системе, чем получает сейчас.
Для выполнения этих пунктов необходим серьезный пересмотр функциональности JavaScript.

При встраивании майнинга в браузер всё равно необходимо оповещать пользователя о поведении страниц как в предыдущем пункте.
Как методичку прочитал.
Но если человек пишет на ассемблере, он уже не имеет готовых функций типа printf(), в которых за него продумано, как «общаться» с системой, и должен делать это сам.


Писал вот такой вот код на третьем курсе (MASM):

includelib D:\masm32\lib\kernel32.lib
ExitProcess PROTO, :DWORD
GetStdHandle Proto, :DWORD
Sleep PROTO, :DWORD
WriteConsoleA PROTO, handle: DWORD, lpBuffer:PTR BYTE, nNumberOfBytesToWrite:DWORD, lpNumberOfBytesWritten:PTR DWORD, lpReserved:DWORD
ReadConsoleA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
.data
STD_OUTPUT_HANDLE EQU -11
STD_INPUT_HANDLE EQU -10
coh dd ? ;store console output handle here
cih dd ? ;store console input handle here
.code

ReadingCA proc msg:DWORD, col:DWORD
sub esp,8
push STD_INPUT_HANDLE
call GetStdHandle
mov [ebp-4],eax ;Local Variable for this subroutine
push 0
lea eax,[ebp-8]
push eax
push [ebp+12]
push [ebp+8]
push [ebp-4]
call ReadConsoleA
ret 8
ReadingCA endp

Так что WinAPI использовать возможно.
Очень хорошая статья. А пример на Линукс и правда очень хорошо подходит.
Можно увидеть ещё больше информации о запущенном процессе с помощью ключа -ХХ:
pmap -XX 1937 > ~/Testprj/processinfo.txt
Кроме того стоит обратить внимание на такое явление. Для одной и той же программы из статьи пытался определить адрес стека. С помощью pmap получил такой результат:
00007fffbd6a0000 132 12 12 rw--- [ stack ]
В коде же результат немного другой:
Stack is at 0x7fffbd6be99c

Помню, в университете рассказывали, что регистр ebp (В 64бит ОС он называется rbp) как-то связан со стеком… Можно попробовать модифицировать немного код:

#include <cstdio>
#include <stdint.h>
int main() {
  int i=3;
  int* someptr = new int(l);
  printf ("==Exploring system addressing stuff==\n");
  printf("Code is at %p \n", (void*)main);
  printf("Stack is at %p \n", (void*)&i);
  printf("Heap is at %p \n", someptr);
  uint64 t basepointer64 = 0;
  //source first, dest last, move 64 bit from rbp to value
  __asm__ __volatile__("movq %%rbp, %0":"=r"(basepointer64));
 printf("RBP is at: %0lx \n", basepointer64);
 delete someptr;
 getchar();
 return 0;
}


Тогда результаты будут такие:
==Exploring system addressing stuff==
Code is at 0x557f7fde282a
Stack is at 0x7ffeebd0c164
Heap is at 0x557f81812e70
RBP is at: 7ffeebd0c180

При этом pmap показывает, что наиболее близкие адреса сегментов это:
7ffeebcee000 [stack]
7ffeebd6d000 [vvar]
7ffeebd70000 [vdso]

Information

Rating
Does not participate
Registered
Activity