ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/Daodan/src/Daodan_Patch.c
(Generate patch)

Comparing Daodan/src/Daodan_Patch.c (file contents):
Revision 993 by alloc, Sun Apr 6 17:06:02 2014 UTC vs.
Revision 1045 by alloc, Sun Aug 28 16:01:38 2016 UTC

# Line 1 | Line 1
1   #include "Daodan_Patch.h"
2 < #include "Daodan_Utility.h"
2 > #include "Patches/Utility.h"
3   #include <beaengine/BeaEngine.h>
4  
5   #include <windows.h>
# Line 41 | Line 41 | bool DDrPatch_MakeCall(void* from, void*
41   void* DDrPatch_MakeDetour(void* from, void* to)
42   {
43          int len = 0;
44 +
45   /*
46 <    DISASM MyDisasm;
47 <    int i = 0;
47 <    STARTUPMESSAGE("", 0);
48 <    STARTUPMESSAGE("", 0);
49 <
50 <    memset (&MyDisasm, 0, sizeof(DISASM));
51 <    MyDisasm.EIP = (UIntPtr) from;
52 <    i = 0;
53 <    STARTUPMESSAGE("Orig before @ 0x%06x", from);
54 <    while (i<10){
55 <        len = Disasm(&MyDisasm);
56 <        if (len != UNKNOWN_OPCODE) {
57 <                        STARTUPMESSAGE("%s, Opcode: 0x%x, len: %d, branch: %d, to: 0x%06x", MyDisasm.CompleteInstr, MyDisasm.Instruction.Opcode, len, MyDisasm.Instruction.BranchType, MyDisasm.Instruction.AddrValue);
58 <                        STARTUPMESSAGE("    Cat: 0x%04x, prefix count: %d", MyDisasm.Instruction.Category & 0xffff, MyDisasm.Prefix.Number );
59 <            MyDisasm.EIP += (UIntPtr)len;
60 <            i++;
61 <        }
62 <    };
63 <    STARTUPMESSAGE("", 0);
46 >        STARTUPMESSAGE("Orig before", 0);
47 >        DDrPatch_PrintDisasm(from, 10, 0);
48   */
65
49          DISASM disasm;
50          memset(&disasm, 0, sizeof(DISASM));
51          disasm.EIP = (UIntPtr) from;
# Line 82 | Line 65 | void* DDrPatch_MakeDetour(void* from, vo
65                                  }
66                                  branches++;
67                                  int target = disasm.Instruction.AddrValue;
68 <                                bool targetInTrampoline = ((void*)disasm.Instruction.AddrValue - from) < 5;
68 >                                bool targetInTrampoline = ((void*)((int)disasm.Instruction.AddrValue) - from) < 5;
69                                  switch (disasm.Instruction.BranchType) {
70                                          case JmpType:
71                                          case CallType:
# Line 174 | Line 157 | void* DDrPatch_MakeDetour(void* from, vo
157                  return (void*)-1;
158          }
159          DDrPatch_MakeJump(from, to);
160 +
161   /*
162 <    memset (&MyDisasm, 0, sizeof(DISASM));
163 <    MyDisasm.EIP = (UIntPtr) trampoline;
164 <    i = 0;
165 <    STARTUPMESSAGE("Trampoline @ 0x%06x", trampoline);
166 <    while (i<10){
183 <        len = Disasm(&MyDisasm);
184 <        if (len != UNKNOWN_OPCODE) {
185 <            STARTUPMESSAGE("%s", MyDisasm.CompleteInstr);
186 <            MyDisasm.EIP += (UIntPtr)len;
187 <            i++;
188 <        }
189 <    };
190 <    STARTUPMESSAGE("", 0);
191 <    
192 <    memset (&MyDisasm, 0, sizeof(DISASM));
193 <    MyDisasm.EIP = disasm.EIP;
194 <    i = 0;
195 <    STARTUPMESSAGE("Orig after @ 0x%06x", disasm.EIP);
196 <    while (i<7){
197 <        len = Disasm(&MyDisasm);
198 <        if (len != UNKNOWN_OPCODE) {
199 <            STARTUPMESSAGE("%s", MyDisasm.CompleteInstr);
200 <            MyDisasm.EIP += (UIntPtr)len;
201 <            i++;
202 <        }
203 <    };
204 <    STARTUPMESSAGE("", 0);
205 <
206 <    memset (&MyDisasm, 0, sizeof(DISASM));
207 <    MyDisasm.EIP = (UIntPtr) from;
208 <    i = 0;
209 <    STARTUPMESSAGE("Orig start after @ 0x%06x", from);
210 <    while (i<3){
211 <        len = Disasm(&MyDisasm);
212 <        if (len != UNKNOWN_OPCODE) {
213 <            STARTUPMESSAGE("%s", MyDisasm.CompleteInstr);
214 <            MyDisasm.EIP += (UIntPtr)len;
215 <            i++;
216 <        }
217 <    };
218 <    STARTUPMESSAGE("", 0);
219 <    STARTUPMESSAGE("", 0);
220 <    STARTUPMESSAGE("", 0);
221 < */
162 >        STARTUPMESSAGE("Trampoline", 0);
163 >        DDrPatch_PrintDisasm(trampoline, 10, 6);
164 >
165 >        STARTUPMESSAGE("Orig after", 0);
166 >        DDrPatch_PrintDisasm(disasm.EIP, 7, 0);
167  
168 +        STARTUPMESSAGE("Orig start after", 0);
169 +        DDrPatch_PrintDisasm(from, 3, 6);
170 + */
171          return trampoline;
172   }
173  
# Line 279 | Line 227 | bool DDrPatch_Int16(short* dest, unsigne
227                  return false;
228   }
229  
230 < bool DDrPatch__strdup(int* dest, const char* value)
230 > bool DDrPatch_NOOP(char* dest, unsigned int length)
231   {
232          DWORD oldp;
233          
234 <        if (VirtualProtect(dest, 4, PAGE_EXECUTE_READWRITE, &oldp))
234 >        if (VirtualProtect(dest, length, PAGE_EXECUTE_READWRITE, &oldp))
235          {
236 <                *dest = (int)_strdup(value);
237 <                VirtualProtect(dest, 4, oldp, &oldp);
236 >                memset(dest, 0x90, length);
237 >                VirtualProtect(dest, length, oldp, &oldp);
238                  return true;
239          }
240          else
241                  return false;
242   }
243  
244 < bool DDrPatch_NOOP(char* dest, unsigned int length)
244 > void* DDrPatch_ExecutableASM(char* from, char* nextInst, const unsigned char* code, int length)
245   {
246 +        char* newCode = malloc(length+5);
247 +        if (!DDrPatch_NOOP(newCode, length+5))
248 +                return (void*)-1;
249 +
250 +        memcpy(newCode, code, length);
251 +        if (!DDrPatch_MakeJump(&newCode[length], nextInst))
252 +                return (void*)-1;
253 +
254          DWORD oldp;
255 <        
256 <        if (VirtualProtect(dest, length, PAGE_EXECUTE_READWRITE, &oldp))
257 <        {
302 <                memset(dest, 0x90, length);
303 <                VirtualProtect(dest, length, oldp, &oldp);
304 <                return true;
255 >        if (!VirtualProtect(newCode, length+5, PAGE_EXECUTE_READWRITE, &oldp)) {
256 >                STARTUPMESSAGE("ExecASM: Could not mark page for new code as executable: from address 0x%08x", from);
257 >                return (void*)-1;
258          }
259 <        else
260 <                return false;
259 >        
260 >        if (!DDrPatch_MakeJump(from, newCode))
261 >                return (void*)-1;
262 >
263 >        return newCode;
264   }
265 +
266 + void DDrPatch_PrintDisasm(void* addr, int instLimit, int sizeLimit)
267 + {
268 +        DISASM MyDisasm;
269 +        int len = 0;
270 +        int size = 0;
271 +        int i = 0;
272 +
273 +        memset(&MyDisasm, 0, sizeof(DISASM));
274 +
275 +        MyDisasm.EIP = (UIntPtr) addr;
276 +
277 +        STARTUPMESSAGE("", 0);
278 +        STARTUPMESSAGE("Disassembly @ 0x%06x", addr);
279 +
280 +        if (sizeLimit <= 0)
281 +                sizeLimit = 20 * instLimit;
282 +
283 +        while ((i < instLimit) && (size < sizeLimit)) {
284 +                len = Disasm(&MyDisasm);
285 +                if (len != UNKNOWN_OPCODE) {
286 +                        size += len;
287 +                        STARTUPMESSAGE("    %s, Opcode: 0x%x, len: %d, branch: %d, to: 0x%06x", MyDisasm.CompleteInstr, MyDisasm.Instruction.Opcode, len, MyDisasm.Instruction.BranchType, MyDisasm.Instruction.AddrValue);
288 +                        STARTUPMESSAGE("          Cat: 0x%04x, prefix count: %d", MyDisasm.Instruction.Category & 0xffff, MyDisasm.Prefix.Number );
289 +
290 +                        MyDisasm.EIP += (UIntPtr)len;
291 +                        i++;
292 +                }
293 +        };
294 +
295 +        STARTUPMESSAGE("", 0);
296 + }
297 +

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)