예제 #1
0
        private void UltimateParty(Rance10 Rance10, Rance10ObjectAnalyzer ana)
        {
            // 編成画面のみで機能する
            // リーダーのパラメータを書き換える
            //
            // 以下の手順で実際のゲーム中に反映される
            //   1.編成画面
            //   2."Write params" を押す
            //   3.クエスト画面に戻る
            //   4.編成画面
            //   5.クエスト画面に戻る
            var party = new Party(ana, ana.ClassObject["SceneParty"].First());
            var data  = new byte[8];

            Array.Copy(BitConverter.GetBytes(999999), 0, data, 0, 4);   // AT
            Array.Copy(BitConverter.GetBytes(999999), 0, data, 4, 4);   // HP

            foreach (var i in party.Leaders)
            {
                if (i.PlayerCard == null)
                {
                    continue;
                }

                System.Diagnostics.Debug.Print("Write: {0:X8}", i.ParamAddress);

                Rance10.WriteMemory(new IntPtr(i.ParamAddress), data);
            }
        }
예제 #2
0
        private void bTurn_Click(object sender, EventArgs e)
        {
            try
            {
                if (!cbTurn.Checked)
                {
                    return;
                }

                using (var rance10 = Rance10.Create())
                {
                    var ana = new Rance10ObjectAnalyzer();

                    ana.Analyze(rance10);

                    List <Rance10Object> objs;

                    if (!ana.ClassObject.TryGetValue("GameContext", out objs))
                    {
                        return;
                    }

                    var gamectx = objs[0];
                    var trun    = (int)nudTurn.Value;

                    rance10.WriteMemory(new IntPtr(gamectx.DataPtr + 8), BitConverter.GetBytes(trun));
                }
            } catch (Exception ex)
            {
                System.Diagnostics.Debug.Print(ex.ToString());
                MessageBox.Show(ex.ToString());
            }
        }
        private void AnalyzeObjects(Rance10 rance10)
        {
            Log.WriteLine("");
            Log.WriteLine("Objects");

            var type = 0;

            foreach (var i in ObjectsByType)
            {
                Log.WriteLine($"\t{type++}");

                foreach (var j in i.Values)
                {
                    Log.WriteLine($"\t\t{j}");
                }
            }

            Log.WriteLine("");
            Log.WriteLine("ClassObjects");

            foreach (var i in ClassObject)
            {
                var cname = i.Key;

                Log.WriteLine($"\t{cname}");

                foreach (var j in i.Value)
                {
                    AnalyzeObject(rance10, j);
                }
            }
        }
        private void SortObjects(Rance10 rance10)
        {
            ObjectsByType = new[]
            {
                new Dictionary <int, Rance10Object>(),
                new Dictionary <int, Rance10Object>(),
                new Dictionary <int, Rance10Object>(),
                new Dictionary <int, Rance10Object>(),
                new Dictionary <int, Rance10Object>(),
                new Dictionary <int, Rance10Object>(),
            };

            foreach (var i in Objects.Where(i => i != null))
            {
                ObjectsByType[i.Type].Add(i.Seq, i);
            }

            ClassObject = new Dictionary <string, List <Rance10Object> >();
            List <Rance10Object> list;

            foreach (var i in ObjectsByType[4].Values)
            {
                var cname = i.ClassName;

                if (!ClassObject.TryGetValue(cname, out list))
                {
                    ClassObject.Add(cname, list = new List <Rance10Object>());
                }

                list.Add(i);
            }
        }
        private void ReadObjects(Rance10 rance10)
        {
            var idx = 0;

            Objects = new Rance10Object[ObjectAddresses.Length];

            foreach (var i in ObjectAddresses)
            {
                var tbladdr = TableStart + (idx / 4) * 4;

                Log.WriteLine($"\t#{idx/4}\t{tbladdr:X8}...{i:X8}");

                try
                {
                    var obj = ReadObject(rance10, i, idx);
                    Objects[idx++] = obj;

                    if (null != obj)
                    {
                        obj.Analyze(rance10);
                    }
                } catch (Exception ex)
                {
                    Log.WriteLine(ex.ToString());
                    Log.Flush();
                    throw;
                }
            }
        }
예제 #6
0
 private void UpdateObjectTree()
 {
     using (var rance10 = Rance10.Create())
     {
         var ana = rance10.AnalyzeObjTable();
         Analyzer = ana;
     }
 }
