Сканирование памяти через AA [En]
-
Tutorials: Custom Scan: Multiply by 8
This tutorial will try to give an example of the usage of the custom scan:
For some reason people still want to do this, so here's a custom scan script that will multiply the value you give by 8, and show the result divided by 8
Address list still shows it in the normal undivided way thoughHow to use:
Select value type custom, click new, fill in the below script, click ok, give it a name, and scan for the value you wantCode:
[enable] {do not change the allocnames of the following code, you are free to add new allocs though of course then don't forget to dealloc them at [disable] as well} alloc(checkroutine,2048) alloc(prologue,2048) alloc(epilogue,2048) alloc(fastscanstepsize,4) alloc(variablesize,4) alloc(firstscan,4) alloc(scantext,4) //will get the pointer to the given string alloc(scanvalue,8) //will get the value of the input string converted to an 8-byte value alloc(singlescanvalue,4) //will get the float type of the input alloc(doublescanvalue,8) //will get the double type of the input alloc(inttostr,1024) variablesize: dd 4 //defines how many bytes get saved for each found result fastscanstepsize: dd 1 //defines the stepsize when using fastscan (1=no difference) firstscan: dd 0 //set to 1 if you want the old value to be that of the first scan /* routines: Hint: You can write these routines in any language you like and export them as dll's. Then use loadlibraty and call exportfunction to use them*/ checkroutine: /* edx=pointer to new value ecx=pointer to old value */ mov eax,[edx] //eax gets the new value cmp eax,[scanvalue] //compare eax with the users input setz al //sets al to 1 if match, 0 if false (upper bits of eax are ignored) ret prologue: shl [scanvalue],3 //You can put some code here that gets executed BEFORE the scan starts ret epilogue: //You can put some code here that gets executed AFTER the scan finishes ret scandisplayroutinetype: /* displayroutinetype is a 'special' globally registered symbol (No need to alloc) The byte at this address specifies how the values are shown 0=1 byte notation 1=2 byte notation 2=4 byte notation 3=8 byte notation 4=float notation 5=double notation 6=array of bytes 7=string ascii 8=string unicode ff=use 'scandisplayroutine:' to convert the data to a string */ db ff //2=4 byte notation label(inttostr_loop) label(inttostr_reverseresult) alloc(tempinttostrbuf,50) inttostr: //input: //eax=value //edi=storage space for string push ecx push edx push edi push esi mov esi,tempinttostrbuf mov ecx,#10 inttostr_loop: xor edx,edx div ecx add dl,'0' mov [esi],dl inc esi cmp eax,0 jne inttostr_loop //now reverse the result dec esi inttostr_reverseresult: mov al,[esi] mov byte [edi],al inc edi dec esi cmp esi,tempinttostrbuf //back at base ? jae inttostr_reverseresult mov byte [edi],0 pop esi pop edi pop edx pop ecx ret scandisplayroutine: /* displayroutine is a 'special' globally registered symbol (No need to alloc) if 'scandisplayroutinetype:' is set to 255 then this routine will be called to convert the value at the address specified to a ascii-string eax=pointer to bytes at the address edx=pointer to destination string (max 50 chars) note: scandisplayroutine is only 16KB big */ push eax push edi mov eax,[eax] shr eax,3 mov edi,edx call inttostr pop edi pop eax ret [disable] dealloc(checkroutine) dealloc(prologue,2048) dealloc(epilogue,2048) dealloc(fastscanstepsize) dealloc(variablesize) dealloc(scantext) dealloc(scanvalue) dealloc(singlescanvalue) dealloc(doublescanvalue) dealloc(inttostr) dealloc(tempinttostrbuf)
-