Began basic implementation of Rabi-Ribi module. [v1.75 compatibility]

Include basic memory reading functions and Rabi-Ribi program detection.
dev
sigonasr2 7 years ago
parent f86458f226
commit 322d83dcd1
  1. 2
      .classpath
  2. BIN
      lib/jna-4.5.0.jar
  3. BIN
      lib/jna-platform-4.5.0.jar
  4. 2
      projectBuilder.xml
  5. BIN
      sigIRCv2.jar
  6. 28
      src/sig/modules/RabiRibi/MemoryOffset.java
  7. 114
      src/sig/modules/RabiRibiModule.java
  8. 64
      src/sig/modules/utils/Module.java
  9. 81
      src/sig/modules/utils/MyKernel32.java
  10. 12
      src/sig/modules/utils/MyUser32.java
  11. 57
      src/sig/modules/utils/Psapi.java
  12. 104
      src/sig/modules/utils/PsapiTools.java
  13. 30
      src/sig/sigIRC.java
  14. 37
      src/sig/utils/MemoryUtils.java

@ -13,5 +13,7 @@
<classpathentry kind="lib" path="C:/Users/Joshua Sigona/git/sigIRCv2/lib/lwjgl-natives-linux.jar"/>
<classpathentry kind="lib" path="C:/Users/Joshua Sigona/git/sigIRCv2/lib/lwjgl-natives-macos.jar"/>
<classpathentry kind="lib" path="C:/Users/Joshua Sigona/git/sigIRCv2/lib/lwjgl-natives-windows.jar"/>
<classpathentry kind="lib" path="C:/Users/Joshua Sigona/git/sigIRCv2/lib/jna-4.5.0.jar"/>
<classpathentry kind="lib" path="C:/Users/Joshua Sigona/git/sigIRCv2/lib/jna-platform-4.5.0.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>

Binary file not shown.

Binary file not shown.

@ -23,6 +23,8 @@
<zipfileset excludes="META-INF/*.SF" src="lib/lwjgl-natives-linux.jar"/>
<zipfileset excludes="META-INF/*.SF" src="lib/lwjgl-natives-windows.jar"/>
<zipfileset excludes="META-INF/*.SF" src="lib/lwjgl-natives-macos.jar"/>
<zipfileset excludes="META-INF/*.SF" src="lib/jna-4.5.0.jar"/>
<zipfileset excludes="META-INF/*.SF" src="lib/jna-platform-4.5.0.jar"/>
</jar>
</target>
</project>

Binary file not shown.

@ -0,0 +1,28 @@
package sig.modules.RabiRibi;
public enum MemoryOffset {
MONEY(0xD654CC),
PLAYTIME(0xD642D8), //In frames (Rabi-Ribi runs at 60FPS).
UNKNOWN1(0xD65BDC), //???? Originally assumed to be "Health Ups".
HEALTHUP_START(0xD6342C),
HEALTHUP_END(0xD63528),
ATTACKUP_START(0xD6352C),
ATTACKUP_END(0xD63628),
MANAUP_START(0xD6362C),
MANAUP_END(0xD63728),
REGENUP_START(0xD6372C),
REGENUP_END(0xD63828),
PACKUP_START(0xD6382C),
PACKUP_END(0xD63928),
;
long offset;
MemoryOffset(long offset) {
this.offset=offset;
}
public long getOffset() {
return offset;
}
}

