501

(13 відповідей, залишених у C++)

Я теж  є прихильником Pelles C компілятора, тому не розумію чого вам не вистачає.
Щоб задати параметри командного рядка зайдіть до project -> project options.. -> command line arguments вкладки General

502

(21 відповідей, залишених у Алгоритми та структури даних, технології)

Так,  кодер без матана індус у поганому сенсі цього слова :) Я раніше гадав, що кодуючи усілякі низькорівневі речі, є можливість обійти матан стороною. Тепер я дізнався про графи, статистику, теорію ймовірностей і шо таке ентропія.

503

(3 відповідей, залишених у Системне програмування)

Чого його губитись, коли задача нескладна.
Поясню на операції додавання. Припустимо що у нас є 8-бітна машина :) і треба додати 2 двобайтових операнди
1-й операнд = 0x01ff, 2-й операнд = 0x00f0
Спочатку додаємо молодші байти, тобто 0xff i 0xf0
В результат дорівнюватиме 0xef і встановиться флаг переносу - запишемо молодший байт результату
Наступного разу додаємо старші байти з врахуванням флагу переносу, тобто
0х01+0х00 = 0х1  результат + флаг переносу  = 0х2 - запишемо старший байт результату

504

(3 відповідей, залишених у Системне програмування)

Я маю деякий досвід роботи з числами, більшими за розрядність мікропроцесора.
По-перше дайте посилання на документацію вашої машини. Я Кнута не читав, каюсь :) але скажу лише одне - використовуйте Carry Flag - флаг переносу чи що воно у вас там є.

505

(5 відповідей, залишених у Python)

Поясніть мені що робить цей код, бо в Пітоні я нічого не тямлю.

DIRECTORY_ENTRY = dict([(e[1], e[0]) for e in directory_entry_types]+directory_entry_types)

506

(23 відповідей, залишених у Інше)

ги-ги...

Вийшло 20 пісень. ... їх виявилось 28,

Шість пісень приховані?

507

(4 відповідей, залишених у JavaScript, TypeScript, ECMAScript)

Тому що я використовую його не за прямим призначенням :) Я  на ньому поліморфного криптора написав та модуль, що працює з екзешнікамі.

508

(4 відповідей, залишених у JavaScript, TypeScript, ECMAScript)

Так, воно дуже одрізняється од інших мов. Для мене найнесподіванішим була асинхронність файлових операцій, але вони мають синхронні відповідники.

509

(0 відповідей, залишених у Системне програмування)

Я люблю Node JS та зворотню інженерію, тому я працюю над бібліотекою, що поєднує ці речі. Демо-код додає секцію до PE EXE x86 файла. Можливо, код містить глюки, але це лише початок розробки бібліотеки для NODE JS. Натхнення черпав з вбудованої скриптової мови в CFF Explorer (трохи змінений LUA).

var fs = require('fs');

const PE_DosHeader = 0, PE_NtHeaders = 1, PE_FileHeader = 2, PE_OptionalHeader = 3, PE_SectionHeaders = 4, PE_DataDirectories = 5,
PE_ExportDirectory = 6, PE_ImportDirectory = 7, PE_ResourceDirectory = 8, PE_ExceptionDirectory = 9, PE_SecurityDirectory = 0xa,
PE_RelocationDirectory = 0xb, PE_DebugDirectory = 0xc, PE_TLSDirectory = 0xd, PE_ConfigurationDirectory = 0xe,
PE_BoundImportDirectory = 0xf, PE_ImportAddressTableDirectory = 0x10, PE_DelayImportDirectory = 0x11, PE_DotNETDirectory = 0x12;

String.prototype.rtrim = function() {return this.replace(/\0+$/,"");}

function toSectionNameBuf(s) {
  var buf = new Buffer(8);
  buf.fill(0);
  if (s.length > 8) s = s.slice(0, 8);
  buf.write(s, 0, s.length, 'ascii');
  return(buf);};

function alignBy(v, by) {
 return((v%by)?(1+Math.floor(v/by))*by:v)};

