Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

Видеокурс программиста и крэкера 5D 2O17
(актуальность: декабрь 2O17)
Свежие инструменты, новые видеоуроки!

  • 400+ видеоуроков
  • 800 инструментов
  • 100+ свежих книг и статей

УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Исследование Natata Ebook Compiler Книг (версия < 3)

Обсудить статью на форуме

Хорошая подборка видеоуроков, инструментов крэкера, книг и статей - здесь.

Автор: punxer <punxer@ya.ru>

Исследование Natata Ebook Compiler Книг (версия < 3)

В этой статье мы поговорим об исследовании сборщика e-book’ов в исполняемый файл, который так же позволяет задать пароль на просмотр книги и предлагает отправить смс, что нам совсем никчему.
Итак начнем. PEiD говорит нам что там UPX и overlay.
UPX 0.89.6 - 1.02 / 1.05 - 2.90 -> Markus & Laszlo [Overlay]
Снимем UPX там же- Generic PEID Unpacker. Трудностей это вызвать не должно.
Посмотрим на распакованный файл, он написан на делфи:
Borland Delphi 6.0 - 7.0 говорит нам PEID.
Ну делфи, так делфи, берем в руки DEDE и пристально изучаем файл, самое главное не удаляйте первоначальный файл, он нам еще понадобится)

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

Неспроста тут эта строчка-ZLibEx.
Итак имеем непонятный оверлей и предположение что он пожат Zlib.

Сохраним с помощью PEID оверлей и будем дальше работать с ним. Как оказалось структура его не так уж и сложна. Откроем его в любом, любимом вам, HEX редакторе.
Оверлей сохраняем с оригинального exe файла.


Посмотрев внимательно можно выделить сигнатуры начала и конца определенного ресурса: начало- #1!#XSE1.NATC и завершающий байт B6, конец- !2!#XSE1.NATC
Красным выделено имя ресурса, что ,кстати, и является относительным путем к файлу и названием(именем) файла.
Между этими маркерами и спрятаны ресурсы, вытащим первый и сохраним в произвольный файл.
Набросаем небольшой кодес и попробуем распаковать сие. То, что мы получили просто запакованный буфер с данными. Распакованного размера мы не знаем, так как никаким заголовком там и не пахнет. Код распаковки тривиален.

BOOL	uncompress_save	(PCHAR v_path,PCHAR buff,ULONG len)
{
	//return true;
	PCHAR		unc_buff	=NULL;
	DWORD		ret			=NULL;
	uLongf		u_len		=len;
	size_t		written		=NULL;
	FILE*		file		=NULL;
	z_stream	zstrm;
	char		curdir[255];
	

	unc_buff=new CHAR[len*100];

	show_error("Expanding...");
	//we must know real uncompressed size, fuck.
	zstrm.zalloc = Z_NULL;
	zstrm.zfree = Z_NULL;
	zstrm.opaque = Z_NULL;
	zstrm.avail_in = len;
	zstrm.next_in = Z_NULL;
	inflateInit(&zstrm);
	
	zstrm.next_in=(Bytef *)buff;
	
	zstrm.avail_out = len*100;
	zstrm.next_out = (Bytef *)unc_buff;
	ret=inflate(&zstrm,Z_NO_FLUSH);
	
	
	
	
	
	
	switch (ret)
	{
		case Z_OK:
			u_len=zstrm.total_out;
			inflateEnd(&zstrm);

			show_error("OK");
			break;
		case Z_STREAM_END:
			u_len=zstrm.total_out;
			inflateEnd(&zstrm);

			show_error("OK");
			break;
		default:
			_asm int 3;
			break;
	}



	show_error("Saving...");
	fopen_s(&file,v_path,"wb");
	written=fwrite(unc_buff,sizeof(BYTE),u_len,file);
	if (written!=u_len)
	{
		show_error("Write Error.");
		show_error(v_path);
		return false;
	}
	fflush(file);
	fclose(file);
	return true;
}
На выходе получим распакованный файл, который будет файлом настроек программы.
Следующие буфера будут содержать страницы книги и сопутствующие файлы, например рисунки.

