2017-02-01 9 views
4

私は最近リバースエンジニアリングを行うためにアセンブリを学び始めました。私はPractical Reverse Engineeringを読み、そこに、このアセンブリコードを見ている:"実用的なリバースエンジニアリング"のコードにはエラーが含まれていますか、または私はループの構成を誤解していますか?

loop_start:  
    mov eax, [edi+4] 
    mov eax, [eax+ebx*4] 
    test eax, eax 
    ... //They also did the dots here 
    jz short loc_7F627F 
loc_7F627F: 
    inc ebx 
    cmp ebx, [edi] 
    jl short loop_start 

そして、彼らは(私は彼らがそれをやった正確にすべてのドットをやっている)、このにそれを逆コンパイルするために、この情報は私たちにアイデアを与える必要があることを告げました:EAXの内容がゼロであった場合

typedef struct _Foo 
{ 
    DWORD size; 
    DWORD array[...];} FOO, *PFOO; 

    PFOO bar= ...; 

    for(i= ...; i < bar->size; i++) 
    { 
    if(bar->array[i] != 0){ 
    ... 
    } 
} 

しかしjz short loc_7F627Fなどにのみジャンプします...jz後ではなくjz前にすべきではありませんか?そうでなければ、eaxの内容をテストして、それがゼロであるかどうかを調べ、それからゼロであれば何か不明なものを実行します(...に含まれる他の命令がZFフラグに影響していない場合)。彼らが書いたCコードと一致する。

+3

はい、正しいです。 '...'は 'jz'の後に置かなければなりません。おかしい、あなたがリンクしたウェブサイトには、おそらくエラーを提出することができるフォームへのリンクがありますが、無駄にホームページにリダイレクトされます。 :-( –

+1

この本には、ほとんどの本のように大きな正誤表があります。[パブリッシャーのサイト](http://www.wiley.com/WileyCDA/WileyTitle/productCd-1118787315,subjectCd-CSJ0)でリストを確認してください。 html)を追加してください。 –

答えて

5

この部分:

loc_7F627F: 
inc ebx 
cmp ebx, [edi] 
jl short loop_start 

がに変換します:

if(bar->array[i] != 0){ 
    ... 
} 

for(i= ?; i < bar->size; i++){ 
    //do something 
    } 
} 

この部分

mov eax, [edi+4] 
mov eax, [eax+ebx*4] 
test eax, eax 
... //They also did the dots here 
jz short loc_7F627F 

に変換(しません)

あなたは正しいです。
...は、array[i] <> 0であるため、アセンブリステートメントの...は、jz skip_to_next_loop_iterationの後でなければなりません。

通常、...の後にloc_7F627Fに無条件でジャンプする必要があります。しかし、この場合、最初の...の後のコードは、forループに入ることができます。

関連する問題