예제 #7
0
        public static Rance10 Create()
        {
            var processes = Process.GetProcessesByName("Rance10");

            if (processes == null || processes.Length == 0)
            {
                throw new Exception("Process not found");
            }

            var Rance10 = new Rance10(processes[0]);

            return(Rance10);
        }
예제 #8
0
        private void bMaxExpFriend_Click(object sender, EventArgs e)
        {
            try
            {
                using (var rance10 = Rance10.Create())
                {
                    var ana = new Rance10ObjectAnalyzer();

                    ana.Analyze(rance10);

                    List <Rance10Object> objs;

                    if (!ana.ClassObject.TryGetValue("PlayerCommonParam", out objs))
                    {
                        return;
                    }

                    var param = new CommonParam(ana, objs.First());

                    if (cbTicket.Checked)
                    {
                        param.WriteTicket(rance10, 3);                                      // 食券
                    }
                    if (cbFriendship.Checked)
                    {
                        param.WriteFriendship(rance10, 3);                                  // 友情
                    }
                    if (cbMedal.Checked)
                    {
                        param.WriteMedal(rance10, 2);                                       // 勲章
                    }
                    if (cbIngot.Checked)
                    {
                        param.WriteIngot(rance10, 3);                                       // 金塊
                    }
                    if (cbTotalExp.Checked)
                    {
                        param.WriteTotalExp(rance10, 99999999);                             // 獲得経験値
                    }
                    if (cbUltimate.Checked)
                    {
                        UltimateParty(rance10, ana);
                    }
                }
            } catch (Exception ex)
            {
                System.Diagnostics.Debug.Print(ex.ToString());
                MessageBox.Show(ex.ToString());
            }
        }
        private Rance10Object ReadObject(Rance10 rance10, uint addr, int idx)
        {
            if (addr == 0)
            {
                return(null);
            }

            var buf = new byte[64];
            var m   = rance10.ReadMemory(new IntPtr(addr), buf, 8);

            if (!m.Success)
            {
                System.Diagnostics.Debug.Print($"Failed to read memory: {addr:X8}");
                return(null);
            }

            var type = BitConverter.ToInt32(m.Data, 4);

            switch (type)
            {
            case 0: m = rance10.ReadMemory(new IntPtr(addr), buf, Rance10SubObject0.Size); break;

            case 1: m = rance10.ReadMemory(new IntPtr(addr), buf, Rance10SubObject1_Value.Size); break;

            case 2: m = rance10.ReadMemory(new IntPtr(addr), buf, Rance10SubObject2_String.Size); break;

            case 3: m = rance10.ReadMemory(new IntPtr(addr), buf, Rance10SubObject3_Array.Size); break;

            case 4: m = rance10.ReadMemory(new IntPtr(addr), buf, Rance10SubObject4_Class.Size); break;

            case 5: m = rance10.ReadMemory(new IntPtr(addr), buf, Rance10SubObject5.Size); break;

            default: throw new Exception($"Invalid type no: {type} @{addr:X8}");
            }

            if (!m.Success)
            {
                System.Diagnostics.Debug.Print($"Failed to read memory: {addr:X8}");
                return(null);
            }

            var obj = Rance10Object.New(null, (uint)m.Address.ToInt64(), m.Data);

            obj.Seq = idx;

            return(obj);
        }
        public void Analyze(Rance10 rance10)
        {
            Begin();
            rance10.Suspend();

            try
            {
                ReadTables(rance10);
                ReadObjects(rance10);
                SortObjects(rance10);
                AnalyzeObjects(rance10);
            } finally
            {
                rance10.Resume();
                End();
            }
        }
        private void AnalyzeObject(Rance10 rance10, Rance10Object obj)
        {
            Log.WriteLine($"\t\t{obj}");

            if (null == obj.ObjectData)
            {
                return;
            }

            foreach (var i in obj.ObjectData)
            {
                var assoc = GetObject((int)i);

                if (null == assoc)
                {
                    Log.WriteLine($"\t\t\t{i:X8}->\tnull");
                }
                else
                {
                    Log.WriteLine($"\t\t\t{i:X8}->\t{assoc}");
                }
            }
        }