// Natater.cpp : Defines the entry point for the console application.

#define ZLIB_DLL
#define MAX_LENGTH 255

#include 
#include 
#include 
#include 
#include 
#include 
#include "zlib.h"
#include 
#include  

using namespace std;


VOID	print_hello			(VOID);
DWORD	file_size			(VOID);
DWORD	ovr_size			(VOID);
PBYTE	ovr_begin			(VOID);
BOOL	check_format			(VOID);
DWORD	image_size			(VOID);
VOID	show_error			(LPSTR);
BOOL	uncompress_save		(PCHAR,PCHAR,DWORD);
BOOL	name_from_path		(PCHAR* name, PCHAR path);
PCHAR	prepare_path			(PCHAR path);
bool	path_exist			(PCHAR path);
int 	make_sure_path_exists( const char *iPath,bool FilenameIncluded);


HANDLE	hFile=		NULL;
PTCHAR	in_file=	NULL;
LPVOID	hMap=		NULL;
PCHAR	exe_path=	NULL;

int _tmain(int argc, _TCHAR* argv[])
{
	//**********************************
	//SIGNATURES::
	//#1!#NAME0xB6	begin
	//!2!#NAME		end
	//***********************************
	
	PCHAR	data_buff=NULL;
	HANDLE	hMappingObj=NULL;
	BOOL	f_end=FALSE;
	CHAR	res_name[MAX_LENGTH];
	PBYTE	ptr=NULL;
	PBYTE	ptr_res=NULL;
	PBYTE	ptr_B6=NULL;
	PBYTE	ptr_end_res=NULL;
	DWORD	res_name_len=NULL;
	DWORD	res_len=NULL;
	BYTE	sig_begin[]={'#','1','!','#'};
	BYTE	sig_begin_end=0xB6;
	BYTE	sig_end[]={'!','2','!','#'};
	DWORD	ret=NULL;
	
	exe_path=(PCHAR)argv[0];

	//check args, it must be one
	if (argc!=2) 
	{
		print_hello();
		_getch();
		return 0;
	}
	

	in_file=argv[1];
	hFile=CreateFile(in_file,FILE_READ_DATA,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	if (hFile == INVALID_HANDLE_VALUE)
		return 0;
	hMappingObj=CreateFileMapping(hFile,NULL,PAGE_READONLY,NULL,NULL,NULL);
	if (!hMappingObj)
		return 0;
	hMap=MapViewOfFile(hMappingObj,FILE_MAP_READ,NULL,NULL,NULL);
	if (!hMap)
		return 0;
	if (!check_format()) 
		return 0;
	
	ptr=(PBYTE)hMap;	
	
	ptr_res=ovr_begin();
	res_len=ovr_size();
	//need close handles

	show_error("Enumerating resources:");

	ptr=ptr_res;
	while (!f_end)
	{	
		
		while ((*ptr!=sig_begin[0]) && ((DWORD)ptr<((DWORD)hMap+file_size())))
			ptr++;
		if ((DWORD)ptr>=((DWORD)hMap+file_size()))
		{
			show_error("Data not found. Exiting.");
			_getch();
			return 0;
		}
		ret=memcmp(ptr,sig_begin,sizeof(DWORD));
		
		
		if (!ret)
		{
			ptr_res=ptr;
			while ((*ptr!=sig_begin_end) && ((DWORD)ptr<((DWORD)hMap+file_size())))
				ptr++;
			if ((DWORD)ptr>=((DWORD)hMap+file_size()))
			{
				show_error("Data not found. Exiting.");
				_getch();
				return 0;
			}			
			res_name_len=(DWORD)ptr-(DWORD)ptr_res-sizeof(DWORD);
			memcpy(res_name,(PVOID)((DWORD)ptr_res+sizeof(DWORD)),res_name_len);
			res_name[(DWORD)ptr-(DWORD)ptr_res-sizeof(DWORD)]=0x0;
			show_error((LPSTR)res_name);
			ptr_B6=ptr;
			while (0!=(memcmp(ptr,sig_end,sizeof(DWORD))) && ((DWORD)ptr<((DWORD)hMap+file_size())))
				ptr++;

			if ((DWORD)ptr>=((DWORD)hMap+file_size()))
			{
				show_error("Data not found. Exiting.");
				_getch();
				return 0;
			}
			ret=memcmp((LPVOID)((DWORD)ptr+sizeof(DWORD)),res_name,res_name_len);
			if (!ret)
			{
				//end of resource found
				res_len=(DWORD)ptr-(DWORD)ptr_B6-1;
				ptr_res=(PBYTE)((DWORD)ptr_B6+1);
				data_buff=new CHAR[res_len];
				memcpy(data_buff,ptr_res,res_len);
				//prepare root directory
				show_error(res_name);

				//ret=uncompress_save(res_name,data_buff,res_len);
				if (!ret)
				{
					show_error("An error occured. Cant save resource. Quiting.");
					_getch();
					return 0;
				}
			}
		}
		else ptr++;
	}


	CloseHandle	(hFile);
	CloseHandle (hMappingObj);
	CloseHandle (hMap);
	return 0;
}

void print_hello(void)
{
	cout<<"Natata ebook decompression utility."<e_lfanew);
	return 
		(DWORD)pPe->OptionalHeader.SizeOfImage;
}

