Soru:
IDA PRO Hex-Rays 1.5 sözde kod anlama - = 0x3FFFFFFFu; + = 0x3FFFFFFFu;
SSpoke
2014-09-21 06:23:54 UTC
view on stackexchange narkive permalink

Sözde kodu, orijinal kodla tam olarak aynı olmasa da benzer şekilde derlemesi ve çalışması için temizlemeye çalışıyorum.

Buna benzeyen bu bit, bulunduğum çeşitli yerlerde tam olarak ne anlama geldiğini anlamaya çalışıyorum.

  if (ZonePlayerCount > 0) {v3 = 0; v4 = 0; v5 = playerPointerList; v6 = &playerPointerList [1]; do {if (* (unsigned int *) & (* v5) ->IPAddressDWORD.S_un.S_un_b.s_b1 == IPAddress && (* v5) ->Port == Bağlantı koptuğu için bağlantı noktası) {printf (bağlantı noktası) başka bir bağlantı \ n "); sub_41CBD0 ((int) & (* v5) ->encryptionPointer->ConnectionStatus); Bellek = * v5; eğer (* v5) {DisconnectUser (* v5); Boş hafıza); } --ZonePlayerCount; memcpy (v5, v6, 4 * (v4 + ZonePlayerCount)); --v3; v4 - = 0x3FFFFFFFu; v6 = (karakter *) v6 - 4; --v5; } ++ v3; v4 + = 0x3FFFFFFFu; v6 = (karakter *) v6 + 4; ++ v5; } while (v3 < ZonePlayerCount); }  

Bunun gibi diğer yerler ..

  v1 = 0; eğer (ArenaArrayLength > v1) {v18 = 0; v19 = Arenalar; v20 = &Arenas [1]; do {if (ProcessArena (* v19)) {if ((* v19) ->ArenaName [0]) WriteSubGameLog ("Özel alan bırakıldı:% s \ n", (* v19) ->ArenaName); else WriteSubGameLog ("Arena düştü \ n"); bufa = * v19; eğer (* v19) {ShutdownArena (* v19); ücretsiz (bufa); } --ArenaArrayLength; memcpy (v19, v20, 4 * (v18 + ArenaArrayLength)); --v1; v18 - = 0x3FFFFFFFu; v20 = (karakter *) v20 - 4; --v19; } ++ v1; v18 + = 0x3FFFFFFFu; v20 = (karakter *) v20 + 4; ++ v19; }
while (v1 < ArenaArrayLength); }  

Burada verdiğim ilk sözde kod parçası için derleme.

  .text: 00412D7B mov esi, offset playerPointerList.text: 00412D80 mov ebx, (ofset playerPointerList + 4) .text: 00412D85.text: 00412D85 loc_412D85:; KOD XREF: NewConnectionRequest + C0j.text: 00412D85 mov eax, [esi] .text: 00412D87 mov ecx, [esp + 20h + IPAddress] .text: 00412D8B cmp [eax + 2F3h], ecx.text: 00412D91 jnz short loc_412DFC. text: 00412D93 mov dx, [esp + 20h + Port] .text: 00412D98 cmp [eax + 2F7h], dx.text: 00412D9F jnz short loc_412DFC.text: 00412DA1 push offset aConnectionIsBrok; "Aynı ip / bağlantı noktası nedeniyle bağlantı koptu" .... metin: 00412DA6 _printf.text: 00412DAB mov eax, [esi] .text: 00412DAD add esp, 4.text: 00412DB0 mov ecx, [eax + 28h]. metin: 00412DB3 çağrı sub_41CBD0.text: 00412DB8 mov ecx, [esi]; player.text: 00412DBA test ecx, ecx.text: 00412DBC mov [esp + 20h + Memory], ecx.text: 00412DC0 jz short loc_412DD4.text: 00412DC2 call DisconnectUser.text: 00412DC7 mov ecx, [esp + 20h + Bellek] .text: 00412DCB ecx itme; Memory.text: 00412DCC çağrısı 3 @ YAXPAX @ Z; operatör silme (void *). metin: 00412DD1 esp ekle, 4. metin: 00412DD4.text: 00412DD4 loc_412DD4:; KOD XREF: NewConnectionRequest + 70j.text: 00412DD4 mov eax, ZonePlayerCount.text: 00412DD9 dec eax.text: 00412DDA mov ZonePlayerCount, eax.text: 00412DDF eax ekle, edi
.text: 00412DE1 shl eax, 2.text: 00412DE4 push eax; Size.text: 00412DE5 ebx'i itin; Src.text: 00412DE6 push esi; Dst.text: 00412DE7 çağrı _memcpy.text: 00412DEC esp ekle, 0Ch.text: 00412DEF dec ebp.text: 00412DF0 alt edi, 3FFFFFFFh.text: 00412DF6 ​​alt ebx, 4. metin: 00412DF9 alt esi, 4. metin: 00412DFC. metin: 00412DFC loc_412DFC:; KOD XREF: NewConnectionRequest + 41j.text: 00412DFC; NewConnectionRequest + 4Fj.text: 00412DFC mov eax, ZonePlayerCount.text: 00412E01 inc ebp.text: 00412E02 add edi, 3FFFFFFFh.text: 00412E08 ebx ekle, 4. metin: 00412E0B esi, 4.text: 00412E0E cmp ebp. text: 00412E10 jl loc_412D85  

Anladığım kadarıyla 0x3FFFFFFF dizinin sınırları ile bir ilgisi var mı?

DisconnectUser'dan sonra ve belleksiz tüm playerPointer işaretçilerinin sola kaydırılmasının doğru olduğunu düşünüyorum. veya sayacı farklı yollarda değiştirir.

Bence sayaç ya v3 döngü devam ederken artmaya devam edebilir, ancak bir oyuncu kaldırıldığında listenin sonu falan mı?

Bir cevap:
SSpoke
2014-09-21 06:53:55 UTC
view on stackexchange narkive permalink

Bunun gibi görünmesi gerektiğini düşünüyorum% 99,9'un bir öğe değiştirici olduğunu hissediyorum, bir şey bana 0x3FFFFFFF 'nin bir dizinin maksimum sınırları olduğunu söylüyor, bu nedenle, aldığından emin olmak için eklediği bir derleyici şey Dizinin sonu.

Yanıldım 0x3FFFFFFF , ekleyerek çıkarma emülasyonu yapmak için işaretli sayılar oluşturmak için kullanılır. DCoder tarafından yapılan yoruma bakın

  if (ZonePlayerCount > 0) {v3 = 0; {if (playerPointerList [v3] .IPAddressDWORD.S_un.S_un_b.s_b1 == IPAddress && playerPointerList [v3] .Port == Port) {printf ("Aynı ip / port başka bir bağlantı talep ettiği için bağlantı kesildi \ n"); sub_41CBD0 ((int) &playerPointerList [v3] .encryptionPointer->ConnectionStatus); Bellek = * v5; eğer (* v5) {DisconnectUser (* v5); Boş hafıza); } memcpy (&playerPointerList [v3], &playerPointerList [v3 + 1], 4 * (ZonePlayerCount - v3 - 1)); // veya memmove (&playerPointerList [v3], &playerPointerList [v3 + 1], (ZonePlayerCount - v3 - 1) * sizeof (&playerPointerList)); --ZonePlayerCount; --v3; } ++ v3; } while (v3 < ZonePlayerCount); }  

Yanlışsa bana haber ver, cevabı kaldıracağım. (karşılaştırmak için orijinal kaynak kodu yok).

memcpy kullanmamam gerektiğini düşündüm çünkü en sonunda hafızada gereksiz şeyler bırakabilir ama bence hurda hiçbir zarar vermez ve zamanı geldiğinde sonunda yararlı bir şeyle değiştirilir.

memmove () gibi görünse de burada daha uygundur.

Bu oldukça doğru görünüyor. Dikkat edilmesi gereken bir nokta, "0x3FFFFFFF * 4 = 0xFFFFFFFC" veya "-4" olmasıdır. Bu bir dizi bağlı değil, bir sayıdan "4 * sayacı" çıkarmanın düzgün bir yolu.
ahh teşekkürler, bu yüzden çarpma yaparak çıkarmaya çalışıyor lol çok tuhaf, bu sürprizlerle dolu, aynı zamanda sayıların gücünü bölmek için (diğer kısımlarda) doğru kaydırmalar yapıyor. Bir gün bu kod çözücüler, her şeyi tanıyan ve sizin için basitleştiren kalıplara sahip olacak !. IDA'nın Hex-Ray'i, insanların her şey için kalıpları dolduracakları açık kaynak olsaydı, proje uzun zaman önce en az daha iyi tamamlanmış olurdu, o zaman Hex-Rays tam çöp dışındaki her şeye tekrar bakın.


Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 3.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...