Retrait ASProtect 1.22 à 1.23 Beta 21 et briser Lemonade Tycoon v1.1.6


Retrait ASProtect 1.22 à 1.23 Beta 21 et briser Lemonade Tycoon v1.1.6
Auteur: Proteus [[email protected]]

Cible: Lemonade Tycoon v1.1.6 (2100kb)
Ce que vous devez:
1. OllyDbg + plug - in OllyDump
2. ImpRec 1.6 final
3. IDA
4. Hiew ou tout autre shestnadtsyatirichny éditeur
4. Beer "Beck", 0,5;)

victime

Notre objectif est un igrashka simple. Mais le plus important, que ce zaprotekchena "ASProtect 1,22 à 1,23 Beta 21", comme dit de nous gentiment peid:


La victime est hors de portée pour les machinations cruelles d'un désassembleur;)



Recherche OEP

Utilisez autounpacker ne nous plaît pas et pourquoi AsprStripperXP OllyDbg courir et ouvrir un programme dans le fichier débogueur exécutable.


point d'accès

La localisation réussie des victimes d'origine du point d'entrée, il faut inclure dans Olka gestion des exceptions (voilation d'accès mémoire, violation d'accès). Allez dans l'option de débogage (en appuyant sur Alt + O) et définir les indicateurs comme indiqué ci-dessous:


Activer la gestion des exceptions

revenir à la fenêtre "CPU" OllyDbg inachinaem prendre exception (en appuyant sur Maj + F9). Après 27 temps (même si une fois que vous appuyez sur Maj + F9, le programme prendra notre départ et OEP) nous allons présenter à .D405CC


Fenêtre "CPU" 27 après les exclusions de traitement

Ensuite, vous avez besoin de mettre un point d'arrêt sur la commande RETN (.D40609) et l'ordre Olka "marche" pour en appuyant sur la touche Maj + F9 à nouveau. La dernière étape dans la recherche d'OEP va installer breakpoint sur l'accès Aspro à la section de code d'application les protégeait. Pour ce faire, appuyez sur Alt + M (pour ouvrir la fenêtre "Carte mémoire") et appuyez sur F2 sur la seconde section du compte processus donné. Dans notre cas, ce codesection Lemonade à 00.401.000.


accès Trinket à la section de code

Dernière zhmyakaem par Maj + F9 et TOUS !!! Nous sommes sur le OEP. Tout de même, pour le croire, vous pouvez appuyer sur Ctrl + A, et Olka effectuer une analyse de code et démonté liste au lieu du seul octet expressions obscures acquièrent genre "humain" =)


Et voici le OEP!



décharges publiques