DWORD	ovr_size(void)
{
	DWORD fsize=file_size();
	DWORD isize=image_size();
	return 
		(file_size()-image_size()-1);
}
PBYTE	ovr_begin(void)
{
	DWORD isize=image_size();
	return 
		(PBYTE)((DWORD)hMap+image_size());
}

BOOL check_format(void)
{
	PIMAGE_DOS_HEADER pImg;
	PIMAGE_NT_HEADERS pPe;
	pImg=(PIMAGE_DOS_HEADER)hMap;
	if (pImg->e_magic!=IMAGE_DOS_SIGNATURE)
		return false;
	pPe=(PIMAGE_NT_HEADERS)((DWORD)pImg+pImg->e_lfanew);
	if (pPe->Signature!=IMAGE_NT_SIGNATURE)
		return false;
	return true;
}
VOID	show_error	(LPSTR err_str)
{
	cout<=0;i--);
	


	return true;


}


PCHAR prepare_path(PCHAR path)
{
	
	return NULL;

}

bool path_exist(PCHAR path)
{
	DWORD ret=NULL;

	ret=GetFileAttributesA(path);
	if (ret==INVALID_FILE_ATTRIBUTES)
		return false;
	

	return true;
}



int make_sure_path_exists( const char *iPath,bool fnameIncluded=true)
{
   char *Path=(char*)iPath, 
        *TmpPath=Path, 
        TmpSmb=0,
        *LastDPtr=NULL;
   while((TmpPath=strpbrk(TmpPath+1,"\/")))
   {
      TmpSmb=Path[TmpPath-Path];
      Path[TmpPath-Path]=0;
      CreateDirectoryA(Path,NULL);
      Path[TmpPath-Path]=TmpSmb;
      LastDPtr=TmpPath;
   }

   int Res=1;
   if(!FilenameIncluded)
   {
      CreateDirectoryA(iPath,NULL);
      Res=!_access(iPath,0);
   }
   else
   {
      if(LastDPtr)
      {
         Path=(char*)iPath;
         TmpSmb=Path[LastDPtr-Path];
         Path[LastDPtr-Path]=0;
         Res=!_access(Path,0);
         Path[LastDPtr-Path]=TmpSmb;
      }
   }
   
   return Res;
}
Программа сохраняет первые несколько ресурсов и падает, это всего лишь пример анализа а не кряк. Так что довольствуемся идеей и списком файлов в книге. Доделать для распаковки не составит труда.




Обсуждение статьи: Исследование Natata Ebook Compiler Книг (версия < 3) >>>


Комментарии к статье: Исследование Natata Ebook Compiler Книг (версия < 3)

punxer 07.07.2010 18:40:37

---

Материалы находятся на сайте https://exelab.ru



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS