Re: Get ASCII value for character when higher than 127
On 31 mei, 19:25, Alex Blekhman <x...@oohay.moc> wrote:
You're welcome. I'm glad it helped. :)
Hi again, I'm afraid I need a little bit of help just one more time :-
(
For a while, I thought everything worked fine, but now I'm running
into a really weird problem. In some cases, the XOR on the '\0'
character is not done correctly, with the result that I get a
different (not readable) character back in C# in stead of a '\0'. This
happens for some ending characters, not all.
When my password is 10 characters long, and the last character is H or
less, the password seems to come through to C# ok all the time (I've
tried different endinng characters), if the last character is an I or
higher, the \'0' character is converted wrong.
With a password of 9 characters long, the conversion to C# seems to go
ok all the time, when the password is 11 characters long, it seems
random for which character is goes ok and which one not.
Some passwords I've tried so far:
The one's that come in C# ok:
122AABBcH
122AABBcI
11223AABBcI
1122AABBcH
not OK:
11223AABBcH
1122AABBcI
I have no idea what the problem is, can someone please help me with
this??? That would be really great. Below is my latest C++ and C#
code. Any help would be greatly appreciated!!
Thanks again!!
Sandra
===================================
C++ code:
// PwdHookNew.cpp : Defines the initialization routines for the DLL.
#include <windows.h>
#include <ntsecapi.h>
#include <time.h>
#include <fstream>
#include <iostream>
#include "PwdHookNew.h"
#include <sstream>
#include <string>
#include <iomanip>
#include <valarray>
using std::valarray;
using namespace std;
#ifndef STATUS_SUCCESS
#define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
#endif
string GetPwdFilePath()
{
const char* timeStringFormat = "%Y-%m-%d_%H-%M-%S";
const size_t timeStringLength = 20;
char timeString[timeStringLength] = { 0 };
time_t t = time(0);
tm *curTime = localtime(&t);
strftime(timeString, timeStringLength,
timeStringFormat, curTime);
string path("C:\\PwdSync\\pwds\\");
path.append(timeString);
path.append(".pwd");
free(timeString);
return path;
}
string GetLogFilePath()
{
const char* timeStringFormat = "%Y%m%d";
const size_t timeStringLength = 20;
char timeString[timeStringLength] = { 0 };
time_t t = time(0);
tm *curTime = localtime(&t);
strftime(timeString, timeStringLength,
timeStringFormat, curTime);
string path("C:\\PwdSync\\log\\pwdlog_");
path.append(timeString);
path.append(".txt");
free(timeString);
return path;
}
int GetNextXORVal(int prevXORVal)
{
if (prevXORVal==42)
{
return 35;
}
else if (prevXORVal==35)
{
return 13;
}
else if (prevXORVal==13)
{
return 21;
}
else
{
return 42;
}
}
string ObfuscateUnicodeString(LPCWSTR pwszIn, USHORT nLen)
{
ostringstream oss;
oss << right;
int k = GetNextXORVal(0);
for(size_t i = 0; i < nLen; ++i)
{
int ch = pwszIn[i]^k;
k = GetNextXORVal(k) ;
oss << setw(7) << setfill('0') << ch;
}
string result = oss.str();
oss.clear();
return result;
}
void WriteMessage(
const string& path,
const string& username,
const string& password,
const string& seperator
)
{
ofstream outPwd(path.c_str());
outPwd << username << seperator << password ;
outPwd.close();
}
void WriteLogMessage(
const string& path,
const string& logmsg,
const string username
)
{
const char* timeStringFormat = "%H:%M:%S";
const size_t timeStringLength = 20;
char timeString[timeStringLength] = { 0 };
time_t t = time(0);
tm *curTime = localtime(&t);
strftime(timeString, timeStringLength,
timeStringFormat, curTime);
ofstream outPwd(path.c_str(), ios::app);
if (!outPwd)
{
ofstream outPwd(path.c_str(), ios::out );
}
outPwd << timeString << " - " << logmsg << username << "\n";
outPwd.close();
free(timeString);
}
/*++
Routine Description:
This (optional) routine is notified of a password change.
Arguments:
UserName - Name of user whose password changed
RelativeId - RID of the user whose password changed
NewPassword - Cleartext new password for the user
Return Value:
STATUS_SUCCESS only - errors from packages are ignored.
--*/
NTSTATUS
NTAPI
PasswordChangeNotify(
PUNICODE_STRING UserName,
ULONG RelativeId,
PUNICODE_STRING Password
)
{
char *usernameStr;
usernameStr = (char*)calloc(1, (UserName->Length/2)+1);
wcstombs(usernameStr, UserName->Buffer, (UserName->Length/2));
const string& logpath = GetLogFilePath();
WriteLogMessage(logpath, "Received pwd reset for user ",
usernameStr);
WCHAR wszSeperator[] = L"pwdhook";
UNICODE_STRING Seperator = { 8, 10, wszSeperator };
PUNICODE_STRING PSeperator = &Seperator;
const string& username = ObfuscateUnicodeString(UserName->Buffer,
(UserName->Length /2) + 1);
const string& password = ObfuscateUnicodeString(Password->Buffer,
(Password->Length /2) + 1);
const string& seperator = ObfuscateUnicodeString(PSeperator-
Buffer, PSeperator->Length);
const string& path = GetPwdFilePath();
WriteMessage(path, username, password, seperator);
WriteLogMessage(logpath, "Finished handling pwd reset for user ",
usernameStr);
free(usernameStr);
return STATUS_SUCCESS;
}
=======================================================
C# code:
using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using PwdSyncClasses.BholdScriptService;
using System.Collections;
using NOAUtils;
using System.Data.SqlClient;
namespace PwdSyncClasses
{
public class PwdSyncer
{
private PwdSyncConfig _config = null;
public PwdSyncer(PwdSyncConfig config)
{
_config = config;
}
private string GetLineFromFile(string filename)
{
StreamReader rdr = new StreamReader(filename);
string line = rdr.ReadToEnd();
rdr.Close();
return line;
}
private string GetCleanString(string rawstr)
{
while (rawstr.StartsWith("\0"))
{
rawstr = rawstr.Substring(1);
}
int pos = rawstr.IndexOf("\0");
if (pos > -1)
{
return rawstr.Substring(0, pos);
}
else
{
return rawstr;
}
}
private bool GetUserAndPwdFromLine(string line, ref string
usr, ref string pwd)
{
try
{
string encryptedSep = CreateUnicodeString("pwdhook
\0");
int pos = line.IndexOf(encryptedSep);
string encryptedusr = line.Substring(0, pos);
string encryptedpwd = line.Substring(pos +
encryptedSep.Length);
string rawusr = RestoreUnicodeString(encryptedusr);
string rawpwd = RestoreUnicodeString(encryptedpwd);
usr = GetCleanString(rawusr);
pwd = GetCleanString(rawpwd);
return true;
}
catch (Exception ex)
{
string x = ex.Message;
return false;
}
}
private ArrayList GetFileNames()
{
ArrayList files = new ArrayList();
foreach (string filename in
Directory.GetFiles(_config.PwdPath))
{
if (filename.EndsWith(".pwd"))
{
files.Add(filename);
}
}
files.Sort();
return files;
}
public void ProcessPwds()
{
//temp
ArrayList files = GetFileNames();
string line = "";
string usr = "";
string pwd = "";
string filename = "";
for (int i = 0; i < files.Count; i++)
{
bool doDelete = false;
filename = files[i].ToString();
line = GetLineFromFile(filename);
usr = "";
pwd = "";
if (GetUserAndPwdFromLine(line, ref usr, ref pwd))
{
\\do something with usr adn pwd
}
}
files.Clear();
files = null;
}
private int GetNextXORValue(int currentXORValue)
{
if (currentXORValue == 42)
{
return 35;
}
else if (currentXORValue == 35)
{
return 13;
}
else if (currentXORValue == 13)
{
return 21;
}
else
{
return 42;
}
}
private string RestoreUnicodeString(string sIn)
{
int nrOfNums = 7;
string sOut = string.Empty;
string intvalue = string.Empty;
int beginpos = 0;
int k = 42;
while (beginpos < sIn.Length-1)
{
intvalue = sIn.Substring(beginpos, nrOfNums);
int nCh = System.Convert.ToInt32(intvalue) ^ k;
sOut += System.Convert.ToChar(nCh);
k = GetNextXORValue(k);
beginpos += nrOfNums;
}
return sOut;
}
private string CreateUnicodeString(string sIn)
{
int nrOfNums = 7;
string retval = string.Empty;
char[] encryptArray = sIn.ToCharArray();
char currentChar;
int k = 42;
int len = encryptArray.Length;
for (int i=0; i < len; i++)
{
currentChar = Convert.ToChar(encryptArray[i] ^ k);
string intval = ((int)currentChar).ToString();
while (intval.Length < nrOfNums)
{
intval = "0" + intval;
}
retval += intval;
k = GetNextXORValue(k);
}
return retval;
}
}
}