Choisissez dans le menu principal du processus de débogage Plugins-OllyDump-Dump et dans la fenêtre qui apparaît, cliquez sur "Dump" (avant que ne pas oublier de retirer le drapeau "Reconstruire l'importation", à OllyDump seul ne pas essayer de restaurer l'importation de vidage).


Faire une décharge en utilisant le plugin OllyDump

À propos des adresses de points d'entrée et les sections ne peuvent pas survivre en raison de leur OllyDump calcule lui-même.

Récupération d'importation


Tout comme un dump (j'ai appelé fichier dumped.exe) ne démarre pas - il a besoin pour restaurer la table des fonctions importées. Pour ce faire, exécutez la ImpRec et sélectionnez notre processus étudié Lemonade.exe (il est toujours «debout» sur l'OEP, Olly, car avec lui, nous avons pas encore fermé). Dans le "OEP", entrez l'adresse de notre OEP (qui est égale à 4FB6B) et cliquez sur le "IAT AutoSearch" - "Get importations" - "Show non valide". Nous recevons quelques centaines de fonctions non définies. Pour les restaurer, essayer de faire une trace en 2 étapes. Le premier clic-droit sur l'une des fonctionnalités importantes de incertain et choisissez-moi "Trace Level1 (Disasm)". Dans la deuxième étape, cliquez à nouveau sur le "Show invalide", puis restaurer la fonction via le plugin Plugin Tracers - ASProtect 1,22.


Imprec restaure import ...

Suite à la manipulation de cela apparaît dans la fenêtre du journal


Importation avec succès restauré ...

Cela donne à penser que l'importation restaurée et peut produire une modification de notre dump (dumped.exe) en cliquant sur le bouton "Fix Dump"


Dump avec succès modifié ...

Donc, nous avons un fichier entièrement fonctionnel est décompressé (dumped_.exe)!


PEID confirme que ASPR enlevé avec succès

Passez à son analyse ...

Mise au point et le piratage victime avec un patch


Charger décompressé un programme dans le débogueur. Comme pour entrer dans l'enregistrement, il utilise la fenêtre d'entrée standard,

écran de saisie des données d'enregistrement

et la fenêtre d'erreur standard, il était dans les vieux Reshin ensemble des points d'arrêt sur les appels de fonction MessageBoxA (qui délivre un message d'erreur) ou GetDlgItemTextA (lecture de textes d'entrée).


Définir des points d'arrêt sur les fonctions appelant MessageBoxA

En appuyant sur "Entrée des informations de licence" conduit à un tel morceau de code dans Olka:


Interrompu longueur de sortie nom d'activation d'erreur (il doit être égal à 20)

Quelle fut ma surprise lorsque les sites de protrassiruya vérification longueurs saisies des données d'enregistrement (.0042563A), un tas de cordes et arithmétiques transformations à eux (0,00425692) et douteuse clé d'enregistrement que je trouvais la lecture ou la mise au points d'arrêt api appropriée plus tard, soit via RegMon'a (bien sûr, tous testés après le rechargement du programme)! Il est avéré que la raison en est la pièce ci-dessous du code:

  seg000: 00425D99 appel esi;
  DialogBoxParamA;
  Créer une boîte de dialogue modale à partir d' un
 
  seg000: 00425D99;
  boîte de dialogue ressource template
 
  seg000: 00425D9B mov edi, eax seg000 : 00425D9D 
  seg000: 00425D9D loc_425D9D :;
  CODE XREF: sub_425C59 + 12Dj
 
  seg000: 00425D9D cmp edi, 3EBh seg000 : courte loc_425DAA de 00425DA3;  reg.dannye jmp sinon administré
 seg000: 00425DA5 appel sub_425228;
  CreateProcessA
 seg000: 00425DAA
 
  seg000: 00425DAA loc_425DAA :;
  CODE XREF: sub_425C59 + 14Aj
 
  seg000: 00425DAA mov eax, edi seg000 : 00425DAC 
  seg000: 00425DAC loc_425DAC :;
  CODE XREF: sub_425C59 + 178j
 
  seg000: 00425DAC pop edi seg000: 00425DAD pop esi seg000: 00425DAE pop ebx seg000: 00425DAF laisser 
  seg000: 00425DB0 RETN
 

Autrement dit, après avoir entré reg.dannyh, la fenêtre principale de l'application et simplement désactiver l'application est fermée. Mais la chose la plus intéressante est que, avant (.00425DA5) était un appel de fonction, qui a créé un nouveau processus, une copie du contact de processus nouvellement lancé la victime (ala CopeMemII Armagh, bien que le processus de briser l'affaire, à mon avis, aucune difficulté n'a pas ajouté sauf singularité). Ce morceau de procédures de sub_425228 de code Courtyard entoure confirme.

  seg000: 00425278 lea eax, [ebp + ProcessInformation]
 
  seg000: 0042527B mov [ebp + StartupInfo.cb ], 44h seg000: 00425282 mov [ebp + StartupInfo.dwFlags], 40h seg000: 00425289 poussoir eax;
  lpProcessInformation
 seg000: 0042528A lea eax, [ebp + STARTUPINFO] 
  seg000: 0042528D poussoir eax;
  lpStartupInfo
 esi push 0042528E;: de seg000
  lpCurrentDirectory
 seg000: 0042528F pousser esi;
  lpEnvironment
 seg000: 00425290 push esi;
  dwCreationFlags
 seg000: 00425291 push esi;
  bInheritHandles
 seg000: 00425292 push esi;
  lpThreadAttributes
 seg000: 00425293 push esi;
  lpProcessAttributes
 seg000: 00425294 lea eax, [ebp + ApplicationName] seg000: 0042529A push esi;  lpCommandLine
 seg000: 0042529B poussoir eax;
  lpApplicationName
 seg000: 0042529C appel ds: CreateProcessA seg000 : 004252A2 pop esi seg000: 004252A3 congé 
  seg000: 004252A4 RETN
 
  seg000: 004252A4 sub_425228 endp

 seg000: 004252A4
 

Faites défiler le code un peu plus haut, je compris pourquoi les informations enregistrées dans le registre reg.dannye de ne pas lire au démarrage. Il se trouve que crée un mutex unique qui "a donné à connaître le" processus parent si le processus enfant est commencé quand un processus est créé comme un "lancer un jouet", ou "valider reg.dannyh". Depuis le test après avoir entré le code étaient déjà procédé dotsernem et OllyDbg leurs prises n'a pas été possible (pour le temps de connexion à tolkochto tous les chèques crée un processus a déjà été traversées par, et la possibilité d'utiliser un décent ring0 mode débogueur était pas), je décide d'aller par une astuce: pour modifier le fichier binaire du test afin que les premières lignes de ses fonctions exécutables (par exemple, WinMain) a été cyclisme (oppkody EBFE). Ainsi créé par le processus obsédé et je pouvais connecter dans le temps et la restauration du code de 2 octets d'origine tranquillement poissledovat zones souhaitées. Malheureusement, en essayant de mettre en œuvre la méthode décrite a été passé une demi-heure, le processus de l'enfant ne soit pas raccroché! Ne voulant pas passer plus de temps à trouver les causes (qui, apparemment, était de reproduire principales fonctions de la victime), je décide d'aller à une méthode plus «traditionnelle» et définir des points d'arrêt dans le processus parent l'appel Funky TerminateProcess et ExitProcess;)


