私は最近リバースエンジニアリングを行うためにアセンブリを学び始めました。私は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コードと一致する。
はい、正しいです。 '...'は 'jz'の後に置かなければなりません。おかしい、あなたがリンクしたウェブサイトには、おそらくエラーを提出することができるフォームへのリンクがありますが、無駄にホームページにリダイレクトされます。 :-( –
この本には、ほとんどの本のように大きな正誤表があります。[パブリッシャーのサイト](http://www.wiley.com/WileyCDA/WileyTitle/productCd-1118787315,subjectCd-CSJ0)でリストを確認してください。 html)を追加してください。 –