function PEFile(){
  this.buf;
  this.peStrucTable;}
                                                                                                                             
PEFile.prototype.OpenPE = function(file) {
  this.buf = fs.readFileSync(file);
  var sig = this.buf.toString('ascii', 0, 2)
  if (sig != 'MZ') return(false);                                                            
  var pHeaderPE = this.buf.readUInt16LE(0x3c);
  if (this.buf.readUInt16LE(pHeaderPE) !== 0x4550) return(false);
  var pDataDirectories = pHeaderPE+0x78;
  this.peStrucTable = [0, pHeaderPE, pHeaderPE+0x4, pHeaderPE+44, pHeaderPE+0xf8, pDataDirectories, pDataDirectories,
    pDataDirectories+0x8, pDataDirectories+0x10, pDataDirectories+0x18, pDataDirectories+0x20, pDataDirectories+0x28,
    pDataDirectories+0x30, pDataDirectories+0x48, pDataDirectories+0x50, pDataDirectories+0x58, pDataDirectories+0x60, 
    pDataDirectories+0x68, pDataDirectories+0x70]; 
  return(true);};                                                  

PEFile.prototype.Save = function(name){
  fs.writeFileSync(name, this.buf);};

PEFile.prototype.readByte = function(ofs) {
  return(this.buf[ofs]);}

PEFile.prototype.readWord = function (ofs) {
  return(this.buf.readUInt16LE(ofs));}

PEFile.prototype.readDWord = function (ofs) {
  return(this.buf.readUInt32LE(ofs));}

PEFile.prototype.readQWord = function (ofs) {
  return(this.buf.readDoubleLE(ofs));}

PEFile.prototype.writeByte = function(ofs, val) {
  this.buf[ofs] = val;}

PEFile.prototype.writeWord = function (ofs, val) {
  this.buf.writeUInt16LE(val, ofs);}

PEFile.prototype.writeDWord = function (ofs, val) {
  this.buf.writeUInt32LE(val, ofs);}

PEFile.prototype.writeQWord = function (ofs, val) {
  this.buf.writeDoubleLE(val, ofs);}
  
PEFile.prototype.getNumberOfSections = function(n){
  return(this.readWord(this.getOffset(PE_FileHeader)+0x2));};

PEFile.prototype.getOffset = function(n){
  return(this.peStrucTable[n % 0x13]);};  

PEFile.prototype.enumSections = function(fEnumProc, lParam){
  var iSections = this.getNumberOfSections();
  for(var i = 0; i < iSections; i++){
    var pSection = this.getOffset(PE_SectionHeaders) + i*0x28;
    var sName = this.buf.toString('ascii', pSection, pSection+8).rtrim();
    fEnumProc.call(this, i, pSection, sName, lParam);};
  return(true);};

PEFile.prototype.findSection = function(sName){
  var pSection = null;
  this.enumSections( function(i, p, s, name) { if (s == name) {pSection = p;} }, sName);
  return(pSection);}

PEFile.prototype.dumpSection = function(sName) {
  var dwVirtualSize, dwRawSize, dwRawAddr, bufSection, bufSectionHeader = new Buffer(0x28), pSection = this.findSection(sName);
  if (!pSection) return(null);
  this.buf.copy(bufSectionHeader, 0, pSection, pSection+0x28);
  dwRawSize = bufSectionHeader.readUInt32LE(0x10);
  dwVirtualSize = bufSectionHeader.readUInt32LE(0x8);
  dwRawAddr = bufSectionHeader.readUInt32LE(0x14);
  if (dwRawSize < dwVirtualSize) dwVirtualSize = dwRawSize;
  bufSection = new Buffer(dwVirtualSize);
  this.buf.copy(bufSection, 0, dwRawAddr, dwRawAddr+dwVirtualSize);
  return(bufSection);};