Mettez des points d'arrêt sur l'achèvement de l'application appelle les fonctions

Exécuter, dans notre fichier, entrez le reg.dannye nécessaire (je tapé le nom: Proteus et code: 1234567890abcdeABCDE) et obtenir le point désiré sans aucun problème (.44A841)


point de détection des applications appel de fonction d'achèvement

podnyavschis sur plusieurs niveaux jusqu'à la structure désassemblés inscription à l'IDA voir le code suivant:

  seg000: 004247A0
 
  seg000: 004247A0;
  --------------- SUBROUTINE ---------------------------------- -----
 
  seg000: 004247A0
 
  seg000: 004247A0;
  Attributs: trame sur la base pb
 
  seg000: 004247A0
 
  seg000: 004247A0 sub_4247A0 proc près;
  CODE XREF: sub_437940 + 26p
 
  seg000: 004247A0;
  sub_437940 + 3BP
 
  seg000: 004247A0
 
  seg000: 004247A0 var_200 = dword ptr -200h
 
  seg000: 004247A0
 
  seg000: 004247A0 poussoir ebp seg000: 004247A1 mov ebp, esp seg000: 004247A3 sub esp, seg000 200h: 004247A9 push esi seg000: 004247AA pousser edi seg000: 004247AB appel sub_437940 seg000: 004247B0 mov dword ptr [eax + 20h], compensée aLemonade;  "Lemonade"
 
  seg000: 004247B7 appel sub_437940 seg000: 004247BC mov dword ptr [eax + 24h], compensée aLemonadeTycoon;  "Lemonade Tycoon"
 
  seg000: 004247C3 appel sub_437940 seg000: 004247C8 mov dword ptr [eax + 28h], offset a1_1_5;  "1.1.5"
 
  seg000: 004247CF appel sub_437940 seg000: 004247D4 mov dword ptr [eax + 28h], compensée a1_1_6;  "1.1.6"
 
  seg000: 004247DB appel sub_437940 seg000: 004247E0 mov dword ptr [eax + 1Ch], compensée aB6081ca706b415;  "{B6081CA-706B-415E- AE52-910C4FB06016}" 
  seg000: 004247E7 appel sub_437940 seg000: 004247EC mov dword ptr [eax + 10h], compensée a1_0;  "1.0"
 
  seg000: 004247F3 appel sub_437940 seg000: 004247F8 mov dword ptr [eax + 14h], compensée a72733b3Ac0f4d4;  "{72733B3-AC0F-4D43- BED1-25EE1194A7BA}" 
  seg000: 004247FF appel sub_437940 seg000: 00424804 mov dword ptr [eax + 18h] , offset a48033dc6A54144;  "{48033DC6-A541-4454-A9CE- 3186C3365B75}" 
  seg000: 0042480B appel sub_437940 seg000: 00424810 mov dword ptr [eax + 88h] , 96h seg000: 0042481A appel sub_437940 seg000: 0042481F xor edi, edi seg000: 00424821 poussée 68h seg000: 00424823 mov [eax + 34h], edi seg000: 00424826 pop esi seg000 : 00424827
 
  seg000: 00424827 loc_424827 :;
  CODE XREF: sub_4247A0 + 98j
 
  seg000: 00424827 appel sub_437940 seg000: 0042482C mov [eax + esi], edi seg000: 0042482F ajouter esi, 4 seg000: 00424832 cmp esi, 84h seg000: 00424838 jl courte loc_424827 seg000: 0042483A appel sub_4263DD ;  test de fonctionnement
 seg000: 0042483F essai eax, eax seg000 : 00424841 jz courte loc_42484A seg000: 00424843 poussoirs 1;
  int
 seg000: 00424845 appel _exit seg000: 0042484A;
  -------------------------------------------------- -------------------------
 
  seg000: 0042484A
 
  seg000: 0042484A loc_42484A :;
  CODE XREF: sub_4247A0 + A1J
 
  appel sub_4264BC de 0042484A;: de seg000
  eax = ds: dword_57F99C
 seg000: 0042484F essai eax, eax seg000 : 00424851 jz courte loc_42489B;
  JMP si eax = 1 (en cours do4ernem)
 seg000: 00424853 mov esi, ds: GetModuleHandleA seg000: 00424859 lea eax, [ebp + var_200] seg000: 0042485F pousser eax;  char *
 seg000: 00424860 poussoir edi;
  lpModuleName
 seg000: 00424861 appel esi;
  GetModuleHandleA
 
  seg000: 00424863 poussoir eax;
  hInstance
 seg000: 00424864 appel sub_426404 seg000: 00424869 pop ecx seg000: 0042486A lea eax, [ebp + var_200] seg000: 00424870 pop ecx seg000: 00424871 mov ds: dword_57F988, edi seg000: 00424877 poussoir eax;
  int
 seg000: 00424878 poussoir edi;
  lpModuleName
 seg000: 00424879 appel esi;
  GetModuleHandleA
 
  seg000: 0042487B poussoir eax;
  hInstance
 seg000: sub_425C59 0042487C d'appel;
  ReadParametrs
 seg000: 00424881 pop ecx seg000: 00424882 cmp eax, 3EBh seg000: 00424887 pop ecx seg000: 00424888 jnz courte seg000 de loc_424891: 0042488A poussoir 1;
  int
 appel _exit de 0042488C;: de seg000
  fermer l'application après l'entrée reg.dannyh
 seg000: 00424891;
  -------------------------------------------------- -------------------------
 
  seg000: 00424891
 
  seg000: 00424891 loc_424891 :;
  CODE XREF: sub_4247A0 + E8J
 
  seg000: 00424891 mov ds: dword_57F988, 1 seg000: 0042489B
 
  seg000: 0042489B loc_42489B :;
  CODE XREF: sub_4247A0 + B1J
 
  seg000: 0042489B pop edi seg000: 0042489C pop esi seg000: 0042489D congé;  Nous sautons à .4365C9
 seg000: 0042489E RETN
 
  seg000: 0042489E sub_4247A0 endp

 seg000: 0042489E
 