예제 #12
0
        private void PartyMembers()
        {
            try
            {
                using (var rance10 = Rance10.Create())
                {
                    var ana = new Rance10ObjectAnalyzer();

                    ana.Analyze(rance10);

                    var party = new Party(ana, ana.ClassObject["SceneParty"].First());
                    var sb    = new StringBuilder();

                    sb.AppendLine("AT------ HP------ Rank---- Name----------------");

                    foreach (var i in party.Leaders)
                    {
                        if (i.PlayerCard == null)
                        {
                            continue;
                        }

                        sb.AppendFormat("{0} {1} {2} {3}",
                                        i.AT.ToString("N0").PadLeft(8),
                                        i.HP.ToString("N0").PadLeft(8),
                                        i.Rank.ToString("N0").PadLeft(8),
                                        i.CardName).AppendLine();
                    }

                    tbInfo.Text = sb.ToString();
                }
            } catch (Exception ex)
            {
                System.Diagnostics.Debug.Print(ex.ToString());
                MessageBox.Show(ex.ToString());
            }
        }
        private void ReadTables(Rance10 rance10)
        {
            var buf = new byte[256 * 1000];
            var m   = rance10.ReadMemory(new IntPtr(0x007FCBB0), buf, 8);

            if (!m.Success || m.ReadedSize != 8)
            {
                return;
            }

            var mng1 = BitConverter.ToUInt32(m.Data, 0);
            var mng2 = BitConverter.ToUInt32(m.Data, 4);

            m = rance10.ReadMemory(new IntPtr(mng1), buf, 32);

            if (!m.Success || m.ReadedSize != 32)
            {
                return;
            }

            var tbl  = BitConverter.ToUInt32(m.Data, 8);
            var cnt  = BitConverter.ToInt32(m.Data, 20);
            var cnt2 = (cnt + 3) / 4;
            var read = cnt2 * 4;
            var end  = tbl + cnt2 * 4;

            m = rance10.ReadMemory(new IntPtr(tbl), buf, read);

            if (!m.Success || m.ReadedSize != read)
            {
                return;
            }

            ObjectManagerAddress = mng1;
            ObjectCount          = cnt;
            TableCount           = cnt2;
            TableStart           = tbl;
            TableEnd             = (uint)(tbl + cnt2 * 4);
            TableAddresses       = Enumerable.Range(0, TableCount)
                                   .Select(i => BitConverter.ToUInt32(m.Data, i * 4))
                                   .ToArray();
            var objs = new List <uint>(ObjectCount);
            var rem  = cnt;
            var idx  = 0;

            System.Diagnostics.Debug.Print($"ObjectManagerAddress: {ObjectManagerAddress:X8}");
            System.Diagnostics.Debug.Print($"ObjectCount:          {ObjectCount:X8}");
            System.Diagnostics.Debug.Print($"TableCount:           {TableCount:X8}");
            System.Diagnostics.Debug.Print($"TableStart:           {TableStart:X8}");
            System.Diagnostics.Debug.Print($"TableEnd:             {TableEnd:X8}");

            Log.WriteLine("ObjectTable");

            foreach (var i in TableAddresses)
            {
                var tbladdr = TableStart + idx * 4;
                m = rance10.ReadMemory(new IntPtr(i), buf, 16);

                if (m.Success && m.ReadedSize == 16)
                {
                    var a0 = BitConverter.ToUInt32(m.Data, 0);
                    var a1 = BitConverter.ToUInt32(m.Data, 4);
                    var a2 = BitConverter.ToUInt32(m.Data, 8);
                    var a3 = BitConverter.ToUInt32(m.Data, 12);

                    Log.WriteLine("\t#{0}\t{1:X8}->{2:X8}: {3:X8} {4:X8} {5:X8} {6:X8}",
                                  idx++, tbladdr, i, a0, a1, a2, a3);

                    if (rem >= 1)
                    {
                        objs.Add(a0);
                    }
                    if (rem >= 2)
                    {
                        objs.Add(a1);
                    }
                    if (rem >= 3)
                    {
                        objs.Add(a2);
                    }
                    if (rem >= 4)
                    {
                        objs.Add(a3);
                    }
                }
                else
                {
                    throw new Exception();
                }

                rem -= 4;
            }

            Log.Flush();

            ObjectAddresses = objs.ToArray();

            System.Diagnostics.Debug.Assert(ObjectAddresses.Length == ObjectCount);
        }