PEFile.prototype.addSectionHeader = function(name) {
  var pSectionHeaders = this.getOffset(PE_SectionHeaders), pHeaderOffset = 0x28*this.getNumberOfSections()+pSectionHeaders,
  pFirstSectionData = this.readDWord(pSectionHeaders+0x14);
  if (pFirstSectionData <= pHeaderOffset) return(false);
  this.buf.fill(0, pHeaderOffset, pHeaderOffset+0x28);
  toSectionNameBuf(name).copy(this.buf, pHeaderOffset);
  this.writeDWord(pHeaderOffset+0x24, 0xC0000000);              
  var pSecNum = this.getOffset(PE_FileHeader)+0x2;
  this.writeWord(pSecNum, this.readWord(pSecNum)+1);
  return(true);};

PEFile.prototype.addSectionEmpty = function(name, size, ch){
  if (!this.addSectionHeader(name)) return false;
  var pSectionHeaders = this.getOffset(PE_SectionHeaders), iSect = this.getNumberOfSections(),
  dwSectionAligment = this.readDWord(this.getOffset(PE_FileHeader)+0x34), 
  dwFileAligment = this.readDWord(this.getOffset(PE_FileHeader)+0x38);
  var pLastSectionHdr = pSectionHeaders+(iSect-2)*0x28;
  var pVA = alignBy(this.readDWord(pLastSectionHdr+0x8), dwSectionAligment)+this.readDWord(pLastSectionHdr+0xC);
  var pRA = alignBy(this.readDWord(pLastSectionHdr+0x10), dwFileAligment)+this.readDWord(pLastSectionHdr+0x14);
  var dwSizeRaw = alignBy(size, dwFileAligment);
  var pNewSectionHdr = pSectionHeaders+(iSect-1)*0x28;
  this.writeDWord(pNewSectionHdr+0x8, size);
  this.writeDWord(pNewSectionHdr+0xC, pVA);
  this.writeDWord(pNewSectionHdr+0x10, dwSizeRaw);
  this.writeDWord(pNewSectionHdr+0x14, pRA);
  var b = new Buffer(dwSizeRaw);
  b.fill(0);
  this.buf = Buffer.concat([this.buf, b]);
  return(true)};

PEFile.prototype.addSection = function(name, buf, ch) {
  this.addSectionEmpty(name, buf.length, ch);
  var pLastSecHdr = this.getOffset(PE_SectionHeaders) + (this.getNumberOfSections()-1)*0x28; 
  buf.copy(this.buf, this.readDWord(pLastSecHdr+0x14));};  

PEFile.prototype.sectionFromRVA = function (rva) {
  var result = null;
  this.enumSections( function(i, p, s, rva){
    var dwVirtualSize = this.readWord(p+0x8), dwVirtualAddress =  this.readWord(p+0xC);
    if (rva >= dwVirtualAddress && rva  < dwVirtualAddress+dwVirtualSize) result = i;}, rva);
  return(result);};

PEFile.prototype.rebuildImageSize = function (){
  var  dwSectionAligment = this.readDWord(this.getOffset(PE_FileHeader)+0x34), 
  pLastSecHdr = this.getOffset(PE_SectionHeaders) + (this.getNumberOfSections()-1)*0x28;
  var dwSizeImage = alignBy(this.readDWord(pLastSecHdr+0x8), dwSectionAligment)+this.readDWord(pLastSecHdr+0xC);
  this.writeDWord(this.getOffset(PE_FileHeader)+0x4C, dwSizeImage);
  return(true)};

var bufX = new Buffer('I LOVE NODE.JS ! \n(c) CovetousEyes', 'ascii');
var pef = new PEFile();
pef.OpenPE('test.EXE');
pef.addSection('.FUNNY', bufX);
pef.rebuildImageSize();
pef.Save('testCracked.exe');

510

(4 відповідей, залишених у JavaScript, TypeScript, ECMAScript)

Що ви думаєте з приводу серверного JS і node.js як його найяскравішого представника. Чи має воно майбутнє?

511

(3 відповідей, залишених у PHP)

