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
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 RETNAutrement 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: 004252A4Faites 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: 0042489EIl 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: 004264C1Il 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: lstrcpyAdresse .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
Commentaires
Commentant, gardez à l' esprit que le contenu et le ton de vos messages peuvent blesser les sentiments des gens réels, montrer du respect et de la tolérance à ses interlocuteurs, même si vous ne partagez pas leur avis, votre comportement en termes de liberté d'expression et de l' anonymat offert par Internet, est en train de changer non seulement virtuel, mais dans le monde réel. Tous les commentaires sont cachés à l'index, le contrôle anti - spam.