Il est pas difficile de deviner que 0042483A appel sub_4263DD est nul autre que comme un défi pour tester les fonctions qui influent sur le cours de l' inspection à .0042484F. Il était de ses résultats de test permettra de déterminer si la fonction appelée ExitProcess ou être la procédure normale de fonctionnement si récupérée dans le cas d'un enregistrement de l'utilisateur et des jouets de démarrage.
En regardant le 0042484A appel fonction d'appel sub_4264BC voir que dans le registre eax est entré 1, le contenu de la cellule de mémoire à 57F99C.
  seg000: 004264BC
 
  seg000: 004264BC;
  --------------- SUBROUTINE ---------------------------------- -----
 
  seg000: 004264BC
 
  seg000: 004264BC
 
  seg000: 004264BC sub_4264BC proc près;
  CODE XREF: sub_413B78 + 5cp
 
  seg000: 004264BC;
  sub_4157E8 + 531P ...
 
  seg000: 004264BC mov eax, ds: dword_57F99C seg000: 004264C1 RETN 
  seg000: 004264C1 sub_4264BC endp

 seg000: 004264C1
 

Il est logique de supposer que l'avant, lors de l'inspection dans cet enregistrement de la cellule même est faite dans le cas de la saisie de données incorrectes. Et si la cellule contient un 0, le programme continuera à passer des tests de la scène signé et commencer immédiatement le jeu. Pour trouver le lieu de vérification redémarrer la victime et définir un point d'arrêt sur l'entrée à l'emplacement de mémoire spécifié:

