Помогите написать программу на C#

также стараюсь, чтобы мой файл весил как можно меньше.

Запхай упакованный avrdude в ресурсы своей #программы, потом распаковывай его в память и запускай с хексом, который ннада прошить. Тогда распространять будешь один *.ехе, и ничего лишнего. Не знаешь как? Помогу за 200т.р.

Пошёл денег собирать, чтобы оплатить вашу помощь

Это у тебя “моторная память” про дискеты? Эк тебя жизнь помотала! :wink: Вот всем абсолютно пофиг в наше время, какого размера файл. Интернет в 99% случаев у людей безлимитный. Даже спутниковый :wink:

Скажите пожалуйста, как так, я сказал что мне нужно, объяснил, а мне предлагают за 200 000 научить чему-то тому, что мне не нужно.
Я конечно понимаю, что кто-то кого-то считает за лоха, но не думал, что меня тоже будут стараться добавить в тот список.

:laughing:
Недавно нашёл одну - отдал сыну. Вспомнил детство.

Так проект только начинается, не хватит места на жёстком к концу. :face_with_peeking_eye:

Немношко прецказуемо, да.

Родной! Ну тя ж не учат форсунки потрошить? Исходник аврДуде - знаешь где. Либо тяни из него код для пошивки ардуино. Даже еще тебе несколько мест подскажу, где его попроще найти. Но 99% что у тебя это не выйдет.
Тебе люди ЧЬЯ ПРОФЕССИЯ программирование написали, что ты придумал херню. Зачем ты встаешь в позу обиженки и споришь?
Ты же даже программу пишешь не на компилируемом языке, а на Си шарпе. Так и вызывай из него “аврДуде”. Не морочь людЯм голову!

было бы иначе - вы бы такие базовые вещи не спрашивали…

Аналогия - за кого вы бы посчитали пользователя, который спросил бы, зачем эти форсунки вообще трогать?

че прям так, в память?
про диск мне понятно, а вот прям в память… :thinking:

Дяденька, а у меня в писюке нет ни одного диска, шоп прям круглого и крутился, тока память, шо я опять не так сделал? :wink:

тебя опять обманули :rofl:

Да, это была ценная информация. За неё огромное спасибо.

Буду очень благодарен.

Время покажет.

А разве я спорил? Или высказать своё желание это спор?

С каких пор он стал не компелируемым? Если я бы писал на питоне, то я бы согласился. C#, относится к компилируемым языкам программирования с исполнением на виртуальной машине.

Я так защиту делал не себе. Екзешник, который проверял ключ, упаковывался в ресурсы основной программы, при старте распаковывался в память и запускался оттудова. На выходе оставлял запускающей (основной) программе код, успешно ли прошла проверка. Счас не найду, я уже пить/спать побрёл, но утром найду, как покласть *.exe в память и запустить оттудова.

Спойлер
unit uRunfromMem;

interface

uses Windows;

function ExecuteFromMem(szFilePath, szParams: string; pFile: Pointer): WORD;

implementation
uses SysUtils;

function NtUnmapViewOfSection(ProcessHandle: WORD; BaseAddress: Pointer): WORD;
  stdcall; external 'ntdll';

type
  PImageBaseRelocation = ^TImageBaseRelocation;

  TImageBaseRelocation = packed record
    VirtualAddress: DWORD;
    SizeOfBlock: DWORD;
  end;

procedure PerformBaseRelocation(f_module: Pointer; INH: PImageNtHeaders;
  f_delta: Cardinal); stdcall;
var
  l_i: Cardinal;
  l_codebase: Pointer;
  l_relocation: PImageBaseRelocation;
  l_dest: Pointer;
  l_relInfo: ^WORD;
  l_patchAddrHL: ^DWORD;
  l_type, l_offset: integer;
begin
  l_codebase := f_module;
  if INH^.OptionalHeader.DataDirectory[5].Size > 0 then
  begin
    l_relocation := PImageBaseRelocation(Cardinal(l_codebase) +
      INH^.OptionalHeader.DataDirectory[5].VirtualAddress);
    while l_relocation.VirtualAddress > 0 do
    begin
      l_dest := Pointer((Cardinal(l_codebase) + l_relocation.VirtualAddress));
      l_relInfo := Pointer(Cardinal(l_relocation) + 8);
      for l_i := 0 to (trunc(((l_relocation.SizeOfBlock - 8) / 2)) - 1) do
      begin
        l_type := (l_relInfo^ shr 12);
        l_offset := l_relInfo^ and $FFF;
        if l_type = 3 then
        begin
          l_patchAddrHL := Pointer(Cardinal(l_dest) + Cardinal(l_offset));
          l_patchAddrHL^ := l_patchAddrHL^ + f_delta;
        end;
        inc(l_relInfo);
      end;
      l_relocation := Pointer(Cardinal(l_relocation) +
        l_relocation.SizeOfBlock);
    end;
  end;
end;

function AlignImage(pImage: Pointer): Pointer;
var
  IDH: PImageDosHeader;
  INH: PImageNtHeaders;
  ISH: PImageSectionHeader;
  i: WORD;
