ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #21  
Старый 24.05.2007, 12:49
Joker-jar
Постоянный
Регистрация: 11.03.2007
Сообщений: 581
Провел на форуме:
4172659

Репутация: 646


Отправить сообщение для Joker-jar с помощью ICQ
По умолчанию

Delphi. Простая, но очень полезная функция (при написании игр, искусственных интеллектов, эмуляторов игровых автоматов и т.д.). Функция идентична random: boolean, только с параметром percent, (0 <= percent <= 100) - вероятностью истинного результата. Например, probrandom(80) вернет true с вероятностью 80%.
Код:
function probrandom(percent: integer): boolean;
begin
  result := random(100) < percent;
end;
З.Ы. Не забываем инициализировать генератор случайных чисел (randomize)

Последний раз редактировалось _Great_; 26.05.2007 в 20:03.. Причина: Кнопку "Редактировать" придумали не для вас, наверное
 
Ответить с цитированием

  #22  
Старый 31.05.2007, 22:16
Joker-jar
Постоянный
Регистрация: 11.03.2007
Сообщений: 581
Провел на форуме:
4172659

Репутация: 646


Отправить сообщение для Joker-jar с помощью ICQ
По умолчанию

Код:
const
  alf = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';

  function power(x,y: integer): int64;
  begin
    if x = 0 then
      result := 0
    else
      result := trunc(exp(ln(x)*y));
  end;

  function fromdec(d: int64; s: integer): string;
  begin
    if (d < s) then
      result := alf[d + 1]
    else
      result := fromdec(d div s,s) + alf[d mod s + 1];
  end;

  function todec(d: string; s: integer): int64;
  begin
    if length(d) = 1 then
      result := pos(d,alf) - 1
    else
      result := (pos(d[1],alf) - 1) * power(s, length(d)-1) + todec(copy(d,2,length(d)-1),s);
  end;
Delphi. Системы счисления. 2 <= s <= 36

З.Ы. Рекурсия рулит
 
Ответить с цитированием

  #23  
Старый 31.05.2007, 23:40
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме:
5339610

Репутация: 4360


Отправить сообщение для _Great_ с помощью ICQ
По умолчанию

И все-таки, как написано в 1 посте, "Не стоит превращать тему в свалку исходников, выбирайте наиболее интересные и полезные участки кода."
Выбирайте действительно ИНТЕРЕСНЫЙ и НЕОБЫЧНЫЙ код, какието нестандартные приемы там и прочее. Банальщина типа реализации CopyFile не очень нужна.
 
Ответить с цитированием

  #24  
Старый 22.06.2007, 03:36
Ch3ck
Познавший АНТИЧАТ
Регистрация: 09.06.2006
Сообщений: 1,359
Провел на форуме:
5301021

Репутация: 1879


По умолчанию

Выводит содержимое файла в шестнадцатиричном формате и в виде ASCII кодов.

Код:
#include <iostream>
#include <fstream>
#include <cctype>
#include <iomanip>
using namespase std;

int main(int argc, char *argv[])
{
		 if(!argc=2) {
		   cout << "USAGE: Display" 
		   rerutn 1;
   }
ifstream in(argv[1], ios::in | ios::binary);
		 if(!in) {
		 cout << "Cannot open input file.\n";
		 return 1;
   }
register int i, j;
int count = 0;
char c[16];
		 cout.setf(ios::uppercase);
			while(!in.eof()){
			 for(i=0; i<16 && !in.eof(); i++) {
			   in.get(c[i]);
   }
if(i<16) i--;
for(j=0; j<i; j++)
cout << setw(3) << hex << (int) c[j];
for(; j<16; j++) cout << "  ";
cout << "\t";
for(j=0; j<i; j++)
if(isprint(c[j])) cout << c[j];
else cout << ".";
cout endl;
	  count++;
if(count=16) {
count=0;
cout << "Press ENTER to continue: "'
cin.get();
cout << endl;
}
}
in.close();
return 0;
}
 
Ответить с цитированием

  #25  
Старый 23.06.2007, 19:15
ZaCo
Banned
Регистрация: 20.06.2005
Сообщений: 880
Провел на форуме:
4610226

Репутация: 1332


По умолчанию

штука наверняка не новая, но новичкам может быть пригодится: если возникает трудность с использованием модульности (дополнительных длл-плагинов) в своей программе, а именно в обработке плагином, например, своего объекта (так как по-хорошему мы не знаем как он представляется в памяти и видимо не должны знать по причине того, что плагин может быть написан абсолютно на чем угодно), то можно написать свою дополнительную длл, которая имеет набор функций по созданию\обработке обьекта (да хоть переменной какой-то структуры) в пространстве процесса из которого происходила загрузка сего и ее использовать как плагинной так и основной частью программы.
 
Ответить с цитированием

  #26  
Старый 23.06.2007, 19:56
[53x]Shadow
Leaders of Antichat
Регистрация: 25.01.2007
Сообщений: 341
Провел на форуме:
3372120

Репутация: 2565
По умолчанию

Функция-шаблон считывания из потока n байт.
Написал специально для удобства работы с различными потоками в stl. Так, например, нет стандартного метода считывания n байт из объекта ifstream в string в stl.