Trinket écriture à un emplacement de mémoire, le statut hryanyaschuyuyu déposée

Hit F9 sur et en face de nous, il y a un morceau de code:

  seg000: 00426296
 
  seg000: 00426296 poussoir ebp seg000: 00426297 mov ebp, esp seg000: 00426299 sub esp, seg000 530H: 0042629F pousser esi seg000: 004262A0 xor esi, esi seg000: 004262A2 cmp ds: dword_57F9A0, esi seg000: 004262A8 jnz loc_4263DA seg000: 004262AE lea eax , [ebp + KeyName] seg000: 004262B4 poussoir compensés A1831;  "183-1"
 
  seg000: 004262B9 poussée eax seg000: 004262BA ds de: dword_57F99C, 1;
  1 enregistrements dans ya4eyku mémoire dans slu4ae entrées reg.dannyh incorrect
 seg000: 004262C4 ds appel: lstrcpy

Adresse .004262A2 voir une équipe intéressante comparé la 57F9A0 cellulaire à 0. Ceci est l'endroit pour vérifier le compte à rebours de 60 secondes depuis le début du jeu (cliquez sur .4262A2, cliquez sur le bouton droit de la souris, sélectionnez "Rechercher les références à - Adresse constante» et de voir l'adresse. code approprié 00426046 MOV DWORD PTR DS :. [57F9A0 ], 1 Il est exécuté seulement si vous êtes utilisateur déposée, et "vous permet de savoir" jeu qui n'a pas besoin d'être interrompu après une exécution de minutes). Si la cellule de contenu 57F9A0 est 0, le jeu plantera même après patcher le statut de variable déposée! Donc, pour terminer une brèche de sécurité est nécessaire de changer le résultat de la vérification à 004262A2, qu'au moins un des opérandes, et équivalait à 1, au lieu de comparer le contenu 57F9A0 à 0 (adresse .4261D6) cellules brûlent à 1. Pour ne pas utiliser une opération massive avec la modification de cellules de mémoire peut être tout simplement entrez 1 dans le esi de registre. Pour ce faire, vous pouvez remplacer le esi commande xor, Esi à 004262A0 dans le esi inc et nop (oppkody 46 90). Au lieu de CMP DWORD PTR DS: [57F9A0], 0 doit être écrit INC DWORD PTR DS: [57F9A0], parce que, par défaut, le programme va stocker le non enregistré 0 là et nous optimisant ainsi le code introduire dans le contenu de la cellule de mémoire 1. À la demande de la branche suivante JNE conditionnelle cracked.00426292 peut être remplacé par un cracked.00426292 JMP inconditionnel. Ceci est fait dans un éditeur hexadécimal. Je choisis Hiew. Patcher Pour ouvrir le fichier dumped_.exe 2 fois que nous appuyez sur Entrée, puis le F5, entrez .4262A0, cliquez sur le F3, entrez 46 90. Le même est fait pour les autres équipes, qui peuvent oppkody verra sur la capture d'écran ci-dessous. F9 Enregistrer les modifications.


Binary patcher le jeu dans l'éditeur hexadécimal Hiew

Programa maintenant pleinement opérationnel. Démarrage du jeu se produit immédiatement, sans afficher aucun des Nagas et d'interrompre au milieu du jeu.

Fichiers sur l'article:

Cible: Lemonade Tycoon v1.1.6 (2100kb)
Dump import rechapés: dumped_.rar

gl hf 2 tous
05.01.2006