Якщо починати великий проект, то починати треба з визначення цільової аудиторії і бізнес-плану. Потім обміркувати власні ресурси (навіть якщо це лише власний час) і шляхи їх збільшення (наприклад, сказати собі "Наркомани нам не друзі" і послати все своє вимушене отечення в одному напрямку). Якщо проект веб, то перш за все продумати структуру БД, мінімальний функціонал з яким проект можливо запустити.

512

(16 відповідей, залишених у PHP)

Денвер фігово співіснує з Вістою/Сімкою (якщо не вимкнути стандартні серверні служби), тому откат до ХП виправляє ситуацію для початківців. ІМГО, денвер то фофуддя, ХАМРР наше всьо :)

Порадьте літературу з написання компіляторів. Окрім червоного/пурпурного драконів (автори Аго, Лам, Сеті, Ульман), звичайно. Дракони це наше все, але як на мене, там замало прикладів. І бажано англомовну.

514

(24 відповідей, залишених у Статті)

Якщо б я зараз працював із цією темою, то наврядчи б викладав в паблік. По-друге інфа мяко кажучи не дуже актуальна - кожного дня з'являються десятки набагато страшніших троянів, аніж моя демка.

515

(24 відповідей, залишених у Статті)

Так, прогу писав я і на власному рахунку перевіряв (а раніше на демо стенді БІФІТа). Прога сигналізує про свої дії MessageBox`ами, тому "за призначенням" її використати важко людині, що не програмує. Так, додам код у пост.

516

(24 відповідей, залишених у Статті)

Першоджерело: http://covetouzeyez.blog.net.ua/2013/02/06/bezpeka-onlajn-bankinha-ochyma-kodera/

1. Вступ
    Метою написання цього тютора є злоба і ненависть до BIFIT`а бажання відкрити очі кліентів онлайн банкінга (далі скорочено до ОБ) на низький рівень захисту їх банківських рахунків. Я теж користуюсь послугами ОБ за допомогою ПО iBank BIFIT`а та з подивом дізнався, як легко злодій може викрасти ключі від мого рахунку. Сподіваюсь, що після прочитання цієї статті клієнти ОБ стануть більш обачні. Можливо ця стаття викличе увагу банківських менеджерів(та служби безпеки :-)) і вони стануть приділяти більше уваги інформуванню клієнтів про ризики використання ОБ. Усе тут написане не є великим секретом для BIFIT`а/Банків/програмістів, які з цим стикалися. Мета статті - наочно показати вразливість, а не використати її, тому долучений до статті код не надсилає награбоване на пошту/адмінку :-)
   
2. Огдяд ПЗ Клієнт-Банк для ОБ від компанії BIFIT
    Команія BIFIT є лідером на пострадянському просторі в сфері розробки та впровадження ПЗ для ОБ. Ось що про це написано на російському сайті команії:

На 1 января 2012 года система «iBank 2» внедрена и промышленно эксплуатируется в 837 российских банках и филиалах, успешно обслуживая более 650 тысяч корпоративных и более 450 тысяч частных клиентов.

Команія пропонує наступні різновиди ПЗ:
* PC-Банкінг
* Інтернет-банкінг
    Інші сервіси спецефічні та рідко використовуються (Enterprise-Банкінг(интеграція з 1С), SMS-Банкінг, Phone-Банкінг). В якості сховища ключів «iBank 2» використовує файли(), чіп-карти і токени. В цій статті ми обмежимося розглядом вразливостей ОБ на прикладі Інтернет-банкінга (PC-Банкінг працює так само) з використанням файлів в якості сховища ключів на платформі Windows х86. Також я впевенений в наявності вразливостей в інших версіях банкінга та носіїв ключів за допомогою MITM атаки, але лінь копатися без винагороди детальних досліджень поки не робив.

