1. C++ / Говнокод #26428

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    template <typename function_type, typename vector_type>
    function_type read_memory(HANDLE hProcess, function_type base_address, std::vector< vector_type >&& offsets) {
        function_type tmp = base_address;
        for (function_type i : **reinterpret_cast< vector_type** >( &offsets )) {
            ReadProcessMemory(hProcess, reinterpret_cast< PBYTE* >( tmp + i ), &tmp, sizeof(function_type), nullptr);
        }
        return tmp;
    }
    
    int main() {
        std::vector< DWORD > offset = {
            0x10,
            0x14,
            0x158
        };
        auto buffer = read_memory< DWORD, DWORD >(hProcess, base_address, std::move(offset));
    }

    Полуговнокодер читает память чужого процесса...

    Запостил: bcaoo, 10 Февраля 2020

    Комментарии (39) RSS

    • > Полу
      ⅞ как минимум, и то при условии, что hProcess в спячку отправили предварительно
      Ответить
    • О_о. Нахуя кастовать вектор в массив DWORD'ов?
      Ответить
      • Нахуя вообще придумали эти DWORD-ы? Тупое виндоблядское говно!

        Чем их не устроили int8 int16 int32 и проч?
        Ответить
        • Их там не было.
          Ответить
          • Так пусть бы сделали. Почему я должен помнить что QWORD - 64, DWORD - 32, WORD - 16 бит? Нахуя это? Лучше б наделали u8, u16, u32, u64, i8, i16, i32, i64 каких-нибудь - было б намного лучше
            Ответить
            • Потому что во времена 16-битной венды все помнили что WORD - это 2 байта...
              Ответить
            • З.Ы. Юниксы в это время вообще юзали какие-то странные char, short и int. Так что BYTE и WORD с известной фиксированной длиной - это уже прогресс.
              Ответить
              • я помню когда в первый раз трогал сишку, то удивился отсутствию типа byte
                когда полез гуглить, первым же делом вывалилось конечно "не нужен вам байт у вас есть чар ты придумываешь ненужное из тебя не выйдет сишник"

                хуй знает как эти пчелы собирались с какими-нибудь сетевыми октетами работать, конечно
                Ответить
                • > не выйдет сишник

                  Пиздят. Это они нубов учат юзать char, а сами тайком тайпдефят. Вон в ядре есть u8, да и в половине библиотек какие-нибудь uint8 вместо чара юзают.

                  З.Ы. Кстати в кресты таки завезли byte. Для настоящих битоёбов, над ним даже арифметика не работает, только побитовые операции.
                  Ответить
                  • Настоящий мастер не выдаёт своих секретов, чтобы не плодить конкурентов.
                    Ответить
                    • Ой, да в случае с сишкой и крестами проще выдать все секреты - конкуренты сами съебутся в ужасе.
                      Ответить
              • Сишка - питушня для анскиллябр. Рассчитана на написание кода под машину, которой никогда реально не будет (не соответствует ни одной реальной архитектуре). Вместо стандартизации поведения - пачка UB. Если тебе надо реализовать что-то, что могло бы летать на одной из архитектур, приходится писать дополнительные костыли для обхода UB. В итоге на всех архитектурах в код вкомпилится твой обход UB. Могло бы летать на одной и чуть-чуть тормозить на остальных, но в итоге тормозит на всех сразу.
                На сишку нельзя полагаться. Либо код будет с проверками, которые в ближайшие годы не оттестируешь (а что, если int 128 бит), либо вообще без проверок, и тогда не скомпилируется/не заработает на машинах с int128 или charbit9.
                Полагаться вообще ни на что нельзя, нужен мешок тайпдефов.
                Максимум, что можно выжать из кода в плане универсальности -
                #if sizeof(int) != 8
                #error "TbI nugap"
                #endif
                Ответить
                • Именно по этому я за "ассемблер"
                  Ответить
                • int разве не 4 байта?
                  Ответить
                  • где это сказано? int может быть 1 байт, а может быть 2, а может 4 или 8 или 16. Стандарт позволяет
                    Ответить
                    • У меня на компе 4, на ideone 4, так что не начинай мне вешать лапшу, пожалуйста.
                      Ответить
                      • https://stackoverflow.com/questions/31376286/why-in-turbo-c-compiler-sizeofint-is-2-bytes-and-in-gcc-linux-compiler-is-4-by
                        Ответить
                    • Приведи реальный пример.
                      Ответить
                      • привел же.

                        турбо си под дос: int 2 байта
                        Ответить
                        • > под дос

                          Я же просил реальный пример.
                          Ответить
                          • Настоящий сишкоблядь мыслит СТАНДАРТОМ, а не конкретной реализацией.

                            А то вот такие любители конкретных примеров как-то позавязывались на размеры всяких структур, и десятый год не могут на x64 перейти
                            Ответить
                            • У нас в универе были лабы под "Dos Box", и препод спросил сколько байт в инте, и я с пеной изо рта доказывал, что 4. В итоге проверил - и правда 2 )
                              Ответить
                              • 1==sizeof(char)<=sizeof(int)<=sizeof(lon g)

                                это вс, чт мы знйм
                                Ответить
                                • В новых вореациях Стандарта, кстати, божественную неопределённость и абстрактность размеров интов заменили на какую-то питушню:
                                  The width of each signed integer type shall not be less than the values specified in Table 10.
                                  The value representation of a signed or unsigned integer type comprises N bits,
                                  where N is the respective width.
                                  
                                  Table 10: Minimum width [tab:basic.fundamental.width]
                                  Type         Minimum width N
                                  signed char  8
                                  short        16
                                  int          16
                                  long         32
                                  long long    64

                                  § 6.8.1/4
                                  Ответить
                                  • зачем? зачем? Малость есть unit16_t же.
                                    Ответить
                                    • uint16_t гарантирует, что данные займут ровно 16 бит.
                                      short int же гарантирует, что размер данных не меньше 16 бит. Т. е. 16 бит либо ближайший оптимальный для данной архитектуры размер.
                                      Ответить
                                      • Да. Аналогом этих новых интов будут uint16_fast_t/uint16_least_t.
                                        Ответить
                                  • Т. е. если машинное слово 12 бит, 24 бита, 48 бит, 18 бит, 36 бит, то в качестве размера очередного инта нужно будет брать не регистр, а два регистра, чтобы у программ, первоначально написанных для процессоров с 16-битным словом, не было переполнения?
                                    Ответить
                                    • Наверное, стандартизаторы не смогли привести реальный пример таких рахитектур и забили.
                                      Ответить
                          • А чем он нереальный? На нём, кстати, можно писать не только под DOS.

                            В компиляторах для DSP, GPU и мейнфреймов даже char может быть не 8-битным.
                            Ответить
                  • Да как-то на автомате написал.
                    Точно. Это же long 8 байт под луниксом.
                    Ответить
            • А вот DWORDLONG, DWORD32 и DWORD64 - это уже диагноз, конечно. Х.з. как они такое придумали.
              Ответить
              • UINT_PTR - целое число такого размера, что можно в нем хранить указатель (32 или 64 бита).
                Ответить
                • UINT_PTR был разработан настолько, что в нем можно хранить указатель (32 или 64 бита)
                  Ответить
            • Бля, у них даже HALF_PTR есть для небольших оффсетов...
              Ответить
        • >Нахуя вообще придумали эти DWORD-ы? Тупое виндоблядское говно!


          Для упрощения перехода с асма, очевидно
          Ответить

    Добавить комментарий