RDot: White Hat Security Community

RDot: White Hat Security Community (https://rdot.org/forum/index.php)
-   Software development (https://rdot.org/forum/forumdisplay.php?f=19)
-   -   [ASM / C++] превращение DLL ) (https://rdot.org/forum/showthread.php?t=1308)

NetSter 15.03.2011 07:15

[ASM / C++] превращение DLL )
 
Всем привет.
Вот наткнулся на проблемку) надеюсь тут мне раздуплят)
есть необходимость писать кучу разных ДЛЛ для основного проекта.
основное требование написание на С++ со вставками АСМ кода.
в итоге должна получатся структура на подобии этой (тупо рандомный пример, показать как по стандарту должно быть)
Код:

#include "stdafx.h"

int Calc(int *mas,int imax,int jmax,int j)
{
    int res, step=4,source,teg;
    _asm{
                finit
                mov eax,0
                mov eax,j
                dec eax
                mul step
                mov esi,eax
                mov eax,0
                mov eax,jmax
                mul step
                mov source,eax
                mov eax,0
                mov ebx,mas
                add ebx,esi
                mov ecx,imax
        label:    mov eax,[ebx]
                mov teg,ecx
                mov ecx,0
                mov ecx,7h
                div ecx
                cmp edx, 0
                jz yes   
                jmp post
        yes:    inc res                   
        post:    add ebx,source
                mov edx,0
                mov ecx,teg       
                loop label
        }
    return res;
}

теперь самое сладенькое
асм я не шарю а длл все равно нужно писать)
что я делаю
пишу длл на С++ и потом дезасемблирую.
вот пример кода либы на С++

Код:

#include "stdafx.h"
#include <conio.h>

int calc (int *mas, int m)
{
        int min=mas[0];
        for (int i=1;i<m;i++)
    if (min>mas[i])  min=mas[i];
  return min;
}

Код:

LIBRARY      "MyDll"
DESCRIPTION 'This library has one function'
EXPORTS
  calc @1

после скормления IDA получили подобие либы на асме, но ясен пень нерабочее)
вот оно

Код:

#include "stdafx.h"
#include <conio.h>

int calc (int *mas, int m)
{
        _asm{
//=====================================================

; int __cdecl calc(int *, int)
public ?calc@@YAHPAHH@Z
?calc@@YAHPAHH@Z proc near

arg_0= dword ptr  4
arg_4= dword ptr  8

mov    ecx, [esp+arg_0]
mov    eax, [ecx]
xor    edx, edx
inc    edx
cmp    [esp+arg_4], edx
jle    short locret_10001021
push    esi
loc_10001010:
mov    esi, [ecx+edx*4]
cmp    eax, esi
jle    short loc_10001019
mov    eax, esi
loc_10001019:
inc    edx
cmp    edx, [esp+4+arg_4]
jl      short loc_10001010
pop    esi
locret_10001021:
retn
?calc@@YAHPAHH@Z endp
//====================================================

}
}

вот пацаны опишите кто шарит плиз как мне умудрится делать либы с помощью рабочих либ на С++ и IDA ?
Заранее очень благодарен)

paranoidchaos 15.03.2011 20:05

а g++ -S не поможет ?
у вашего компилятора должна быть опция -S которая говорит ему чтобы он не создавал обджек файл а просто сохранил асм код полученный компилятором

paranoidchaos 15.03.2011 20:06

и ваще какой в этом смысл если вы не разбираетесь в асм ?

M@ZAX@KEP 15.03.2011 20:47

Цитата:

и ваще какой в этом смысл если вы не разбираетесь в асм ?
Включаем экстрасенсорные способности... задание в универе у него такое. Иначе такие извраты не объяснить))

paranoidchaos 15.03.2011 20:53

может вы на асм лучше напишите чем это сделает компилятор ?

1nt 16.03.2011 00:08

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

#include <windows.h>

BOOL APIENTRY DllMain (HINSTANCE hInst    /* Library instance handle. */ ,
                      DWORD reason        /* Reason this function is being called. */ ,
                      LPVOID reserved    /* Not used. */ )
{
    switch (reason)
    {
      case DLL_PROCESS_ATTACH:
        break;

      case DLL_PROCESS_DETACH:
        break;

      case DLL_THREAD_ATTACH:
        break;

      case DLL_THREAD_DETACH:
        break;
    }

    /* Returns TRUE on success, FALSE on failure */
    return TRUE;
}

Соответственно, чтобы библиотека была рабочей, функцию calc нужно описать и использовать в DLL_PROCESS_ATTACH. Асм код получается без проблем ключом "-s", описанным выше.


Часовой пояс GMT +3, время: 08:50.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd. Перевод: zCarot