3. Середовище виконання клієнтського ПО «iBank 2» для ОБ
    Не є секретом, що найбільш розповсюджені десктопні ОС з сімейства Windows. Вони мають велику кількість "фіч", що плачевно впливає на її безпеку. Хоча найбільш кричущі дірки залатані/залишилися в минулому, накшталт RPC DCOM, прямого доступа до портів вводу\виводу і адресного простору ядра з користувцьких додатків (Windows 9x/ME), але важкий баласт сумісності з вже існуючим ПО не дає майкрософту можливості кардинально змінити своє ставлення до проблем безпеки. Головна фіча це майже рутові права простого користувача, з якої випливають інші фічі: можливість читати/писати з/у адресний простір чужого процесса, завантаження(інжект) своєї DLL в будь-який процес і система віконних повідомлень, що була успадкована від Windows 3.11 і яка легко перехоплюється. Хоча більшість проблем вирішується встановленням стронніх программ, але "зі-скрині" безпека системи залишає бажати кращого. Користувача доять майкрософт, антивирусні компанії і хакери (одночасно!) тому змінювати стан речей нікому не вигідно. А банковські службовці або мовчать про можливі ризики використання ОБ, або ж змушують підписати кабальну угоду, в якій знімають з себе відповідальність за безпеку ваших грошей.
    ПЗ «iBank 2» (тобто його клієнтська частина), написане на Java і виконуються в JavaVM SE, яка, в свою чергу, є простим користувацьким додатком для Windows.
   
4. Код, що використовує вразливості
    Проект складається з 2х частин: DLL, що виконується в адресному просторі JavaVM SE, з основним функціоналом і EXE, який містить детектор вікна банківського клієнта з "інтерфейсом" (іконка в треї з єдиним пунктом меню - "Exit"). Код написаний на Assembler (FASM). FASM мій улюблений асм компілятор і на це є безліч причин. Головні - безкоштовний, швидкий, має зручного вбудованого редактора, підтримку x86-64, потужну макромову та вбудованго лінкера, а також INTEL синтаксис, до якого я звик. Єдиний недолік фасма - відсутність багатьох важливих "хидерів" у зрівнянні з пакетом MASM32. Для EXE я використав PureBasic.
   
    Алгоритм роботи:
    * ідентифікація ПО «iBank 2» в JavaVM SE
    * інжект нашої DLL в JavaVM SE
    * запис кейлогером усіх натиснення клавіш
    * перехоплення WinAPI GetFileAttributesExW
    * в новому обробнику GetFileAttributesExW перевіряємо усі файли на сигнатуру "iBKS" на початку файла
    * під час закриття вікна записуємо результати роботи сесії ПО «iBank 2» (скріншот, натиснення клавіш, файлове сховище ключів)
    * відкримаємо "награбоване" в теці

5. Як протестувати код?

Заходимо на сайт BIFIT`a, клікаємо на "Дистрибутивы" й читаємо:

Компания «БИФИТ» выявила случаи использования злоумышленниками демонстрационных точек входа (ключей электронной подписи демонстрационных клиентов), предоставляемых банками на своих сайтах для ознакомления клиентов с системой «iBank 2».

Злоумышленники используют доступ к системе от имени демонстрационных клиентов для тестирования и отладки вредоносных программ, создаваемых с целью хищения средств клиентов.

В связи с этим компания «БИФИТ» закрыла демонстрационный доступ к тестовому экземпляру системы «iBank 2» и заблокировала соответствующие ключи проверки подписи демонстрационных клиентов, а также убрала из свободного доступа все дистрибутивы системы «iBank 2» и документацию.

Для получения дистрибутивов, пакетов обновления системы и документации обращайтесь в службу сопровождения компании «БИФИТ» по электронной почте: support@bifit.com.

Здавалося б, що мені саме час зайти на сайт свого банку й використати свій ключ од рахунку (котрого в вас може й не бути), але iBank використовується в багатьох фінансових установах, котрі не так параноїдально ставляться до своєї безпеки. На час написання статті відкритим залишається УкрСібБанк https://my.ukrsibbank.com/ua/sme/operat … ess/login/

Пізніше додам посилання на гітхаб

517

(22 відповідей, залишених у Обговорення)

Додам свої п'ять копійок - Вебмані вийшла на український ринок без локалізації і за весь час не замислилася про це, отож робімо висновки, що їй це не потрібно.