Q&A

  • VC++ 로 제작된 DLL 호출시
안녕하세요

VC++ 로 제작된 암호화/복호화 DLL 을 델파이에서 호출하려는데
잘 되지 않아 문의 드립니다.

아시는 분은 답변 부탁드립니다.

VC++ 의 함수 원형은 다음과 같습니다.

1. 패킷 구조
:아래와 같이 4byte의 int형 data 사이즈 정보 후에 그 사이즈 만큼의 암호화된 data가 따라오는 구조입니다.
[encrypted data의 길이 : 4byte][encrypted data]

2. 암호화 복호화 방법
1) 암호화 방법 : EncDec.dll 의
  extern "C" __declspec(dllexport) int EncryptPacket(BYTE *SrcBuf, BYTE *DstBuf, int SrcLen);
  함수 사용
  SrcBuf : 암호화 할 패킷 Data
  DstBuf : 암호화된 결과를 리턴하는 버퍼 로 최소 (SrcLen + 64) 이상의 사이즈를 가져야한다.
  SrcLen : SrcBuf 의 사이즈
  리턴값 : 암호화된 결과 버퍼(DstBuf) 의 사이즈

2) 복호화 방법 : EncDec.dll 의
  extern "C" __declspec(dllexport) void DecryptPacket(BYTE *SrcBuf, BYTE *DstBuf, int SrcLen)
  SrcBuf : 암호화된 패킷 Data 즉, 1.번 EncryptPacket 에 의해 암호화된 Data부분을 의미함
  DstBuf : 복호화된 패킷 Data , DstBuf의 사이즈는 SrcBuf와 같은 크기를 가지면 됩니다.
  SrcLen : 암호화된 패킷 Data의 크기, 즉, 1.번 패킷 구조에 정의된 첫 4byte 를 의미함.

3. 암호화 또는 복호화할 패킷의 종류
  1) 로그인 요청 패킷:
struct cmd_login{
        short        cmd;//1:로그인 커맨드를 의미
        BYTE id[30];//사용자 id
        BYTE pass[30];//사용자 password
        
        cmd_login(){cmd=1;};
};

아래는 제가 델파이로 테스트 코딩한 부분입니다.
일단 문자열을 암호화 한 후 다시 복호화 하는 건데요...

<!--CodeS-->
function EncryptPacket(SrcBuf: PChar; var DstBuf: PChar; SrcLen: integer): Integer; cdecl; external 'EncDec.dll';
procedure DecryptPacket(SrcBuf: PChar; var DstBuf: PChar; SrcLen: integer); cdecl; external 'EncDec.dll';

type
  Tcmd_login = packed record
    cmd: SHORT;                  //1:로그인 커맨드를 의미
    id: array[0..29] of Char;    //사용자 id
    pass: array[0..29] of Char;  //사용자 password
    cmd_login: SHORT;            //{cmd=1;}
  end;
  pcmd_login = ^Tcmd_login;


procedure TfrmPrintServer.Button1Click(Sender: TObject);
var
   sSrcData, sDstData: string;
   sPSrcData: PChar;
   sPDstData, sPSrcData2: PChar;
   nSrcLen: integer;

   nPacketLength, nEnPacket: integer;
   pLoginData: pcmd_login;
begin
   try
      sSrcData := '테스트';
      nPacketLength := Length(sSrcData);

      sPSrcData := PChar(sSrcData);

      New(sPDstData);
      New(sPSrcData2);
      nEnPacket := EncryptPacket(sPSrcData, sPDstData, nPacketLength);

      DecryptPacket(sPDstData, sPSrcData2, nEnPacket);    //<=== 요기서 Access Violation

      sDstData := String(sPSrcData2);

      ShowMessage(sDstData);
   finally
      Dispose(sPSrcData2);
      Dispose(sPDstData);
   end;
end;

<!--CodeE-->

이 부분이 테스트 되어야 실제 data인 struct 구조체를 주고 받을 수 있을 것 같은데요

struct 구조체는 record 타입으로 변경하면 된다고 하던데...

이 부분도 막막하기만 합니다만.

며칠을 헤메어도 아직 테스트에 대한 답도 얻지 못하고 있습니다.

항상 이런 부분에서는 초보인것 같습니다.

고수님들 답변 부탁드립니다.

그리고, 첨부파일로 해당 DLL 을 첨부했습니다. 부탁드립니다
3  COMMENTS
  • Profile
    KDDG_Hit 2009.04.03 05:48
    암호화, 복호화 함수에 넣어주는 파라미터를 일반 Char 배열로 선언하셔되 될거 같은데요.


    sPSrcData : array [0..256] of Char;

    이런형식으로 선언하시고요.. 배열 사이즈는 레코드 크기정도로 넉넉하게 주시고요.

    지금 코드에서 에러가 나는건 사이즈에 관련된게 아닐까 싶네요.
  • Profile
    이상탁 2009.04.03 06:08
    실제로는 위의 struct 타입 데이터를 VC++ DLL 에 assign 해야 하는데 그 부분이 막막하네요


    struct 타입을 record 로 변경했는데 그것도 맞는지 모르겠구요

    그냥 막막합니다
  • Profile
    이상탁 2009.04.16 06:53
    답변 감사합니다.

    pointer 라는 타입으로 또한 array 타입으로 처리하여 어찌어찌해결하였습니다.

    많은 도움되었습니다.