@ -0,0 +1,114 @@
package sig.modules;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.geom.Rectangle2D;
import java.util.List;
import com.sun.jna.Memory;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.WinNT;
import com.sun.jna.platform.win32.WinNT.HANDLE;
import sig.Module;
import sig.sigIRC;
import sig.modules.RabiRibi.MemoryOffset;
import sig.modules.utils.PsapiTools;
import sig.utils.DrawUtils;
public class RabiRibiModule extends Module{
final int PROCESS_PERMISSIONS = WinNT.PROCESS_QUERY_INFORMATION | WinNT.PROCESS_VM_READ;
boolean foundRabiRibi = false;
int rabiRibiPID = -1;
long rabiRibiMemOffset = 0;
HANDLE rabiribiProcess = null;
public RabiRibiModule(Rectangle2D bounds, String moduleName) {
super(bounds, moduleName);
//Initialize();
Initialize();
//System.out.println("Money value is: "+readIntFromMemory(MemoryOffset.MONEY));
}
private void Initialize() {
List<Integer> pids;
try {
pids = PsapiTools.getInstance().enumProcesses();
for (Integer pid : pids) {
HANDLE process = Kernel32.INSTANCE.OpenProcess(PROCESS_PERMISSIONS, true, pid);
List<sig.modules.utils.Module> hModules;
try {
hModules = PsapiTools.getInstance().EnumProcessModules(process);
for(sig.modules.utils.Module m: hModules){
//System.out.println(m.getFileName()+":"+m.getEntryPoint());
if (m.getFileName().contains("rabiribi")) {
rabiRibiMemOffset = Pointer.nativeValue(m.getLpBaseOfDll().getPointer());
System.out.println("Found an instance of Rabi-Ribi at 0x"+Long.toHexString(rabiRibiMemOffset));
rabiRibiPID=pid;
foundRabiRibi=true;
rabiribiProcess=process;
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
if (foundRabiRibi) {
break;
}
if (process!=null) {
Kernel32.INSTANCE.CloseHandle(process);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void ApplyConfigWindowProperties() {
sigIRC.rabiribimodule_X=(int)position.getX();
sigIRC.rabiribimodule_Y=(int)position.getY();
sigIRC.config.setInteger("RABIRIBI_module_X", sigIRC.rabiribimodule_X);
sigIRC.config.setInteger("RABIRIBI_module_Y", sigIRC.rabiribimodule_Y);
}
public void run() {
super.run();
}
public void draw(Graphics g) {
super.draw(g);
int i=32;
DrawUtils.drawOutlineText(g, sigIRC.panel.programFont, position.getX(), position.getY()+(i+=24), 3, Color.BLACK, Color.WHITE, "Money: "+readIntFromMemory(MemoryOffset.MONEY));
DrawUtils.drawOutlineText(g, sigIRC.panel.programFont, position.getX(), position.getY()+(i+=24), 3, Color.BLACK, Color.WHITE, "H-Ups: "+readItemCountFromMemory(MemoryOffset.HEALTHUP_START,MemoryOffset.HEALTHUP_END));
DrawUtils.drawOutlineText(g, sigIRC.panel.programFont, position.getX(), position.getY()+(i+=24), 3, Color.BLACK, Color.WHITE, "A-Ups: "+readItemCountFromMemory(MemoryOffset.ATTACKUP_START,MemoryOffset.ATTACKUP_END));
DrawUtils.drawOutlineText(g, sigIRC.panel.programFont, position.getX(), position.getY()+(i+=24), 3, Color.BLACK, Color.WHITE, "M-Ups: "+readItemCountFromMemory(MemoryOffset.MANAUP_START,MemoryOffset.MANAUP_END));
DrawUtils.drawOutlineText(g, sigIRC.panel.programFont, position.getX(), position.getY()+(i+=24), 3, Color.BLACK, Color.WHITE, "R-Ups: "+readItemCountFromMemory(MemoryOffset.REGENUP_START,MemoryOffset.REGENUP_END));
DrawUtils.drawOutlineText(g, sigIRC.panel.programFont, position.getX(), position.getY()+(i+=24), 3, Color.BLACK, Color.WHITE, "P-Ups: "+readItemCountFromMemory(MemoryOffset.PACKUP_START,MemoryOffset.PACKUP_END));
}
int readIntFromMemory(long offset) {
Memory mem = new Memory(4);
Kernel32.INSTANCE.ReadProcessMemory(rabiribiProcess, new Pointer(rabiRibiMemOffset+offset), mem, 4, null);
return mem.getInt(0);
}
int readIntFromMemory(MemoryOffset val) {
Memory mem = new Memory(4);
Kernel32.INSTANCE.ReadProcessMemory(rabiribiProcess, new Pointer(rabiRibiMemOffset+val.getOffset()), mem, 4, null);
return mem.getInt(0);
}
int readItemCountFromMemory(MemoryOffset start_range,
MemoryOffset end_range) {
int count=0;
for (long i=start_range.getOffset();i<=end_range.getOffset();i++) {
if (readIntFromMemory(i)==1) {
count++;
}
}
return count;
}
}

@ -0,0 +1,64 @@
package sig.modules.utils;
import sig.modules.utils.Psapi.LPMODULEINFO;
import com.sun.jna.platform.win32.WinDef.HMODULE;
import com.sun.jna.platform.win32.WinNT.HANDLE;
public class Module {
private HANDLE hProcess;
private HMODULE hModule;
private HANDLE lpBaseOfDll = null;
private int SizeOfImage = 0;
private HANDLE EntryPoint = null;
private PsapiTools psapi = PsapiTools.getInstance();
protected Module() {
}
public Module(HANDLE hProcess, HMODULE hModule) {
this.hProcess = hProcess;
this.hModule = hModule;
}
public HMODULE getPointer() {
return hModule;
}
public String getFileName() {
return psapi.GetModuleFileNameExA(hProcess, hModule);
}
public String getBaseName() {
return psapi.GetModuleBaseNameA(hProcess, hModule);
}
private void GetModuleInformation() {
if (lpBaseOfDll == null) {
try {
LPMODULEINFO x = psapi.GetModuleInformation(hProcess, hModule);
lpBaseOfDll = x.lpBaseOfDll;
SizeOfImage = x.SizeOfImage;
EntryPoint = x.EntryPoint;
} catch (Exception e) {
e.printStackTrace();
}
}
}
public HANDLE getLpBaseOfDll() {
GetModuleInformation();
return lpBaseOfDll;
}
public int getSizeOfImage() {
GetModuleInformation();
return SizeOfImage;
}
public HANDLE getEntryPoint() {
GetModuleInformation();
return EntryPoint;
}
}

@ -0,0 +1,81 @@
package sig.modules.utils;
import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.ptr.IntByReference;
public interface MyKernel32 extends Kernel32 {
final Kernel32 INSTANCE = (Kernel32) Native.loadLibrary ("kernel32", Kernel32.class);
// BOOL WINAPI WriteProcessMemory(
// __in HANDLE hProcess,
// __in LPVOID lpBaseAddress,
// __in LPCVOID lpBuffer,
// __in SIZE_T nSize,
// __out SIZE_T *lpNumberOfBytesWritten
// );
boolean WriteProcessMemory(HANDLE p, int address, HANDLE buffer, int size, IntByReference written);
// BOOL WINAPI ReadProcessMemory(
// __in HANDLE hProcess,
// __in LPCVOID lpBaseAddress,
// __out LPVOID lpBuffer,
// __in SIZE_T nSize,
// __out SIZE_T *lpNumberOfBytesRead
// );
boolean ReadProcessMemory(HANDLE hProcess, int inBaseAddress, Memory outputBuffer, int nSize, IntByReference outNumberOfBytesRead);
// HANDLE WINAPI OpenProcess(
// __in DWORD dwDesiredAccess,
// __in BOOL bInheritHandle,
// __in DWORD dwProcessId
// );
HANDLE OpenProcess(int desired, boolean inherit, int pid);
// BOOL WINAPI EnumProcessModules(
// _In_ HANDLE hProcess,
// _Out_ HMODULE *lphModule,
// _In_ DWORD cb,
// _Out_ LPDWORD lpcbNeeded
// );
boolean EnumProcessModules(HANDLE hProcess, HMODULE lphModule, int cb, int lpcbNeeded);
// DWORD WINAPI GetModuleFileName(
// _In_opt_ HMODULE hModule,
// _Out_ LPTSTR lpFilename,
// _In_ DWORD nSize
// );
int GetModuleFileName(HMODULE hModule, String lpFilename, int size);
// DWORD WINAPI GetModuleFileNameEx(
// _In_ HANDLE hProcess,
// _In_opt_ HMODULE hModule,
// _Out_ LPTSTR lpFilename,
// _In_ DWORD nSize
// );
// BOOL WINAPI GetModuleHandleEx(
// _In_ DWORD dwFlags,
// _In_opt_ LPCTSTR lpModuleName,
// _Out_ HMODULE *phModule
// );
int GetModuleHandleExA(int permissions, String lpFilename, HMODULE module);
// BOOL WINAPI EnumProcesses(
// _Out_ DWORD *pProcessIds,
// _In_ DWORD cb,
// _Out_ DWORD *pBytesReturned
// );
boolean EnumProcesses(int[] processIds, int cb, int bytesReturned);
int GetLastError();
}

@ -0,0 +1,12 @@
package sig.modules.utils;
import com.sun.jna.Native;
import com.sun.jna.platform.win32.User32;
public interface MyUser32 extends User32 {
final User32 INSTANCE = (User32) Native.loadLibrary ("user32", User32.class);
boolean ShowWindow(HWND hWnd, int nCmdShow);
boolean SetForegroundWindow(HWND hWnd);
HWND FindWindowA(String lpClassName, String lpWindowName);
}

@ -0,0 +1,57 @@
package sig.modules.utils;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Native;
import com.sun.jna.Structure;
import com.sun.jna.platform.win32.WinDef.HMODULE;
import com.sun.jna.platform.win32.WinNT.HANDLE;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.win32.StdCallLibrary;
public interface Psapi extends StdCallLibrary{
Psapi INSTANCE = (Psapi) Native.loadLibrary("Psapi", Psapi.class);
/*
* http://msdn.microsoft.com/en-us/library/ms682629(VS.85).aspx
*/
boolean EnumProcesses(int[] pProcessIds, int cb, IntByReference pBytesReturned);
/*
* http://msdn.microsoft.com/en-us/library/ms682631(VS.85).aspx
*/
boolean EnumProcessModules(HANDLE hProcess, HMODULE[] lphModule, int cb, IntByReference lpcbNeededs);
boolean EnumProcessModulesEx(HANDLE hProcess, HMODULE[] lphModule, int cb, IntByReference lpcbNeededs, int flags);
/*
* http://msdn.microsoft.com/en-us/library/ms683198(VS.85).aspx
*/
int GetModuleFileNameExA(HANDLE hProcess, HMODULE hModule, byte[] lpImageFileName, int nSize);
int GetModuleBaseNameA(HANDLE hProcess, HMODULE hModule, byte[] lpImageFileName, int nSize);
/*
* http://msdn.microsoft.com/en-us/library/ms684229(VS.85).aspx
*/
public static class LPMODULEINFO extends Structure {
public HANDLE lpBaseOfDll;
public int SizeOfImage;
public HANDLE EntryPoint;
@Override
protected List getFieldOrder() {
return Arrays.asList(new String[] { "lpBaseOfDll", "SizeOfImage", "EntryPoint"});
}
}
/*
* http://msdn.microsoft.com/en-us/library/ms683201(VS.85).aspx
*/
boolean GetModuleInformation(HANDLE hProcess, HMODULE hModule, LPMODULEINFO lpmodinfo, int cb);
}

@ -0,0 +1,104 @@
package sig.modules.utils;
import java.util.LinkedList;
import java.util.List;
import sig.modules.utils.Psapi.LPMODULEINFO;
import com.sun.jna.Native;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.WinDef.HMODULE;
import com.sun.jna.platform.win32.WinNT.HANDLE;
import com.sun.jna.ptr.IntByReference;
public class PsapiTools {
private static PsapiTools INSTANCE=null;
private static Psapi psapi = Psapi.INSTANCE;
private static Kernel32 k32 = MyKernel32.INSTANCE;
private PsapiTools(){}
public static PsapiTools getInstance(){
if (INSTANCE==null)
INSTANCE=new PsapiTools();
return INSTANCE;
}
public List<Integer> enumProcesses() throws Exception{
List<Integer> list = new LinkedList<Integer>();
int[] pProcessIds = new int[1024];
IntByReference pBytesReturned = new IntByReference();
boolean success = psapi.EnumProcesses(pProcessIds, pProcessIds.length*Integer.SIZE/8, pBytesReturned);
if (!success){
int err=k32.GetLastError();
throw new Exception("EnumProcesses failed. Error: "+err);
}
int size = (pBytesReturned.getValue()/(Integer.SIZE/8));
for (int i=0;i<size;i++)
list.add(pProcessIds[i]);
return list;
}
public List<Module> EnumProcessModules(HANDLE hProcess) throws Exception{
List<Module> list = new LinkedList<Module>();
HMODULE[] lphModule = new HMODULE[1024];
IntByReference lpcbNeededs= new IntByReference();
boolean success = psapi.EnumProcessModules(hProcess, lphModule, lphModule.length, lpcbNeededs);
if (!success){
int err=k32.GetLastError();
if (err!=6) {
throw new Exception("EnumProcessModules failed. Error: "+err);
}
}
for (int i = 0; i < lpcbNeededs.getValue()/4; i++) {
list.add(new Module(hProcess, lphModule[i]));
}
return list;
}
public List<Module> EnumProcessModulesEx(HANDLE hProcess, int flags) throws Exception{
List<Module> list = new LinkedList<Module>();
HMODULE[] lphModule = new HMODULE[1024];
IntByReference lpcbNeededs= new IntByReference();
boolean success = psapi.EnumProcessModulesEx(hProcess, lphModule, lphModule.length, lpcbNeededs, flags);
if (!success){
int err=k32.GetLastError();
throw new Exception("EnumProcessModules failed. Error: "+err);
}
for (int i = 0; i < lpcbNeededs.getValue()/4; i++) {
list.add(new Module(hProcess, lphModule[i]));
}
return list;
}
public String GetModuleFileNameExA(HANDLE hProcess, HMODULE hModule){
byte[] lpImageFileName= new byte[256];
psapi.GetModuleFileNameExA(hProcess, hModule, lpImageFileName, 256);
return Native.toString(lpImageFileName);
}
public String GetModuleBaseNameA(HANDLE hProcess, HMODULE hModule){
byte[] lpImageFileName= new byte[256];
psapi.GetModuleBaseNameA(hProcess, hModule, lpImageFileName, 256);
return Native.toString(lpImageFileName);
}
public LPMODULEINFO GetModuleInformation(HANDLE hProcess, HMODULE hModule) throws Exception{
LPMODULEINFO lpmodinfo = new LPMODULEINFO();
boolean success = psapi.GetModuleInformation(hProcess, hModule, lpmodinfo, lpmodinfo.size());
if (!success){
int err=k32.GetLastError();
throw new Exception("GetModuleInformation failed. Error: "+err);
}
return lpmodinfo;
}
}

@ -12,15 +12,28 @@ import com.mb3364.twitch.api.handlers.ChannelResponseHandler;
import com.mb3364.twitch.api.handlers.StreamResponseHandler;
import com.mb3364.twitch.api.models.Channel;
import com.mb3364.twitch.api.models.Stream;
import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.Advapi32;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.WinDef.DWORD;
import com.sun.jna.platform.win32.WinNT;
import com.sun.jna.platform.win32.WinNT.HANDLE;
import com.sun.jna.platform.win32.WinNT.HANDLEByReference;
import sig.modules.ChatLogModule;
import sig.modules.ControllerModule;
import sig.modules.RabiRibiModule;
import sig.modules.TouhouMotherModule;
import sig.modules.TwitchModule;
import sig.modules.ChatLog.ChatLogMessage;
import sig.modules.ChatLog.ChatLogTwitchEmote;
import sig.modules.utils.MyKernel32;
import sig.modules.utils.PsapiTools;
import sig.utils.FileUtils;
import sig.utils.GithubUtils;
import sig.utils.MemoryUtils;
import sig.utils.TextUtils;
import java.awt.Color;
@ -116,6 +129,11 @@ public class sigIRC{
public static int chatlogmodule_height=312;
public static int chatlogmodule_X=0;
public static int chatlogmodule_Y=312;
public static int rabiribimodule_width=320;
public static int rabiribimodule_height=312;
public static int rabiribimodule_X=0;
public static int rabiribimodule_Y=312;
public static boolean rabiribimodule_enabled=true;
public static int chatlogMessageHistory=50;
public static boolean controllermodule_enabled=true;
public static int controllermodule_width=320;
@ -186,6 +204,11 @@ public class sigIRC{
touhoumothermodule_Y = config.getInteger("TOUHOUMOTHER_module_Y",312);
touhoumothermodule_width = config.getInteger("TOUHOUMOTHER_module_width",320);
touhoumothermodule_height = config.getInteger("TOUHOUMOTHER_module_height",312);
rabiribimodule_X = config.getInteger("RABIRIBI_module_X",0);
rabiribimodule_Y = config.getInteger("RABIRIBI_module_Y",312);
rabiribimodule_width = config.getInteger("RABIRIBI_module_width",320);
rabiribimodule_height = config.getInteger("RABIRIBI_module_height",312);
rabiribimodule_enabled = config.getBoolean("Module_rabiribi_Enabled", false);
chatlogmodule_X = config.getInteger("CHATLOG_module_X",0);
chatlogmodule_Y = config.getInteger("CHATLOG_module_Y",312);
chatlogmodule_width = config.getInteger("CHATLOG_module_width",320);
@ -332,6 +355,13 @@ public class sigIRC{
"Controller"
));
}
if (rabiribimodule_enabled) {
modules.add(new RabiRibiModule(
new Rectangle(rabiribimodule_X,rabiribimodule_Y,rabiribimodule_width,rabiribimodule_height),
"Rabi-Ribi"
));
}
}
private static void InitializeCustomSounds() {

@ -0,0 +1,37 @@
package sig.utils;
import com.sun.jna.Native;
import com.sun.jna.platform.win32.Advapi32;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.WinNT;
import com.sun.jna.platform.win32.WinDef.DWORD;
import com.sun.jna.platform.win32.WinNT.HANDLEByReference;
public class MemoryUtils {
/**
* Enables debug privileges for this process, required for OpenProcess() to
* get processes other than the current user
*/
public static void enableDebugPrivilege() {
HANDLEByReference hToken = new HANDLEByReference();
boolean success = Advapi32.INSTANCE.OpenProcessToken(Kernel32.INSTANCE.GetCurrentProcess(),
WinNT.TOKEN_QUERY | WinNT.TOKEN_ADJUST_PRIVILEGES, hToken);
if (!success) {
System.out.println("OpenProcessToken failed. Error: {}" + Native.getLastError());
return;
}
WinNT.LUID luid = new WinNT.LUID();
success = Advapi32.INSTANCE.LookupPrivilegeValue(null, WinNT.SE_DEBUG_NAME, luid);
if (!success) {
System.out.println("LookupprivilegeValue failed. Error: {}" + Native.getLastError());
return;
}
WinNT.TOKEN_PRIVILEGES tkp = new WinNT.TOKEN_PRIVILEGES(1);
tkp.Privileges[0] = new WinNT.LUID_AND_ATTRIBUTES(luid, new DWORD(WinNT.SE_PRIVILEGE_ENABLED));
success = Advapi32.INSTANCE.AdjustTokenPrivileges(hToken.getValue(), false, tkp, 0, null, null);
if (!success) {
System.out.println("AdjustTokenPrivileges failed. Error: {}" + Native.getLastError());
}
Kernel32.INSTANCE.CloseHandle(hToken.getValue());
}
}
Loading…
Cancel
Save