begin
  IDH := pImage;
  INH := Pointer(integer(pImage) + IDH^._lfanew);
  GetMem(Result, INH^.OptionalHeader.SizeOfImage);
  ZeroMemory(Result, INH^.OptionalHeader.SizeOfImage);
  CopyMemory(Result, pImage, INH^.OptionalHeader.SizeOfHeaders);
  for i := 0 to INH^.FileHeader.NumberOfSections - 1 do
  begin
    ISH := Pointer(integer(pImage) + IDH^._lfanew + 248 + i * 40);
    CopyMemory(Pointer(DWORD(Result) + ISH^.VirtualAddress),
      Pointer(DWORD(pImage) + ISH^.PointerToRawData), ISH^.SizeOfRawData);
  end;
end;

function Get4ByteAlignedContext(var Base: PContext): PContext;
begin
  Base := VirtualAlloc(nil, SizeOf(TContext) + 4, MEM_COMMIT, PAGE_READWRITE);
  Result := Base;
  if Base <> nil then
    while ((DWORD(Result) mod 4) <> 0) do
      Result := Pointer(DWORD(Result) + 1);
end;

function ExecuteFromMem(szFilePath, szParams: string; pFile: Pointer): WORD;
var
  PI: TProcessInformation;
  SI: TStartupInfo;
  CT: PContext;
  CTBase: PContext;
  IDH: PImageDosHeader;
  INH: PImageNtHeaders;
  dwImageBase: SIZE_T;
  pModule: Pointer;
  dwNull: SIZE_T;
begin
  if szParams.Trim.Length>0 then
    szParams := '"' + szFilePath + '" ' + szParams;

  Result := 0;
  IDH := pFile;
  if IDH^.e_magic = IMAGE_DOS_SIGNATURE then
  begin
    INH := Pointer(integer(pFile) + IDH^._lfanew);
    if INH^.Signature = IMAGE_NT_SIGNATURE then
    begin
      FillChar(SI, SizeOf(TStartupInfo), #0);
      FillChar(PI, SizeOf(TProcessInformation), #0);
      SI.cb := SizeOf(TStartupInfo);
      if CreateProcess(PChar(szFilePath), PChar(szParams), nil, nil, FALSE,
        CREATE_SUSPENDED, nil, nil, SI, PI) then
      begin
        CT := Get4ByteAlignedContext(CTBase);
        if CT <> nil then
        begin
          CT.ContextFlags := CONTEXT_FULL;
          if GetThreadContext(PI.hThread, CT^) then
          begin
            ReadProcessMemory(PI.hProcess, Pointer(CT.Ebx + 8), @dwImageBase,
              4, dwNull);
            if dwImageBase = INH^.OptionalHeader.ImageBase then
            begin
              if NtUnmapViewOfSection(PI.hProcess,
                Pointer(INH^.OptionalHeader.ImageBase)) = 0 then
                pModule := VirtualAllocEx(PI.hProcess,
                  Pointer(INH^.OptionalHeader.ImageBase),
                  INH^.OptionalHeader.SizeOfImage, MEM_COMMIT or MEM_RESERVE,
                  PAGE_EXECUTE_READWRITE)
              else
                pModule := VirtualAllocEx(PI.hProcess, nil,
                  INH^.OptionalHeader.SizeOfImage, MEM_COMMIT or MEM_RESERVE,
                  PAGE_EXECUTE_READWRITE);
            end
            else
              pModule := VirtualAllocEx(PI.hProcess,
                Pointer(INH^.OptionalHeader.ImageBase),
                INH^.OptionalHeader.SizeOfImage, MEM_COMMIT or MEM_RESERVE,
                PAGE_EXECUTE_READWRITE);
            if pModule <> nil then
            begin
              pFile := AlignImage(pFile);
              if DWORD(pModule) <> INH^.OptionalHeader.ImageBase then
              begin
                PerformBaseRelocation(pFile, INH,
                  (DWORD(pModule) - INH^.OptionalHeader.ImageBase));
                INH^.OptionalHeader.ImageBase := DWORD(pModule);
                CopyMemory(Pointer(integer(pFile) + IDH^._lfanew), INH, 248);
              end;
              WriteProcessMemory(PI.hProcess, pModule, pFile,
                INH.OptionalHeader.SizeOfImage, dwNull);
              WriteProcessMemory(PI.hProcess, Pointer(CT.Ebx + 8), @pModule,
                4, dwNull);
              CT.Eax := DWORD(pModule) +
                INH^.OptionalHeader.AddressOfEntryPoint;
              SetThreadContext(PI.hThread, CT^);
              ResumeThread(PI.hThread);
              Result := PI.hThread;
            end;
          end;
          VirtualFree(CTBase, 0, MEM_RELEASE);
        end;
        if Result = 0 then
          TerminateProcess(PI.hProcess, 0);
      end;
    end;
  end;
end; 
end.

1 лайк

Ты о чем вообще?
попроще чем что? или чем где? Чем на гитхабе?

Ребята а че вы так возбудились-то? протокол обмена данными известен, враппер пакетов написать делов на пару дней, че там делать то под винду? я ТСу за пять дней пообещал и за 20 тыщ рублей, он чето морозится, денег наверно жалко, ах эти нищеброды…

и от дудки еще ведь конфиг понадобится, как с ним?
тоже в память?

эти все конфиги можно из конфигов ардуино иде импортировать, не вижу трудностей

Вообще непонятно, зачем это все. Не нравится командная строка - для дудки есть красивые оболочки…