Код:
template
	<
		typename InputIterator,
		typename OutputIterator
	>
	void readn(InputIterator begin, InputIterator end, int n, OutputIterator out)
	{
		for(;n > 0 && begin != end;--n, ++begin, ++out)
		{
			*out = *begin;
		}
	}
 
Ответить с цитированием

  #27  
Старый 24.06.2007, 14:29
ZaCo
Banned
Регистрация: 20.06.2005
Сообщений: 880
Провел на форуме:
4610226

Репутация: 1332


По умолчанию

Будь-то программирование на winapi, будь-то программирование на posix при создании многопоточного приложения одинаково часто возникает неудобство выраженное в виде невозможности стандартным образом передать своей функции через CreateThread/pthread_create более одного аргумента. Пример двух используемых функций по вин thread.c:
Код:
/*
 thread.c by ZaCo
*/

#include <windows.h>
//вспомогательная функция-поток из которой вызываем запрашиваемую функцию

void * Thread(int * temp)
 {
  void * func=(void *)(*temp);//вызываемая функция
  temp++;                     //переходим к следующему адресу
  int num=*(int *)temp;       //кол-во аргументов

  int i;

  temp+=num;                 //сдвигаемся просто до конца тк аргументы нужно передавать задом-наперед ;)

  for(i=num-1;i>=0;i--,temp--)
   {
    int * param=*(int **)temp;//каждый раз получаем нужный адрес
    _asm push param;
   }

  delete [2+num] (temp-1);    //освобождаем память выделенную в NewThread

  _asm call func;             //вызываем функцию
  return NULL;
 }

//функция создания потока: func - функция, num - кол-во аргументов-указателей после num

void * NewThread(void * func, unsigned int num, ...)
 {
  int * temp=new int[2+num];  //temp - массив адресов которые  в итоге нужно передать функции-потоку
  memcpy(temp,&func,(2+num)*sizeof(void*));

  CloseHandle(CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread,temp,0,NULL));
 }
//
Работа в основной программе:
Код:
#include <stdio.h>
void * NewThread(void *, unsigned int, ...);
void * Thread(int *);
#include "thread.c"

void * func(int * a,char * b,int * c, char * s)
 {
  printf("%d+%d+%d+%s\n",*a,*b,*c,s);
  return NULL;
 }

int main(int argc, char* argv[])
{
 int a=5,b=7,g=4;
 char s[]="it's xek!";

 NewThread(func,4,&a,&b,&g,&s[0]);

 Sleep(1000);
 return 0;
}
 
Ответить с цитированием

  #28  
Старый 27.06.2007, 15:15
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме:
5339610

Репутация: 4360


Отправить сообщение для _Great_ с помощью ICQ
По умолчанию

Для Microsoft Visual Studio 7 (она же 2003 .NET):

Если нет желания таскать за собой рантайм в том или ином виде, а при его отключении линкер орёт на неразрешенные ссылки на __chkstk, ___securitycookie и @__security_check_cookie@4, можно обойтись следующей реализацией этого (писал сам )

Код:
// будем тока выделять место в стеке под переменные
extern "C" __declspec(naked) void _chkstk()
{
	__asm
	{
		// Enter: EAX = size

		xor ebx, ebx
		xchg [esp], ebx  // запоминаем адрес возврата
		add esp, 4  // удаляем его
		sub esp, eax  //  выделяем место
		push ebx  // кладем адрес возврата на место и возвращаемся
		retn
	}
}

// любое число, в принципе, но чтобы оно было "случайное", а не вида 00010000.
// хороший вариант - 19237845 или BACBBAFD или что-нибудь в этом роде
extern "C" DWORD_PTR __security_cookie = 0x5F8E34B0;

// проверка на переполнение буфера
extern "C" void _fastcall __security_check_cookie(DWORD_PTR cookie)
{
	if(__security_cookie != cookie)   // можно добавить ченить более умное при ошибке
		__asm int 3;
}

Последний раз редактировалось _Great_; 27.06.2007 в 15:18..
 
Ответить с цитированием

Stl/c++
  #29  
Старый 15.08.2007, 11:58
[53x]Shadow
Leaders of Antichat
Регистрация: 25.01.2007
Сообщений: 341
Провел на форуме:
3372120

Репутация: 2565
По умолчанию Stl/c++

Преобразование из string в int с контролем целостности

Код:
bool to_number(char const* beg, int sz, int& num)
	{
		char* end = 0;
		int tmp_num = ::strtol(beg, &end, 10);
		if(end != beg + sz)
		{
			return false;
		}
		num = tmp_num;
		return true;
	}
use:
Код:
std::string value;
int num;
if (!to_number(value.c_str(), value.size(), num))
         return false;
 
Ответить с цитированием

  #30  
Старый 07.09.2007, 01:00
Piflit
Banned
Регистрация: 11.08.2006
Сообщений: 1,522
Провел на форуме:
5128756

Репутация: 2032


Отправить сообщение для Piflit с помощью ICQ
По умолчанию

что правильнее при написании malware и почему: сначала полностью писать тулзу, а потом править ее так, чтобы не детектилась ав или брать хелло ворлд и добавлять к нему по одной функции на каждом шаге проверяя, что наша прога не палится?
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
10 tips & tricks for C/C++ windows programming with Visual C++ 6.0 Dracula4ever Forum for discussion of ANTICHAT 0 30.05.2006 17:11



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