2013-09-21 1 views
3

나는 더 큰 프로그램에서 사용할 수 있도록 일부 Perl 코드를 해독하여 C# 코드로 변환하려고 최선을 다하고있다. 나는 그것의 대부분은 변환 얻을 수있었습니다 만, 다음의 방법에 문제가 오전 : 나는이 부분을 제외하고 그것의 대부분을 이해Obserfucated Perl method 이해하는데 문제가있다.

$sid = 0; 
$rand = pack("H*", 'feedfacedeadbeef1111222233334444'); 
$skey = dynk($rand, $sid, 2, 3)^dynk(substr($dbuf, 0, 16), $sid, -1, -4); 

: 그것은 같은이라고

sub dynk { 
    my ($t, $s, $v, $r) = (unpack("b*", $_[0]), unpack("b*", pack("v",$_[1]))); 
    $v^=$t=substr($t,$r=$_*$_[($_[1]>>$_-1&1)+2]).substr($t,0,$r)^$s for (1..16); 
    pack("b*", $v); 
} 

를 :
$_*$_[($_[1]>>$_-1&1)+2]

어떻게하면 $ _이 (가) 해당 컨텍스트에서 사용되는지 모르겠습니다. 누군가가 그것을 설명 할 수 있다면, 나는 나머지를 얻을 수 있다고 생각합니다.

+2

해야 할 일에 대한 세부 정보를 추가하십시오. –

+1

http://perldoc.perl.org/functions/unpack.html 같은 사이트에서 다른 함수와 메소드에 대한 더 많은 문서를 찾을 수있을 것입니다. 필자는 perl을 약간 알고 있지만 솔직히 저의 지식으로 변환 할 수는 없습니다. –

답변

5

packunpack은 패턴 및 일부 데이터를 취하여 패턴에 따라이 데이터를 변환합니다. 예를 들어 pack "H*", "466F6F"은 데이터를 임의 길이의 16 진수 문자열로 처리하고이를 나타내는 바이트로 디코딩합니다. 여기 : Foo. unpack 함수는 역순으로 수행하고 이진 표현에서 특정 형식으로 데이터를 추출합니다.

패턴 스탠드는 비트 문자열 unpack "b*", "42""0010110001001100" 인 패턴을 생성합니다.

v은 하나의 리틀 엔디안 16 비트 정수를 나타냅니다.

Perl은 다소 난독 화되어 있습니다. 다음은 몇 가지 측면을 단순화 한 재 작성입니다.

sub dynk { 
    # Extract arguments: A salt, another parameter, and then two ints that determine rotation. 
    my ($initial, $sid, $rot_a, $rot_b) = @_; 

    # Unpack the initial value to a bitstring 
    my $temp = unpack("b*", $initial); 
    # Unpack the 16-bit number $sid to a bitstring 
    my $sid_bits = unpack("b*", pack("v", $sid)); 
    my $v; # an accumulator 

    # Loop through the 16 bits of our $sid 
    for my $bit_number (1..16) { 
    # Pick the $bit_number-th bit from the $sid as an index for the data 
    my $bit_value = substr($sid_bits, $bit_number-1, 1); 
    # calculate rotation from one data argument 
    my $rotation = $bit_number * ($bit_value ? $rot_b : $rot_a); 
    # Rotate the $temp bitstring by $rotation bits 
    $temp = substr($temp, $rotation) . substr($temp, 0, $rotation); 
    # XOR the $temp with $sid_bits 
    $temp = $temp^$sid_bits; 
    # ... and XOR with the $v accumulator 
    $v = $v^$temp; 
    } 

    # Pack the bitstring back to binary data, return. 
    return pack("b*", $v); 
} 

이것은 일종의 암호화 또는 해싱 인 것 같습니다. 주로 다음 인수에 따라 첫 번째 인수를 뒤죽박죽입니다. $sid이 클수록 더 많은 매개 변수가 사용됩니다. 하나 이상, 많아야 16입니다. 각 비트는 차례대로 인덱스로 사용되므로 두 개의 추가 매개 변수 만 사용됩니다. 첫 번째 인수의 길이는이 작업에서 일정하게 유지되지만 출력은 적어도 2 바이트 길이입니다.

추가 인수 중 하나가 0이면 해당 루프 반복 중에 회전이 발생하지 않습니다. unititializes 인수는 0으로 간주됩니다.

+0

난독 화 시도에서 적어도 두 가지 오류가 발생했습니다. 당신은 (1) 비트와 (@)'@ data' 인덱스의 1 ('& 1')을 잊었고 (2) 루프의 끝에'$ sid_bits'를 XORing 한 결과에'$ temp'를 설정했습니다. – nwellnhof

+0

@nwellnhof 잘 찾아 냈습니다. 귀하의 설명은 업데이트 된 답변에 반영되어 있으므로이를 이해하는 데 도움이되었습니다. – amon

관련 문제